Mysql
 sql >> Database >  >> RDS >> Mysql

Sicurezza per l'istruzione SQL preparata con REGEX nella query

I segnaposto non possono essere citati. Semplice come quello:

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

Il primo è un segnaposto e funziona come previsto. L'altro sta verificando l'uguaglianza rispetto al carattere "punto interrogativo". Non è più un segnaposto.

E poi c'è il problema di ? essendo anche un metacarattere regex. Se i segnaposto POTREBBERO essere citati, allora dati

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

sarebbe ? essere un segnaposto di query o è l'operatore di intervallo "zero-o-uno" della regex?

Se vuoi usare i segnaposto nelle espressioni regolari, devi "costruire" il pattern delle espressioni regolari

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

Esattamente nello stesso modo in cui dovresti creare un LIKE modello:

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