Строго погледнато, всъщност няма нужда от екраниране, тъй като стойността на параметъра никога не се интерполира в низа на заявката.
Начинът, по който работят параметрите на заявката е, че заявката се изпраща до сървъра на базата данни, когато извикате prepare()
, а стойностите на параметрите се изпращат по-късно, когато извикате execute()
. Така че те се съхраняват отделно от текстовата форма на заявката. Никога няма възможност за SQL инжектиране (при условие PDO::ATTR_EMULATE_PREPARES
е невярно).
Така че да, параметрите на заявката ви помагат да избегнете тази форма на уязвимост в сигурността.
Дали са 100% доказателство срещу някаква уязвимост в сигурността? Не разбира се, че не. Както може би знаете, параметърът на заявката заема само мястото на една литерална стойност в SQL израз. Не можете да направите един параметър заместител на списък със стойности, например:
SELECT * FROM blog WHERE userid IN ( ? );
Не можете да използвате параметър, за да направите имената на таблици или колони динамични:
SELECT * FROM blog ORDER BY ?;
Не можете да използвате параметър за друг тип SQL синтаксис:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Така че има доста случаи, в които трябва да манипулирате заявката като низ, преди prepare()
обадете се. В тези случаи все пак трябва да пишете код внимателно, за да избегнете SQL инжектиране.