检查PHP中的SQL语句是否有坏词,例如DROP或DELETE

Mar*_*arc 0 php regex sql preg-match

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

我想通过检查插入的SQL来添加第二个安全性,例如DROP,DELETEUPDATE.我想出了如何用preg_match做到这一点,但我希望有一个聪明的脚本,可以在一个DROP像之类的东西之间去掉WHERE name = 'DROP 1'

编辑:我想记录管理员是否尝试使用此类语句.这就是我需要进行二级安全检查的原因.这是为了澄清.

有没有人知道剪辑的代码适合这个例子?

谢谢!!

Sam*_*son 10

新的回应

既然您更新了问题以澄清您的需求,我想提供一个不同的解决方案.不要担心用户作为查询提交的内容,同样,如果MySQL没有足够的权限来执行某些操作,MySQL将会发回错误.

捕获该错误mysql_error(),并使用错误号mysql_errno().如果错误消息显示"DROP命令被拒绝..."或错误号是1142,那么你知道他们试图调皮.在此错误中查找术语比在查询中查找术语更好,因为您正确地指出他们的查询可以合法地使用坏词.

原始回应

如果您的用户只能SELECT,那么他们不能DROPDELETE.查找这些单词不会为混合添加任何更多安全性,因为数据库将拒绝任何未明确允许该给定用户的查询.

  • @Marc,这不是理由,而是澄清.大多数SO用户,当他们看到有人要做一些"错误"的事情(因为没有更好的词)时,会试图引导他们朝着正确的方向前进.这就是为什么明确发布您的预期目标很重要的原因. (4认同)
  • @Marc,您应该更新您的问题,以澄清您正在寻找尝试恶意操作的用户,而不是为SQL语句寻找第二级安全性.根据您问题的当前措辞,Jonathan的回答是正确的. (2认同)
  • 它更像是一个"澄清你的问题,以便你能得到有用的答案"的心态.如果您以对每个人都有意义的方式提出问题,大多数人会很乐意为您提供所需的答案. (2认同)