Přísně vzato, ve skutečnosti není potřeba žádné escapování, protože hodnota parametru není nikdy interpolována do řetězce dotazu.
Parametry dotazu fungují tak, že se dotaz odešle na databázový server, když zavoláte prepare()
a hodnoty parametrů jsou odeslány později, když zavoláte execute()
. Jsou tedy vedeny odděleně od textové podoby dotazu. Nikdy není příležitost pro vložení SQL (za předpokladu PDO::ATTR_EMULATE_PREPARES
je nepravdivé).
Takže ano, parametry dotazu vám pomohou vyhnout se této formě bezpečnostní chyby.
Jsou 100% důkazem proti jakékoli bezpečnostní zranitelnosti? Ne, samozřejmě že ne. Jak možná víte, parametr dotazu zaujímá místo jediné literálové hodnoty ve výrazu SQL. Seznam hodnot nelze nahradit jediným parametrem, například:
SELECT * FROM blog WHERE userid IN ( ? );
Nemůžete použít parametr k tomu, aby názvy tabulek nebo sloupců byly dynamické:
SELECT * FROM blog ORDER BY ?;
Nemůžete použít parametr pro žádný jiný typ syntaxe SQL:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Existuje tedy několik případů, kdy musíte před funkcí prepare()
zpracovat dotaz jako řetězec volání. V těchto případech stále musíte psát kód opatrně, abyste se vyhnuli SQL injection.