Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sécurité pour l'instruction SQL préparée avec REGEX dans la requête

Les espaces réservés ne peuvent pas être cités. C'est aussi simple que ça :

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

Le premier est un espace réservé et fonctionne comme prévu. L'autre teste l'égalité avec le caractère "point d'interrogation". Ce n'est plus un espace réservé.

Et puis il y a le problème de ? étant également un métacaractère regex. Si les espaces réservés POURRAIENT être entre guillemets, alors donnés

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

serait-ce ? être un espace réservé de requête, ou est-ce l'opérateur de plage "zéro-ou-un" de la regex ?

Si vous souhaitez utiliser des espaces réservés dans les regex, vous devez "construire" le modèle de regex

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

Exactement de la même manière que vous auriez à construire un LIKE motif :

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