Използването на обвързани параметри е достатъчно в общи случаи и е добра практика за избягване на SQL инжектиране.
Но параметър в подготвен оператор може да се използва само за стойност в SQL израз. С други думи, където обикновено бихте написали литерал на низ в кавички, литерал на дата в кавички или числов литерал. И един параметър ==една стойност (без списъци).
Трябва да използвате обвързани параметри за тези случаи. Ако задавате този въпрос, защото смятате, че може да искате да пропуснете използването на обвързани параметри, ако някой отговори, че те не са достатъчни, тогава съжаляваме, няма да бъдете извинени от защитени практики за програмиране.
Има обаче други (може би по-редки) случаи, при които обвързаните параметри не работят. Ако трябва да напишете заявка с име на динамична таблица, име на колона или друг идентификатор, или цял израз, или SQL ключова дума, тогава ви е необходим друг метод. Тези случаи трябва да бъдат коригирани в SQL синтаксиса при prepare време, така че не могат да бъдат параметризирани.
Например, ето заявка с динамични части, обозначени с използване на променливи, които не могат да бъдат параметри:
$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";
Трябва да използвате бял списък за тези случаи . С други думи, уверете се, че низ, който интерполирате във вашата заявка като име на динамична таблица, всъщност е една от таблиците, които съществуват във вашата база данни. Уверете се, че SQL ключовите думи са легитимни ключови думи.
Никога вземете потребителското въвеждане дословно и го интерполирайте в SQL (или всеки друг код, който се анализира по време на изпълнение, като аргумента, който подавате към eval()
или shellexec()
). И не само въведеното от потребителя може да бъде опасно съдържание.
Вижте също моята презентация Митове и заблуди за SQL инжектиране за повече обяснения.