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

Sicherheit für vorbereitete SQL-Anweisung mit REGEX in Abfrage

Platzhalter können nicht zitiert werden. Ganz einfach:

SELECT ... WHERE foo = ?
SELECT ... WHERE foo = '?'

Der erste ist ein Platzhalter und funktioniert wie erwartet. Der andere testet auf Gleichheit gegen das Zeichen "Fragezeichen". Es ist kein Platzhalter mehr.

Und dann ist da noch das Problem ? auch ein Regex-Metazeichen sein. Wenn Platzhalter zitiert werden KÖNNTEN, dann angegeben

SELECT ... WHERE foo REGEXP '^.?' 

wäre das ? ein Abfrageplatzhalter sein, oder ist es der Regex-Operator "Null oder Eins"?

Wenn Sie Platzhalter in Regexen verwenden möchten, müssen Sie das Regex-Muster "bauen"

SELECT ... WHERE foo REGEXP concat('^.', ?)

Genauso wie Sie ein LIKE erstellen müssten Muster:

SELECT ... WHERE foo LIKE '%?%' // wrong
SELECT ... WHERE foo LIKE concat('%', ?, '%') // right