Regex捕获PHP SQL字符串语句中插入的变量


Regex capturing inserted variables in PHP SQL string statements

我遇到了一些regex问题,如果有问题的话,请使用Python 2.7。

基本上,我要做的是在PHPSQL查询字符串声明中捕获插入的变量,例如:

$query  = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";

当我从比赛中获得第二组时,这应该会返回$user

这是我现在的正则表达式:

r'.*?'s*='s*'('".*?''('$[^'']+)''.*?'"');'

示例显示它可以工作并捕获$user,但不是上面的那个(是的,我知道它没有像理想情况下那样捕获$pass,这似乎是Python实现和Regex的限制。我在实际程序中做了一些技巧来绕过它)

以上内容适用于我使用的示例。然而,当我介绍插入的变量使用语法'{$foo['bar']}'的另一种情况时,下面的另一个正则表达式不起作用,这解释了它包含一个不会关闭变量的撇号的事实:

r'.*?'s*='s*['(]?'".*?(?:(?:''('$[^'']+)'')|(?:''('$'{[^'}]+'})''))?.*?'"[')]?;'

因此,基本上我想捕获'$user’语法或带有{}的语法,例如'{$foo['bar']}'。请注意,这些并不是排他性的,只是插入的变量可能是任意一种,我想说明两者。

这里有一个测试链接,表明它不起作用。使用第二个正则表达式也会中断捕获简单的$user,不确定原因。

我不确定您在python中所说的限制是什么意思,因为以下内容可以正常工作:

>>> import re
>>> query = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
>>> re.findall(r"='('$'w+)'", query)
['$user', '$pass']

要匹配其他查询,请查看以下regex演示:

='('{?'$.+?)(?:'(?:'s|;))

代码示例:

>>> query1 = "('"SELECT table_schema, table_name, create_time FROM information_schema.tables WHERE table_schema='{$_DVWA['db_database']}' AND table_name='users' LIMIT 1'");"
>>> re.findall(r"='('{?'$.+?)(?:'(?:'s|;))", query1)
["{$_DVWA['db_database']}"]
# it works on the other query as well
>>> re.findall(r"='('{?'$.+?)(?:'(?:'s|;))", query)
['$user', '$pass']