![](/img/trans.png)
[英]Best approach for script to download thousands of files in C#, SQL 2008
[英]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代码进行测试,并调整它以涵盖所有可能的情况。
我不知道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.