帮助查找Reg-ex使用错误

时间:2010-03-05 21:04:35

标签: c# regex sql-injection

我想要cach输入,这似乎就像SQL注入一样。我现在知道,用于查找SQL注入的Reg-ex用法不是最好的方法,但我只需要做一些关于它的研究,我正在寻求帮助来修复一些错误。所以我写了这个方法:

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” - 来自某些textBoxes的类型文本。 但似乎我做了一些错误,因为我的代码不检测简单的sql-注入。我做错了什么?我想在定义Regex表达式或者比较两个值时会出现问题。 请帮我修一些Reg-ex'es以获得工作。 感谢

1 个答案:

答案 0 :(得分:0)

我不确定您尝试匹配哪些不起作用,但这里有一些建议可供您查询。

你的第一个表达,

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;,这样您就不会浪费时间进行不必要的比较。实际上它可能不会产生任何性能差异,但如果您经常调用该功能,它可能会有所不同。