我的preg_match语法有效吗?

时间:2010-07-14 12:49:47

标签: php regex preg-match

我正在向我的数据库抽象层添加if语句,以挑选出对少数数据库表的任何尝试查询。

基本上,如果我的应用程序试图从名为membersmembers_profiles的数据库表中创建,读取或销毁数据,我想调用我的if语句。

if (
    preg_match('/INSERT INTO [members|members_profiles]/', $sql) ||
    preg_match('/UPDATE [members|members_profiles]/', $sql) ||
    preg_match('/DELETE FROM [members|members_profiles]/', $sql))
{
    // do if statement stuff here...
}

我不是正则表达式/ preg-match master,但如果SQL查询匹配,上面的if语句将返回true:

  • INSERT INTO members ...INSERT INTO members_profiles ...
  • UPDATE members ...UPDATE members_profiles ...
  • DELETE FROM members ...DELETE FROM members_profiles ...

或者我的preg-match语法是否关闭?

5 个答案:

答案 0 :(得分:6)

语法有效,但不会做你想要的。

要更改模式,请使用

preg_match('/INSERT INTO (?:members|members_profiles)/', $sql) ||
//                       ^^^                        ^

在PCRE中,[…]定义了一个字符类。这将匹配1个字符,因为它出现在括号内。在您的情况下,[members|members_profiles]将匹配1个字符(如果它是befil,{{1 },moprs|

使用另一种括号_完成分组。


(顺便说一句,请不要使用Regex来检测数据库更改尝试。请改为限制数据库用户的权限。)

答案 1 :(得分:2)

正则表达式

[ab|cd]

abcd不匹配,但与以下(!)字符之一匹配:ab,{ {1}},|c

您需要的是一个组而不是一个字符类:

d

(ab|cd) ab匹配。

有关角色类的更多信息:http://www.regular-expressions.info/charclass.html

答案 2 :(得分:2)

只需一个正则表达就足够了:

if (preg_match('/(?i)(INSERT\s+INTO|UPDATE|DELETE\s+FROM)(?-i)\s+(members|members_profiles)/', $sql))
{
    // do if statement stuff here...
}

请注意()而不是[]\s+而不是空格。因为SQL对任意数量的nair空格都有效,\s+匹配它们。 +后面的\s表示它必须至少有一个空格,但它可以更多。 (?i)表示将检查所有后续字符不区分大小写,(?-i)再次启用大小写敏感度。由于SQL命令不区分大小写。

(abc|def)匹配abcdef
[abc|def]匹配abc|de或{{1} }

要试用正则表达式,你可以使用http://rubular.com/,它说它是用ruby编写的,用于测试ruby中的正则表达式,但是有效的正则表达式应该独立于语言,所以它可以用来测试常见的正则表达式,这也适用于其他语言。

答案 3 :(得分:0)

这是正确的

if (
    preg_match('/INSERT\sINTO\s(members|members_profiles)/', $sql) ||
    preg_match('/UPDATE\s(members|members_profiles)/', $sql) ||
    preg_match('/DELETE\sFROM\s(members|members_profiles)/', $sql))
{
    // do if statement stuff here...
}

LE : 用白色空格特殊字符更改了空格;

答案 4 :(得分:0)

除了其他用户已经报告的错误之外,如果您需要检测查询何时尝试更改表membersmembers_profiles,则正则表达式限制性太强。

我不会使用这种方法,但如果你真的那么做,那就考虑一下

  • 数据库引擎允许注释。如果数据库引擎是MySQL,我可以写INSERT INTO /* little trick */ members …INSERT /* into */ INTO /* table */ members …
  • 数据库引擎允许任意数量的空格或换行符。