我遇到了一些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']