0

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

我想通过检查插入的 SQL 中是否存在诸如DROPDELETE或之类的坏词来添加第二个安全性UPDATE。我想出了如何使用 preg_match 做到这一点,但我希望有一个智能脚本可以区分 aDROP和类似的东西WHERE name = 'DROP 1'

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

有谁知道适合这个例子的代码片段?

谢谢!!

4

4 回答 4

10

新回应

由于您更新了问题以澄清您在寻找什么,我想提供一个不同的解决方案。不要担心用户作为查询提交的内容,同样,如果他们没有足够的权限来做某事,MySQL 会返回一个错误。

用 捕获该错误,用 捕获mysql_error()错误号mysql_errno()。如果错误消息显示“DROP command denied...”或错误号为1142,那么您知道他们试图调皮。在此错误中查找术语比在其查询中查找术语更好,因为您正确地指出,他们的查询可以合法地使用坏词。

原始回复

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

于 2010-01-25T22:18:35.603 回答
3

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

我将首先查看可用于 PHP 的 SQL 解析器,然后使用其中之一来解析和分析正在使用的 SQL 语句。

尝试其中之一:

http://pear.php.net/package/SQL_Parser

http://sourceforge.net/projects/osqlp/

于 2010-01-26T01:31:08.843 回答
1

这绝对是放置此级别安全性的错误位置。只要您将数据库设置为只有 SELECT 权限,那么他们就无法以任何方式更改数据。但是,如果您授予他们任何可以更改数据的权限,那么对 SQL 语句进行的任何语义检查都不会为您提供安全性。

于 2010-01-25T22:26:56.690 回答
0

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

并不是说管理员会故意造成伤害,但它可能会发生!

于 2010-01-25T22:22:49.087 回答