Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie sicher sind vorbereitete PDO-Anweisungen?

Genau genommen ist kein Escapezeichen erforderlich, da der Parameterwert niemals in den Abfragestring interpoliert wird.

Abfrageparameter funktionieren so, dass die Abfrage an den Datenbankserver gesendet wird, wenn Sie prepare() aufgerufen haben , und Parameterwerte werden später gesendet, wenn Sie execute() aufgerufen haben . Sie werden also von der Textform der Abfrage getrennt gehalten. Es gibt nie eine Gelegenheit für SQL-Injection (vorausgesetzt PDO::ATTR_EMULATE_PREPARES ist falsch).

Also ja, Abfrageparameter helfen Ihnen, diese Art von Sicherheitslücke zu vermeiden.

Sind sie 100 % sicher gegen Sicherheitslücken? Nein natürlich nicht. Wie Sie vielleicht wissen, ersetzt ein Abfrageparameter nur einen einzelnen Literalwert in einem SQL-Ausdruck. Sie können eine Liste von Werten nicht durch einen einzelnen Parameter ersetzen, zum Beispiel:

SELECT * FROM blog WHERE userid IN ( ? );

Sie können einen Parameter nicht verwenden, um Tabellennamen oder Spaltennamen dynamisch zu machen:

SELECT * FROM blog ORDER BY ?;

Sie können einen Parameter für keinen anderen Typ von SQL-Syntax verwenden:

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;

Es gibt also einige Fälle, in denen Sie die Abfrage als Zeichenfolge vor dem prepare() manipulieren müssen Forderung. In diesen Fällen müssen Sie den Code dennoch sorgfältig schreiben, um eine SQL-Einschleusung zu vermeiden.