Всяка заявка може да бъде инжектирана, независимо дали е за четене или запис, постоянна или преходна. Инжекциите могат да се извършват чрез прекратяване на една заявка и изпълнение на отделна (възможно с 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])");
За да обобщим:
- Всички Заявките трябва да бъдат правилно параметризирани (освен ако нямат параметри)
- Всички аргументите към заявка трябва да се третират възможно най-враждебни, независимо от източника им