2012-06-12 10 views
5

Necesito dejar que mis usuarios usen asteriscos (*) como comodines en la búsqueda.Seguridad que permite a los usuarios usar comodines

¿Es seguro convertir los asteriscos en% y usar LIKE en la consulta SQL?

Sé que user-regexp puede dar como resultado epresiones regulares que demoran para siempre en calcular. No creo que sea posible en este caso, pero ¿hay algún otro problema de seguridad al hacer esto?

+0

nos muestras una consulta de ejemplo de lo que se propone? Establecería un límite de tiempo para las búsquedas de los usuarios, para evitar que golpeen demasiado sus servidores. – Brad

+2

Quizás su aplicación estaría mejor servida mediante la integración de un motor de búsqueda como Lucene. –

Respuesta

1

Los comodines en like expresiones pueden causar cambios en la ejecución de consultas que hacen que el RDBMS use escaneos de tablas completas en lugar de usar índices. Esto puede ralentizar la consulta cuando hay una gran cantidad de datos. Recomendaría consultar la entrada del usuario para ver la presencia de al menos algunos caracteres que no sean comodines en frente del primer asterisco.

También tenga en cuenta que si convierte a *%, y utilizar LIKE, que había necesidad de cuidar de _ así, de lo contrario sería coincidir con cualquier carácter individual, no sólo el carácter de subrayado.

0

Si todo lo que está haciendo es un reemplazo simple como tan

str_replace('*','%',$query) 

entonces no preveo ningún tipo de seguridad preocupaciones, que creo que es lo que usted está preocupado acerca. No va a abrir ninguna posibilidad de inyección de SQL ni nada (al menos no haciendo este reemplazo, puede que aún tenga problemas de seguridad si no está escapando de la entrada).

Sin embargo, como algunos otros usuarios han señalado, se abrirán algunos problemas de rendimiento . ¿Qué pasará si busco solo *, voy a recuperar toda la tabla? La mejor manera (si no desea usar un database search engine) va a hacer una validación de usuario. Lo más probable es que si desea evitar una exploración de tabla completa en su consulta, querrá restringir al usuario a hacer solo comodines iniciales o finales.

bueno:

  • *foo
  • bar*

No tan bueno:

  • *foo*
  • ba*r

Realmente dependerá de cuántas filas tenga y cuánto confíe en que sus usuarios proporcionen entradas reales.

0

La verdadera pregunta es, ¿es seguro dejar que el usuario decida parte de la consulta.

Incluso en un caso simple, proporcionar datos de usuario a la base de datos es inseguro.

Permitir que los usuarios de entrada a ser enviada directamente a la base de datos pueden ser peligrosos, pero por lo que su filtro y usar su estrategia de escape base de datos (es decir: mysql_real_escape_string() (declaraciones bien preparados o cualquier ORM lo hará por usted) debe sea ​​lo suficientemente seguro.

Sin embargo, puede conducir a problemas de rendimiento, un simple EXPLAIN en su consulta debe advertirle de la cantidad de filas son analizados por su motor de RDBMS.

La mejor manera de implementar estas características es de use Search Engine. (¿No es lo que está tratando de hacer?)

Hay muchas opciones disponibles para ayudarlo a implementar esto.

Puede echar un vistazo a Sphinx, Solr, Xapian o incluso Lucene. Hay todas excelentes opciones.

Básicamente le permiten "indexar" su contenido para realizar búsquedas de texto completo mientras aumenta el rendimiento.

También pueden dar algunas funcionalidades increíbles como OR, AND, LIKE, MINUS, etc. comparadores/operadores.

A continuación, puede estar interesado en esta pregunta: Choosing a stand-alone full-text search server: Sphinx or SOLR?

Cuestiones relacionadas