2010-09-23 21 views
6

Me gustaría tomar la entrada del usuario, denotada como $ dangerous_string, y usarla como parte de un RegEx en una consulta MySQL.¿Cuál es la mejor forma de evitar la entrada del usuario para expresiones regulares en MySQL?

¿Cuál es la mejor manera de hacerlo? Quiero utilizar la cadena del usuario como un literal: si contiene caracteres que signifiquen algo en MySQL RegEx, esos caracteres no deberían afectar a mi Expresión regular.

$dangerous_string = $_GET["string"]; 
//do something here 
$dangerous_string = what_goes_here($dangerous_string); 
$sql = "SELECT * FROM table WHERE search_column REGEX '[[:<:]]$dangerous_string'"; 

//etc.... 

Respuesta

2

AFAIK, no existe una forma nativa de escape para MySQL regex. Puede hacerlo en PHP con preg_quote (http://www.php.net/manual/en/function.preg-quote.php), que probablemente haría el trabajo por usted, pero obviamente no está diseñado para este propósito.

Mi forma preferida si estuviera en su situación sería construir una lista blanca de expresiones regulares en PHP que luego se puede aplicar a la cadena peligrosa:

$safeString = preg_replace('/[^\w]/','',$dangerousString); 

Esto elimina cualquier carácter no-palabra (es decir, nada, excepto A-Za-z0-9_) de su cadena.

NB Creo que las otras respuestas dadas no eliminarán/escaparán los caracteres especiales de expresiones regulares, que creo que es su requisito.

+0

Eso funcionará bastante bien. ¡Gracias! – Sambo

-2

Debe asegurarse de que las comillas y las marcas se manejen correctamente antes de pasar a la base de datos. El mejor método para esto es:

mysql_real_escape_string ([php doc][1]) 

Este método está disponible en las bibliotecas cliente PHP y C++ mysql.

Esto debería garantizar que cualquier `peligrosa_cadena 'ya no sea peligrosa y se pueda utilizar dentro de una cadena entrecomillada utilizada por RegEx.

+0

No hace nada para la interpretación de REGEXP, que era la pregunta. – Wrikken

Cuestiones relacionadas