Помогите найти ошибки использования Reg-ex - PullRequest
1 голос
/ 06 марта 2010

Я хочу кэшировать ввод, который похож на SQL-инъекцию. Теперь я знаю, что использование Reg-ex для поиска 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;

}

"inputText" - здесь приходит текст типа tring из некоторых текстовых полей. Но, похоже, я допустил некоторые ошибки, потому что мой код не обнаруживает простых SQL-инъекций. Что я делаю не так? Я предполагаю, что что-то не так в определении выражений Regex или что-то в сравнении двух значений. Пожалуйста, помогите мне просто исправить некоторые из этих правил, чтобы получить работу. Спасибо

1 Ответ

0 голосов
/ 06 марта 2010

Я не уверен, что то, что вы пытались сопоставить, не сработало, но вот несколько советов по вашим запросам.

Ваше первое выражение,

string regexForTypicalInj = @"/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix";

, кажется, предназначен для того, чтобы поймать одиночную кавычку, за которой следует "или". Я бы обязательно обработал случай, когда после одинарной кавычки и перед "или" есть пробел. Кроме того, вам не нужно экранировать символы% или '. С этими изменениями становится,

string regexForTypicalInj = @"/\w*((%27)|')\s*(o|(%6F)|(%4F))(r|(%72)|(%52))/ix";

В остальных выражениях я бы добавил допуск на пробел, а также включил символы в кодировке URL. Делая это, они становятся,

string regexForUnion = @"/((%27)|')\s*(u|%75|%55)(n|%6E|%4E)(i|%69|%49)(o|%6F|%4F)(n|%6E|%4E)/ix";
string regexForSelect = @"/((%27)|')\s*(s|%73|%53)(e|%65|%45)(l|%6C|%4C)(e|%65|%45)(c|%63|%43)(t|%74|%54)/ix";
string regexForInsert = @"/((%27)|')\s*(i|%69|%49)(n|%6E|%4E)(s|%73|%53)(e|%65|%45)(r|%72|%52)(t|%74|%54)/ix";
string regexForUpdate = @"/((%27)|')\s*(u|%75|%55)(p|%70|%50)(d|%64|%44)(a|%61|%41)(t|%74|%54)(e|%65|%45)/ix";
string regexForDelete = @"/((%27)|')\s*(d|%64|%44)(e|%65|%45)(l|%6C|%4C)(e|%65|%45)(t|%74|%54)(e|%65|%45)/ix";
string regexForDrop = @"/((%27)|')\s*(d|%64|%44)(r|%72|%52)(o|%6F|%4F)(p|%70|%50)/ix";
string regexForAlter = @"/((%27)|')\s*(a|%61|%41)(l|%6C|%4C)(t|%74|%54)(e|%65|%45)(r|%72|%52)/ix";
string regexForCreate = @"/((%27)|')\s*(c|%63|%43)(r|%72|%52)(e|%65|%45)(a|%61|%41)(t|%74|%54)(e|%65|%45)/ix";

Еще одно предложение для кода в целом: для каждого оператора if я бы предложил заменить isInj = true; на return true;, чтобы не тратить время на ненужные сравнения. В действительности это, вероятно, не будет иметь никакого значения для производительности, но могло бы, если бы вы действительно часто вызывали эту функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...