簡體   English   中英

在PHP文件中解析SQL的最佳方法?

[英]Best Approach to Parse for SQL in PHP Files?

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

我使用了包含SQL keywords (SELECT, INSERT, ...)的枚舉,並基本解析了每一行,迭代枚舉以確定是否存在任何SQL。 另外,我必須確保解析器沒有錯誤地檢測到html(例如<\\ select>)。

對我來說這個解決方案運行良好,但現在我現在有更多的時間在我的手上,並考慮重構代碼以使用更優雅(和有效)的解決方案。 請限制您的解決方案使用C#,因為這是我編寫程序的內容。

你的解決方案似乎很好。 另一種方法是使用PHP的語法用Lex / Yacc解析器解析PHP文件,有一個很好的C#語法解析工具叫做Coco / R http://www.ssw.uni-linz.ac.at/可可/

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

我會堅持你的機會主義方法,但要針對各種PHP代碼進行測試,並調整它以涵蓋所有可能的情況。

也許在對比BNF的文本行中,比如說SQL92 ,並對每一行評分片段與語法的匹配程度。

雖然聽起來有點沉重。 您的簡單方法已經捕獲了如此大比例的實際案例。

我不知道C#中變量的具體細節,所以你不得不原諒或拒絕使用PHP投票,但70%的時間我的SQL查詢會變成這樣的變量

$sql = "SELECT * FROM table;";

除此之外,我無法想到你可以做些什么來改善你已經擁有的東西。

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

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

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

我不知道C#中變量的具體細節,所以你不得不原諒我或者使用PHP投票,但是70%的時間我的SQL查詢會變成這樣的變量。

是的,我最初的方法是只查找$ sql變量,因為這是大多數人使用的,但在對幾個PHP應用程序進行測試后,我很快就拋出了該解決方案,因為一些開發人員使用了一些時髦的變量名...

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

是的。 我還嘗試處理有條件生成的語句,但這並不總是很有效。 ;)

一個簡單的正則表達式,用於檢測與函數一起使用的所有CRUD sql語句(假設$ script包含整個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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM