Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Segurança para instrução SQL preparada com REGEX na consulta


Os espaços reservados não podem ser citados. Simples assim:
SELECT ... WHERE foo = ?
SELECT ... WHERE foo = '?'

O primeiro é um espaço reservado e funciona conforme o esperado. O outro está testando a igualdade contra o caractere "ponto de interrogação". Não é mais um marcador de posição.

E depois há o problema de ? sendo um metacaractere regex também. Se os espaços reservados PUDEREM ser citados, então dado
SELECT ... WHERE foo REGEXP '^.?' 

isso ? ser um marcador de posição de consulta ou é o operador de intervalo "zero-ou-um" regex?

Se você quiser usar espaços reservados em regexes, precisará "construir" o padrão regex
SELECT ... WHERE foo REGEXP concat('^.', ?)

Exatamente da mesma forma que você teria que construir um LIKE padronizar:
SELECT ... WHERE foo LIKE '%?%' // wrong
SELECT ... WHERE foo LIKE concat('%', ?, '%') // right