Strängt taget behövs det faktiskt ingen flykt, eftersom parametervärdet aldrig interpoleras i frågesträngen.
Sättet som frågeparametrar fungerar är att frågan skickas till databasservern när du anropade prepare()
, och parametervärden skickas senare när du anropade execute()
. Så de hålls åtskilda från frågans textform. Det finns aldrig en möjlighet för SQL-injektion (förutsatt PDO::ATTR_EMULATE_PREPARES
är falskt).
Så ja, frågeparametrar hjälper dig att undvika den typen av säkerhetssårbarhet.
Är de 100% bevis mot någon säkerhetsrisk? Nej, självklart inte. Som du kanske vet tar en frågeparameter bara platsen för ett enda bokstavligt värde i ett SQL-uttryck. Du kan inte ersätta en lista med värden med en enda parameter, till exempel:
SELECT * FROM blog WHERE userid IN ( ? );
Du kan inte använda en parameter för att göra tabellnamn eller kolumnnamn dynamiska:
SELECT * FROM blog ORDER BY ?;
Du kan inte använda en parameter för någon annan typ av SQL-syntax:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Så det finns en hel del fall där du måste manipulera frågan som en sträng, innan prepare()
ringa upp. I dessa fall måste du fortfarande skriva kod noggrant för att undvika SQL-injektion.