Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP MySQLI Предотвратяване на SQL инжекция

Всяка заявка може да бъде инжектирана, независимо дали е за четене или запис, постоянна или преходна. Инжекциите могат да се извършват чрез прекратяване на една заявка и изпълнение на отделна (възможно с mysqli ), което прави предвидената заявка неуместна.

Всеки вход към заявка от външен източник, независимо дали е от потребители или дори вътрешен, трябва да се счита за аргумент на заявката и за параметър в контекста на заявката. Всеки параметър в заявка трябва да бъде параметризиран. Това води до правилно параметризирана заявка, от която можете да създадете подготвен израз и да изпълните с аргументи. Например:

SELECT col1 FROM t1 WHERE col2 = ?

? е заместител за параметър. Използване на mysqli , можете да създадете подготвен израз с помощта на prepare , свържете променлива (аргумент) към параметър с помощта на bind_param и стартирайте заявката с execute . Изобщо не е нужно да санирате аргумента (всъщност е вредно да го направите). mysqli прави това за вас. Пълният процес би бил:

$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

Съществува също така важна разлика между параметризирана заявка и подготвено изявление . Това изявление, докато е подготвено, не е параметризирано и следователно е уязвимо за инжектиране:

$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

За да обобщим:

  • Всички Заявките трябва да бъдат правилно параметризирани (освен ако нямат параметри)
  • Всички аргументите към заявка трябва да се третират възможно най-враждебни, независимо от източника им



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам MySQLdb с Python и Django в OSX 10.6?

  2. MYSQL Изберете MAX дата в израза за присъединяване

  3. Грешка при изпращане на пакет QUERY

  4. ScaleGrid DBaaS разширява MySQL хостинг услугите чрез AWS Cloud

  5. Как да намеря всички таблици, които имат външни ключове, които препращат към определена table.column и имат стойности за тези външни ключове?