Strikt genomen is er eigenlijk geen escape nodig, omdat de parameterwaarde nooit in de queryreeks wordt geïnterpoleerd.
De manier waarop queryparameters werken, is dat de query naar de databaseserver wordt verzonden wanneer u prepare()
aanroept. , en parameterwaarden worden later verzonden, wanneer u execute()
. aanroept . Ze worden dus gescheiden gehouden van de tekstuele vorm van de vraag. Er is nooit een mogelijkheid voor SQL-injectie (mits PDO::ATTR_EMULATE_PREPARES
is onwaar).
Dus ja, queryparameters helpen je om die vorm van beveiligingskwetsbaarheid te vermijden.
Zijn ze 100% bestand tegen beveiligingsproblemen? Nee natuurlijk niet. Zoals u wellicht weet, neemt een queryparameter slechts de plaats in van een enkele letterlijke waarde in een SQL-expressie. U kunt geen enkele parameter een lijst met waarden laten vervangen, bijvoorbeeld:
SELECT * FROM blog WHERE userid IN ( ? );
U kunt geen parameter gebruiken om tabelnamen of kolomnamen dynamisch te maken:
SELECT * FROM blog ORDER BY ?;
U kunt geen parameter gebruiken voor een ander type SQL-syntaxis:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Er zijn dus nogal wat gevallen waarin u de query als een tekenreeks moet manipuleren, voorafgaand aan de prepare()
telefoongesprek. In deze gevallen moet u de code nog steeds zorgvuldig schrijven om SQL-injectie te voorkomen.