2011-01-11 23 views
5

Estoy diseñando un elemento web en el que los usuarios pueden ingresar una frase de búsqueda. Se busca el índice MOSS Search para eso. Yo uso la clase FullTextSqlQuery para buscar.Inyecciones de SQL en Sharepoint Enterprise SQL sintaxis de búsqueda

Cuando creo mi declaración select, aparentemente tengo que usar la concatenación para incluir la entrada del usuario en ella. La DECLARACIÓN final debe ser algo como esto:

SELECT title, author from portal..scope() 
WHERE ("SCOPE" = 'TheDocuments') 
AND CONTAINS(MYPROPERTY, 'TheValueThatuserSpecified') 

Por lo tanto, la pregunta es, ¿cómo puedo evitar inyecciones SQL de entrada del usuario (?)? ¿Hay alguna función de utilidad específica para eso? En proyectos de php/mysql usaría mysql_real_escape_string. ¿Algo similar en espacios de nombres de SharePoint?

Respuesta

2

no he encontrado ninguna función para codificar la entrada del usuario así que creé mi propio método:

protected override string EncodeUrlParameter(string paramValue) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < paramValue.Length; i++) 
    { 
     char c = paramValue[i]; 
     if (c == '*' || c == '%' || c == '[' || c == ']' || c == '_') 
      sb.Append("[").Append(c).Append("]"); 
     else if (c == '\'') 
      sb.Append("''"); 
     else 
      sb.Append(c); 
    } 
    return sb.ToString(); 
} 

Esto se utiliza principalmente para los parámetros filtrados usando la palabra clave LIKE (the documentation page has a note about this) . Lo más importante que encontré fue cuando las personas intentaron incluir apóstrofes en sus consultas.

2

La clase FullTextSqlQuery toma una consulta "texto de SQL", que no es cierto sql. El "sql de texto completo" es analizado y convertido a sql normal en consulta en la tabla en la base de datos del servidor sql y consulta en un archivo de índice externo . No hay forma de que haga la inyección sql a través de "texto completo sql", no pasará la validación. Los "nombres de columna" que usa en "completo texto sql" deben ser "propiedades administradas" válidas que están configuradas en Administración de búsqueda , no apuntan a nombres reales de columna en una tabla.

http://www.sharepointdev.net/sharepoint--search/is-fulltextsqlquery-protected-against-sql-injection-35184.shtml

+1

Cierto, pero de esta manera el usuario podría ingresar la frase de búsqueda como '') Y CONTIENE (OTRA PERSPECTIVA,' Otro valor) O (ALCANCE = 'OtroEscope'. Esto hace una consulta de búsqueda válida, pero de una manera bastante diferente. El punto es que debe tener en cuenta el escaparse de apóstrofes, comillas, etc. – naivists

+0

El predicado CONTAINS solo funcionará contra propiedades administradas que se hayan habilitado como FullTextQueriable. Además, el marcador recuperable. Este indicador impide que se devuelva el valor de una propiedad administrada si se especifica como columna en la instrucción SELECT. –

+1

Además, los resultados de búsqueda están recortados de seguridad, por lo que incluso si logra ejecutar la consulta inyectada solo obtendrá los resultados a los que normalmente tiene acceso. –

Cuestiones relacionadas