sql >> Database >  >> RDS >> Mysql

Beveiliging voor voorbereide SQL-instructie met REGEX in query

Tijdelijke aanduidingen kunnen niet worden aangehaald. Zo simpel:

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

De eerste is een tijdelijke aanduiding en werkt zoals verwacht. De andere test op gelijkheid met het teken "vraagteken". Het is geen tijdelijke aanduiding meer.

En dan is er nog het probleem van ? ook een regex-metakarakter zijn. Als tijdelijke aanduidingen KUNNEN worden geciteerd, dan gegeven

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

zou dat ? een tijdelijke aanduiding voor zoekopdrachten zijn, of is het de regex "nul-of-één" bereikoperator?

Als u tijdelijke aanduidingen in regexen wilt gebruiken, moet u het regex-patroon "bouwen"

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

Precies zoals je een LIKE . zou moeten bouwen patroon:

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



  1. Oracle 12cR2 nu in bèta

  2. PHP MySQL Sorteer op meerdere kolommen

  3. Hoe selecteer ik met behulp van MySQL de rangorde van het queryresultaat van een bepaalde rij?

  4. Zijn aanhalingstekens rond tabellen en kolommen in een MySQL-query echt nodig?