检查PHP中的SQL语句是否存在诸如DROP或DELETE之类的坏词

检查PHP中的SQL语句是否存在诸如DROP或DELETE之类的坏词,php,sql,regex,preg-match,Php,Sql,Regex,Preg Match,我希望允许一些管理员在文本字段中手动输入SQL语句(以获取统计数据等)。在数据库层,我通过创建一个只能选择但不能更新/删除的用户来保护数据 我想通过检查插入的SQL中是否存在诸如DROP、DELETE或UPDATE之类的坏单词来添加第二个安全性。我知道如何使用preg_match实现这一点,但我希望有一个智能脚本,可以区分DROP和WHERE name='DROP 1' 编辑:如果管理员试图使用此类语句,我想记录。这就是为什么我需要二级安全检查。这是为了澄清。 有人知道一个代码被剪断了,这符合这

我希望允许一些管理员在文本字段中手动输入SQL语句(以获取统计数据等)。在数据库层,我通过创建一个只能选择但不能更新/删除的用户来保护数据

我想通过检查插入的SQL中是否存在诸如
DROP
DELETE
UPDATE
之类的坏单词来添加第二个安全性。我知道如何使用preg_match实现这一点,但我希望有一个智能脚本,可以区分
DROP
WHERE name='DROP 1'

编辑:如果管理员试图使用此类语句,我想记录。这就是为什么我需要二级安全检查。这是为了澄清。

有人知道一个代码被剪断了,这符合这个例子吗

谢谢

新反应 因为你更新了你的问题来澄清你在寻找什么,我想提供一个不同的解决方案。不要担心用户以查询的形式提交的内容,同样,如果MySQL没有足够的权限来执行某项操作,它将抛出一个错误

使用
mysql\u error()
捕获该错误,并使用
mysql\u errno()
捕获错误号。如果错误消息显示“DROP command DENITED…”或错误号为1142,则您知道他们试图调皮。在这个错误中查找术语比在查询中查找术语要好,因为您正确地指出,他们的查询可以合法地使用坏单词

原始响应
如果用户只能
选择
,则不能
删除
删除
。查找这些单词并不会给混合添加更多的安全性,因为数据库将拒绝给定用户不明确允许的任何查询。

为什么不为统计数据创建命令并允许管理员调用这些命令呢?这不容易吗


不是说管理员会故意造成伤害,但这是可能发生的

这绝对不是放置这种安全级别的地方。只要您将数据库设置为只有SELECT权限,他们就不能以任何方式更改数据。然而,如果您给他们任何可以更改数据的特权,那么对SQL语句进行任何语义检查都不会给您带来安全性。

对于像SQL这样复杂的东西,我不会使用正则表达式

首先,我将了解哪些SQL解析器可用于PHP,然后使用其中一个来解析和分析正在使用的SQL语句

请尝试以下方法之一:


关于是否需要PHP检查来提供Marc想要的安全性这一基本问题,有一点很好。你的解决方案根本解决不了我的问题。我想检查这些话,并记录如果有人试图这样做(更安全)。所以请不要考虑安全问题。。我的问题是关于preg_匹配算法。。。thanks@Marc,您应该更新您的问题,以澄清您正在寻找尝试恶意操作的用户,而不是寻找SQL语句的第二级安全性。根据你问题的当前措辞,乔纳森的回答是正确的。@Marc,这不是理由,而是澄清。因此,大多数用户,当他们看到有人将要做一些“错误的事”(因为没有更好的词)时,会试图引导他们朝着正确的方向前进。这就是为什么清楚地公布你的预期目标很重要的原因。这更像是一种“澄清你的问题以便你能得到有用的答案”的心态。如果你以一种对每个人都有意义的方式提问,大多数人都会很乐意给你想要的答案。我看得越多,就越觉得你所做的不是一个好主意。看起来你正在给你的终端用户提供SQL,然后希望秘密地对其进行检查,以确保他们没有试图滥用系统。使用某种用户查询工具并回避整个问题不是更好吗?Marc,请查看我更新的解决方案,以获得更可靠的方法。