2012-08-14 28 views
6

Necesito implementar una búsqueda donde el usuario puede ingresar * como comodín. La base de datos que están buscando es un servidor SQL. Estaba pensando sólo la sustitución de la * con un%:Cómo utilizar * como un comodín en la consulta SQL de forma segura

userInput = userInput.replace('*', '%'); 

Me preocupa que ya estoy haciendo esto "a mano" que podría introducir algunos errores o fallos de seguridad. ¿Ves algún problema al hacerlo así? ¿Hay alguna biblioteca para hacer esto por mí?

Uso Hibernate como correlacionador ORM y API de Criteria para crear la consulta si ayuda con las respuestas.

+1

Si está usando 'like', también quiere escapar de'% ',' _' y '[...]' existentes. Este * podría * ser un duplicado de: [Escape de una cadena en SQL Server para que sea seguro usarlo en la expresión LIKE] (http://stackoverflow.com/questions/258757/escape-a-string-in-sql- server-so-that-it-is-safe-to-use-in-like-expression) – Kobi

+0

, pero mientras use un Estado Preparado, no inducirá ningún defecto de seguridad. –

+0

@Kobi Gracias, no sabía sobre _ y []. Tengo que probar cómo afectan a la consulta. Hibernate me permite configurar un personaje de escape para que pueda actualizar esta pregunta conmigo tratando de escapar cosas que no quiero que usen los usuarios. – palto

Respuesta

2

Eso es exactamente lo que hacemos en nuestra empresa. Tenemos dos productos, uno que usa un simple reemplazo en el código como su ejemplo. El otro que es muy almacenado procedimiento pesado lo hace dentro del proceso de 'búsqueda' almacenado.

De cualquier manera, no hemos tenido ninguna instancia de problemas de seguridad o quejas del usuario sobre el sistema.

sólo para mostrar la disposición de procedimiento almacenado, pero probablemente redundante, ya que dijo que su uso de ORM:

CREATE PROC [dbo].[p_aaa] 
    @username nvarchar(100) = 'dbo', 
    @rows int = 0, 
    @name nvarchar(100) = '%'  
AS 

SET @name = REPLACE(@name, '*', '%') 
2

Creo que el cambio * a% no causa ningún problema, si todos los datos de esa tabla es pública basado en este valor de búsqueda. También hay similar topic que tiene más ejemplos de regexp a sql.

Esto hará que su aplicación sea más independiente que con database vendror-specific regexp matching mechanism.

+0

¿No es al revés? Si lo transformo en la capa de servicio, me resulta difícil codificar qué escapes tengo que hacer en esta base de datos específica. Si lo hago en la capa DAO, puedo tener diferentes implementaciones para diferentes almacenamientos. Incluso podría tener un almacén de datos NOSQL. – palto

+0

Supongo que tienes razón ... – JMelnik

Cuestiones relacionadas