2008-08-21 28 views
1

對於我的高級論文,我開發了一個程序,該程序可以使用預準備語句自動檢測並建議修復SQL注入漏洞。特別是PHP的mysqli擴展。我對SO社區的問題是:您首選的方法是如何檢測PHP源代碼中的SQL?在PHP文件中解析SQL的最佳方法?

我用枚舉方含的SQL keywords (SELECT, INSERT, ...)和基本上解析每一行,遍歷枚舉,以確定是否任何SQL存在。此外,我必須確保解析器不會錯誤地檢測到html(例如< \ select>)。

對我來說,這個解決方案工作得很好,但現在我有一點點更多的時間在我的手現在有想過重構使用更優雅(高效的)解決方案的代碼。請限制您的解決方案使用C#,因爲這是我寫我的程序。

回答

1

您的解決方案對我來說似乎很好。另一種方法是使用PHP語法使用Lex/Yacc解析器解析PHP文件,還有一種很好的C#語法解析工具,稱爲Coco/R http://www.ssw.uni-linz.ac.at/coco/

但是我相信,如果你做分析的語言,你最終會消耗太多,而無需額外結果的時間(在開發和計算)。

我會堅持自己的投機取巧的方法,但測試對各種PHP代碼,並調整它覆蓋所有可能的情況。

1

也許在解析文本行的時候會有一些問題,比如BNF,比如說SQL92,然後對每一行記錄片段與文法的匹配程度。

聽起來像一些重擔雖然。您的簡單方法已經可以捕獲如此大比例的實際案例。

1

我不知道在C#中的變量的細節,所以你必須原諒或反對票我要使用PHP但70%的時間我的SQL查詢進入一個變量,像這樣

$sql = "SELECT * FROM table;"; 

除此之外,我無法想象你可以做什麼來改進你已有的東西。

你也會將幾行創建並在字符串中使用變量賬戶報表? (下面的示例)

$sql = "SELECT * FROM table WHERE fname = $fname OR snmae = $sname"; 
0

我不知道在C#中的變量的細節,所以你必須原諒或反對票我要使用PHP但70%的時間我的SQL查詢進入一個變量像這樣..

呀,我原來的做法是隻認準$ SQL瓦爾因爲這是最用什麼,而是針對一些PHP應用程序的測試後,我很快就扔的解決方案,因爲一些開發人員使用一些時髦的變量名稱...

您是否考慮了通過多行創建的語句並在字符串中使用變量? (下面的實施例)

是的。我也試圖處理有條件地生成的語句,但這並不總是如此。 ;)

0

一個簡單的正則表達式來檢測與功能(假設$腳本中使用的所有CRUD SQL語句包含整個PHP腳本)

preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?\)\s*?;/is', 
       $script, $matches); 

應該匹配所有可能的SELECT,INSERT,UPDATE,DELETE語句,如果它們放在括號和雙引號內。這種情況無意義,應該與跨越多行的聲明相匹配。

編輯#1:正則表達式匹配CRUD語句,如字符串賦值;

preg_match_all('/\$\w+\s*?=\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?;/is', 
       $script, $matches); 

編輯#2:

// $variable detecting version of #1 regex 
preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?(?:\$\w+){1}.*?"\s*?\)\s*?;/is', 
        $script, $matches); 
1

我會說這將是最好看的函數調用,而不是尋找SQL本身。可能修改PHP解析器以查找導致運行不是準備好的查詢的SQL查詢的函數調用。

相關問題