我正在向我的数据库抽象层添加if
语句,以挑选出对少数数据库表的任何尝试查询。
基本上,如果我的应用程序试图从名为members
或members_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语法是否关闭?
答案 0 :(得分:6)
语法有效,但不会做你想要的。
要更改模式,请使用
preg_match('/INSERT INTO (?:members|members_profiles)/', $sql) ||
// ^^^ ^
在PCRE中,[…]
定义了一个字符类。这将匹配1个字符,因为它出现在括号内。在您的情况下,[members|members_profiles]
将匹配1个字符(如果它是b
,e
,f
,i
,l
,{{1 },m
,o
,p
,r
,s
或|
。
使用另一种括号_
完成分组。
(顺便说一句,请不要使用Regex来检测数据库更改尝试。请改为限制数据库用户的权限。)
答案 1 :(得分:2)
正则表达式
[ab|cd]
与ab
或cd
不匹配,但与以下单(!)字符之一匹配:a
,b
,{ {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)
匹配abc
或def
[abc|def]
匹配a
,b
,c
,|
,d
,e
或{{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)
除了其他用户已经报告的错误之外,如果您需要检测查询何时尝试更改表members
和members_profiles
,则正则表达式限制性太强。
我不会使用这种方法,但如果你真的那么做,那就考虑一下
INSERT INTO /* little trick */ members …
或INSERT /* into */ INTO /* table */ members …
。