Regex для обнаружения Внедрений SQL в WinForms

я uwant для ловли входа, который, кажется, похож на Внедрение SQL. Таким образом, я записал метод:

        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;

    }

Но кажется, что я сделал некоторые ошибки, потому что мой код не делает обнаруживает инжекции. Что я делаю неправильно? Я предполагаю, что существует что-то не так в определении выражений Regex?

5
задан vts123 24 February 2010 в 21:03
поделиться

3 ответа

Не попробуйте сделать это с помощью RegEx - слишком много способов обойти это. См. этот классический ответ SO о синтаксическом анализе с помощью RegEx - он специфичен для HTML, но все еще применим.

Вы должны использовать Параметры , они находятся в BCL и имеют встроенные меры защиты от SQL-инъекций.

Обновление: (следующие комментарии)

Если вам действительно необходимо проанализировать SQL , не используйте RegEx по причинам, указанным в связанной статье. RegEx не является парсером, и его не следует использовать как таковой.

Используйте синтаксический анализатор SQL - это должно помочь с попытками очистки. Вот один , здесь другой .

С ними вы можете продолжить свое научное исследование.

15
ответ дан 18 December 2019 в 07:54
поделиться

Не используйте синтаксический анализ строк или регулярные выражения для обработки подобных вещей. Синтаксис SQL слишком сложен для надежного анализа с помощью регулярных выражений.

Вместо этого используйте параметризованные запросы с заполнителями и вообще избегайте конкатенации строк. Это предотвратит SQL-инъекцию в ее корне.

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();
3
ответ дан 18 December 2019 в 07:54
поделиться

Если вы действительно хотите помочь своим «не очень опытным программистам», вам лучше попытаться определить, когда они используют встроенный sql в своем коде. Не должно быть слишком сложно написать правило FxCop, чтобы его обнаружить. Если вы включите его как часть процесса пост-сборки или если у вас есть командная система, установите правило, чтобы сборка провалилась, они скоро с ней повесятся.

2
ответ дан 18 December 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: