2010-03-05 72 views
1

我想緩存輸入,這看起來像是SQL注入。我現在知道,Reg-ex用於查找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」 - 這裏來特林一些文本框鍵入文本。 但似乎我犯了一些錯誤,因爲我的代碼沒有檢測到簡單的sql注入。我做錯了什麼?我猜想在定義正則表達式或者比較兩個值時會出現問題。 請幫我解決一些Reg-ex'es工作。 謝謝

+0

發佈一些失敗的案例,所以我們有一些工作。 – Oded 2010-03-05 21:09:02

+3

爲什麼不使用參數化查詢? – Ken 2010-03-05 21:12:56

+1

@Oded:我沒有得到我的代碼沒有錯誤,只是這種方法不工作,當我試圖趕上一些簡單的SQL注入,如: '或1 = 1 - 'UNION SELECT id,name,'',0 FROM sysobjects ';更新產品SET單價= 0.01 依此類推...... – Vytas999 2010-03-05 22:01:50

回答

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聲明,我建議用return true;更換isInj = true;,這樣你就不會浪費時間做不必要的比較。事實上,它可能不會造成任何性能差異,但如果您經常調用該函數,則可能會出現性能差異。

+0

您的答案近乎真實。似乎我的SQL不同和正則表達式類。所以我修改它的工作,就像這樣: string regexForUnion = @「^(\ - \ - )\ s *(u |%75 |%55)(n |%6E |%4E) %49)(O |%6F |%4F)(N |%6E |%4E)$「; – Vytas999 2010-03-08 20:27:50