me uwant a cach de entrada, que parece ser como la inyección SQL. Así que escribí el método:

        public static bool IsInjection(string inputText)
{
bool isInj = false;
string regexForTypicalInj = @"/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix";
Regex reT = new Regex(regexForTypicalInj);
if (reT.IsMatch(inputText))
isInj = true;
string regexForUnion = @"/((\%27)|(\'))union/ix";
Regex reUn = new Regex(regexForUnion);
if (reUn.IsMatch(inputText))
isInj = true;
string regexForSelect = @"/((\%27)|(\'))select/ix";
Regex reS = new Regex(regexForSelect);
if (reS.IsMatch(inputText))
isInj = true;
string regexForInsert = @"/((\%27)|(\'))insert/ix";
Regex reI = new Regex(regexForInsert);
if (reI.IsMatch(inputText))
isInj = true;
string regexForUpdate = @"/((\%27)|(\'))update/ix";
Regex reU = new Regex(regexForUpdate);
if (reU.IsMatch(inputText))
isInj = true;
string regexForDelete = @"/((\%27)|(\'))delete/ix";
Regex reDel = new Regex(regexForDelete);
if (reDel.IsMatch(inputText))
isInj = true;
string regexForDrop = @"/((\%27)|(\'))drop/ix";
Regex reDr = new Regex(regexForDrop);
if (reDr.IsMatch(inputText))
isInj = true;
string regexForAlter = @"/((\%27)|(\'))alter/ix";
Regex reA = new Regex(regexForAlter);
if (reA.IsMatch(inputText))
isInj = true;
string regexForCreate = @"/((\%27)|(\'))create/ix";
Regex reC = new Regex(regexForCreate);
if (reC.IsMatch(inputText))
isInj = true;
return isInj;
}

Pero parece que he hecho algunos errores, porque mi código no detecta las inyecciones. ¿Qué he hecho mal? Supongo que hay algo equivocado en la definición de Regex expresiones?

¿Cuál es tu razón para no usar consultas parametrizadas en el primer lugar?
xkcd.com/327
Exactamente. Consultas con parámetros = sanitized. Jugando con expresiones regulares para hacer el trabajo de un analizador = locura.
Hago esto para investigación (sciental). Mi marco más tarde sería utilizado para desarrollar ganar las aplicaciones de formularios. Otros desarrolladores están beginers a menudo y a veces no uso de los Parámetros. Así que primero necesito de alguna manera a hacer de la protección de código de C#.
Y ahora hay manera de que usted podría utilizar los parámetros bajo el capó en su marco?

OriginalEl autor vts123 | 2010-02-24

4 Comentarios

  1. 15

    No trate de hacer esto con RegEx – hay muchas formas de hacerlo. Ver este clásico TAN respuesta acerca de análisis con RegEx – es específico a HTML, pero todavía se aplica.

    Debe utilizar Parámetros, estos se encuentran en la BCL y contra inyección SQL medidas integradas.

    Actualización: (después de los comentarios)

    Si usted realmente debe analizar el SQL, no usar RegEx por las razones expuestas en el artículo enlazado. RegEx no es un analizador y no debe ser utilizado como una sola.

    Uso de un analizador SQL – esto debería contribuir a la desinfección de los intentos. Aquí es uno, aquí otro.

    Usted puede continuar con su investigación científica con estos.

    +100, si pudiera: parametrizar, paramterize, parametrizar….
    Hago esto para investigación (sciental). Mi marco más tarde sería utilizado para desarrollar ganar las aplicaciones de formularios. Otros desarrolladores están beginers a menudo y a veces no uso de los Parámetros. Así que primero necesito de alguna manera a hacer de la protección de código de C#.
    He actualizado mi respuesta, a raíz de tu comentario.

    OriginalEl autor Oded

  2. 3

    No use análisis de cadenas o expresiones regulares para manejar este tipo de cosas. La sintaxis de SQL, es muy complicado de analizar de forma fiable con expresiones regulares.

    Lugar de utilizar las consultas parametrizadas con marcadores de posición y evitar la concatenación de cadenas por completo. Esto va a derrotar la inyección de SQL en su raíz.

    var command = new SqlCommand(connection);
    command.Text = "INSERT INTO foo (a, b, c) VALUES (@a, @b, @c)";
    command.Parameters.AddWithValue("a", "this is invulnerable");
    command.Parameters.AddWithValue("b", "to any sort of SQL injection");
    command.Parameters.AddWithValue("c", "--'; DROP DATABASE");
    command.ExecuteNonQuery();

    OriginalEl autor Alex J

  3. 2

    Si usted realmente quiere ayudar a su «no tan experimentados programadores», que estaría mejor tratando de detectar cuando están haciendo en línea de sql en el código. No debería ser demasiado difícil escribir un FxCop regla irregular. Si se incluye como parte de un post en el proceso de construcción, o si usted tiene equipo de sistema, establezca la regla de error de la generación, que pronto va a obtener el cuelgue de ella.

    OriginalEl autor pms1969

  4. 0

    El problema con la inyección de SQL es, que una entrada de usuario se utiliza como parte de la instrucción SQL. Mediante el uso de declaraciones preparadas puede forzar la entrada del usuario para ser manejado como el contenido de un parámetro (y no como parte de un comando SQL). Los parámetros de la consulta ayudar a evitar este riesgo mediante la separación de los valores literales de la sintaxis de SQL.

    La mayoría de las Api de cliente (incluyendo .NET) apoyo a la parametrización de consultas. Esto permite la incrustación de la entrada del usuario, como parámetros. Los parámetros son marcadores de posición para el valor introducido por el usuario que se sustituye en tiempo de ejecución. De esta forma el usuario no puede inyectar código SQL como el conjunto de entrada de usuario es tratada como un valor para el parámetro, no como una cadena de texto que se anexa a la consulta.

    parametrización es la mejor solución para los ataques de inyección SQL.

    OriginalEl autor James

Dejar respuesta

Please enter your comment!
Please enter your name here