sql >> Base de Datos >  >> RDS >> Mysql

Seguridad para declaración SQL preparada con REGEX en consulta

Los marcadores de posición no se pueden citar. Tan simple como eso:

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

El primero es un marcador de posición y funciona como se esperaba. El otro está probando la igualdad contra el carácter "signo de interrogación". Ya no es un marcador de posición.

Y luego está el problema de ? ser un metacarácter regex también. Si los marcadores de posición PODRÍAN ser citados, entonces dale

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

¿Sería eso ? ser un marcador de posición de consulta, o es el operador de rango de expresiones regulares "cero-o-uno"?

Si desea utilizar marcadores de posición en expresiones regulares, debe "construir" el patrón de expresión regular

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

Exactamente de la misma manera que tendría que construir un LIKE patrón:

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