通过preg_match在SQL中爆炸一个字符串

时间:2015-02-07 10:28:33

标签: php preg-match

我想爆炸像SQL

中的字符串

这是我的代码:

<?php

$subject = 'select onlineid from onlinelist where online_user_name=6565 order by htrdh limit 1';

preg_match('/^(select|SELECT) (?P<select>(.+)) (from|FROM) (?P<from>(.+)) ((where|WHERE) (?P<where>(.+))) ((order by|ORDER BY) (?P<order>(.+)))? ((limit|LIMIT) (?P<limit>(.+)))?$/', $subject, $matches);

echo @$matches["select"]."<br>".@$matches["from"]."<br>".@$matches["where"]."<br>".@$matches["order"]."<br>".@$matches["limit"];

outPut将是:

onlineid
onlinelist
online_user_name=6565
htrdh
1

运作良好...... 但是,如果我删除order bylimit,则无效。

如果where存放价值中存在order bylimit$subject

,则必须

2 个答案:

答案 0 :(得分:1)

您的?未包含空格。

不正确:... (ORDER BY ...)? (LIMIT ...)?

正确:...( ORDER BY ...)?( LIMIT ...)?

https://www.regex101.com/r/mE8qK5/1

我还建议您将?添加到.+子模式中,以便它不会贪婪(懒惰)

What do lazy and greedy mean in the context of regular expressions?

答案 1 :(得分:1)

正则表达式很棘手,你应该小心使用它,除非你知道它的每个方面。 我还建议使用/ i表示不区分大小写

https://www.regex101.com/r/hM9aC7/1

/^select\s+(?<columns>.*?)\s+from\s+(.*?)?((where\s+(?<where>.*?))?(order by\s+(?<order>.*?))?(limit\s+(?<limit>(.*?)))?);/i