2011-11-17 14 views
5

Para la entrada de correo electrónico en un cuadro de texto por el usuario estoy haciendo cheque lado del cliente, para saber si el correo electrónico es válida o nocómo evitar la inyección de SQL en un sitio web asp.net

string emailexist = "SELECT COUNT(DISTINCT UserID) as count FROM tbl_user WHERE [email protected] ";  


    <asp:RegularExpressionValidator ID="RegularExpressionValidator2" ValidationGroup="Login" ControlToValidate="txtUserName" 
          ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" CssClass="Error" 
          runat="server" /> 

es esto normal expresión lo suficientemente buena como para evitar la inyección de sql para el correo electrónico.

Otro texto:

string groupExistQuery = "SELECT COUNT(DISTINCT GroupID) as count FROM tbl_group WHERE [email protected]"; 

que estoy haciendo una consulta en el lado del servidor para comprobar si el nombre del grupo introducida por el usuario ya está disponible en la base de datos, hay una fuerte posibilidad de realizar la inyección sql aquí. ¿Cómo debo evitarlo?

+1

pensé que habíamos hablado de esto: no use la etiqueta 'asp'. –

+0

@JoelCoehoorn - Realmente me gustaría que la discusión sobre meta hubiera resultado en que 'asp' cambiara a' asp-classic' :( – Polynomial

+0

+1 solo por preguntar –

Respuesta

8

Una expresión regular es no relacionada a inyección SQL (la inclusión en listas negras, etc. nunca es el enfoque más sólido); sin embargo, el uso del parámetro @Email significa (suponiendo que permanece en parametrizado) que es no susceptible a inyección SQL.

La inyección SQL se relaciona con la concatenación inapropiada de entrada; la principal herramienta para combatirlo son los parámetros, que ya han sucedido aquí.

Por ejemplo, si se hizo:

var sql = "SELECT ...snip... WHERE Email='" + email + "'"; // BAD!!!!! 

continuación que es muy susceptible a la inyección de SQL. Al usar un parámetro, el valor no se trata como parte de la consulta, por lo que el atacante no tiene un vector de ataque.

+1

Esto es cierto para la mayoría de los lenguajes (si no para todos) y para los sistemas DBMS. las consultas son casi siempre la mejor solución.No puedo contar la cantidad de veces que he visto a alguien usar un código de validación personalizado y luego dar un aspecto de sorpresa horrorizada cuando alguien los golpea con una 'TABLAS DE GOTAS'. – Polynomial

4

Puede evitarlo si no utiliza Direct SQL y utiliza consultas parametrizadas y/o procedimientos almacenados.

6

Si utiliza valores parametrizados, estará bien independientemente, no puede inyectar a través de parámetros, solo a través de valores concatenados.

0

Here es la respuesta del grupo de Prácticas & de Microsoft a su pregunta.

En general, la regla simple es: no usar generación dinámica de SQL y, si lo hace, desinfectar su entrada.

Nunca concatenas cadenas para construir tu consulta SQL. Si necesita crear una consulta por su cuenta en su aplicación, utilice consultas SQL parametrizadas con parámetros, de esta manera estará en un lado seguro.

Aquí se muestra un ejemplo del documento proporciono el enlace de arriba:

DataSet userDataset = new DataSet(); 
    SqlDataAdapter myCommand = new SqlDataAdapter( 
      "LoginStoredProcedure", connection); 
    myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11); 
    myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text; 

    myCommand.Fill(userDataset); 
+0

Mi comentario fue dirigido. Continuar :) –

+0

Usar parámetros de tipo seguro es solo una forma de desinfectar su entrada, en mi opinión. –

+0

Ver mi comentario en la respuesta de Mark. El filtrado personalizado no puede tener en cuenta todas las posibles vías de inyección de SQL, incluidas todas las sintaxis, codificaciones y engaños que los atacantes obtendrán. He visto a gente probar esto, y algunos han sido muy inteligentes con su filtrado, pero cada vez que lo he visto termina en una catástrofe cuando su sistema está comprimised. Las consultas parametrizadas son una solución absoluta porque tratan los valores como datos en un contexto totalmente separado y nunca se pueden analizar como código. – Polynomial

1
  1. Use parametrizado los valores
  2. codifican las cadenas
+1

con énfasis pesado y pesado en 1; la opción 2 es algo que la mayoría de la gente ** se equivocará **. Personalmente, limitaría cualquier uso de 2 a valores explícitamente listados en blanco (en lugar de en la lista negra) –

+0

@MarcGravell - De acuerdo. La conversión a los tipos apropiados lo alerta a un problema de formato, pero ciertamente no es una medida de seguridad. – Polynomial

+0

La codificación Html previene algunos ataques – user182630

Cuestiones relacionadas