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

C# 在PHP文件中解析SQL的最佳方法?,c#,.net,php,sql,parsing,C#,.net,Php,Sql,Parsing,在我的毕业论文中,我开发了一个程序,可以使用准备好的语句自动检测并建议修复SQL注入漏洞。特别是用于PHP的mysqli扩展。我向SO社区提出的问题是:在PHP源代码中检测SQL的首选方法是什么 我使用了一个包含SQL关键字(SELECT,INSERT,…)的枚举,基本上分析了每一行,在枚举上迭代以确定是否存在任何SQL。此外,我必须确保解析器没有错误地检测html(例如) 对我来说,这个解决方案工作得很好,但现在我手头有更多的时间,并且考虑重构代码以使用更优雅(和高效)的解决方案。请将您的解决

在我的毕业论文中,我开发了一个程序,可以使用准备好的语句自动检测并建议修复SQL注入漏洞。特别是用于PHP的mysqli扩展。我向SO社区提出的问题是:在PHP源代码中检测SQL的首选方法是什么

我使用了一个包含
SQL关键字(SELECT,INSERT,…)
的枚举,基本上分析了每一行,在枚举上迭代以确定是否存在任何SQL。此外,我必须确保解析器没有错误地检测html(例如)


对我来说,这个解决方案工作得很好,但现在我手头有更多的时间,并且考虑重构代码以使用更优雅(和高效)的解决方案。请将您的解决方案限制为使用C ,因为这是我编写程序的地方。

我觉得您的解决方案很好。另一种方法是使用Lex/Yacc解析器解析PHP文件,使用PHP语法,有一个很好的C#语法解析工具Coco/R

然而,我相信如果你解析了语言,你最终会花费太多的时间(在开发和计算中)而没有额外的结果


我会坚持你的机会主义方法,但要针对各种PHP代码进行测试,并调整它以涵盖所有可能的情况。

我觉得你的解决方案很好。另一种方法是使用Lex/Yacc解析器解析PHP文件,使用PHP语法,有一个很好的C#语法解析工具Coco/R

然而,我相信如果你解析了语言,你最终会花费太多的时间(在开发和计算中)而没有额外的结果


我会坚持使用您的机会主义方法,但要针对各种PHP代码进行测试,并对其进行调整,以涵盖所有可能的情况。

也许在分析文本行时会与for有一些相似之处,比如,并根据片段与语法的匹配程度对每行进行评分


不过听起来像是很繁重的工作。你的简单方法已经抓住了如此大比例的真实案例。

也许在分析文本行时与for有一些相似之处,比如,根据片段与语法的匹配程度对每行进行评分


不过听起来像是很繁重的工作。你的简单方法已经能抓住如此大比例的真实案例。

我不知道C#中变量的具体情况,因此你必须原谅或否决我使用PHP,但我的SQL查询有70%的时间会变成这样的变量

$sql = "SELECT * FROM table;";
除此之外,我想不出你能做些什么来改进你已经拥有的东西

您是否考虑在多行上创建的语句,并在字符串中使用变量?(下面的例子)


我不知道C#中变量的具体情况,因此您必须原谅或否决我使用PHP,但我的SQL查询有70%的时间会进入这样一个变量

$sql = "SELECT * FROM table;";
除此之外,我想不出你能做些什么来改进你已经拥有的东西

您是否考虑在多行上创建的语句,并在字符串中使用变量?(下面的例子)


我不知道C#中变量的具体情况,因此您必须原谅或否决我使用PHP,但我的SQL查询有70%的时间会进入这样一个变量

是的,我最初的方法是只寻找$sql变量,因为这是大多数人使用的,但是在测试了一些PHP应用程序后,我很快就放弃了这个解决方案,因为一些开发人员使用了一些时髦的变量名

您是否考虑在多行上创建的语句,并在字符串中使用变量?(下面的例子)

是的。我还尝试处理有条件生成的语句,但并不总是很好地工作


我不知道C#中变量的具体情况,因此您必须原谅或否决我使用PHP,但我的SQL查询有70%的时间会进入这样一个变量

是的,我最初的方法是只寻找$sql变量,因为这是大多数人使用的,但是在测试了一些PHP应用程序后,我很快就放弃了这个解决方案,因为一些开发人员使用了一些时髦的变量名

您是否考虑在多行上创建的语句,并在字符串中使用变量?(下面的例子)


是的。我还尝试处理有条件生成的语句,但并不总是很好地工作

一个简单的正则表达式,用于检测与函数一起使用的所有CRUD sql语句(假设$script包含整个php脚本)

它应该匹配所有可能的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);

一个简单的正则表达式,用于检测与函数一起使用的所有CRUD sql语句(假设$script包含整个php脚本)

它应该匹配所有可能的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);

我认为最好是寻找函数调用,而不是寻找SQL本身。可能修改PHP解析器以查找导致运行SQL查询的函数调用,该查询不是准备好的查询

我认为最好是查找函数调用,而不是SQL本身。可能修改PHP解析器以查找导致运行SQL查询的函数调用