繁体   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