2008-08-21 54 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查询的函数调用。

相关问题