-1

我在使用正则表达式时遇到问题。

我正在尝试在查询字符串上使用 preg_match 。我希望它排除任何删除截断序列,无论大小写(?i)在'`之间并且在序列和两个符号之间有任意数量的字符,但我想捕捉这两个词中的任何一个不在两个标志之间。

如果您还没有猜到,我想检测输入是否正在尝试 DROP | 截断任何内容,但是如果不从非恶意输入中排除这些单词,就没有简单的方法可以做到这一点。

例如

我希望这不会触发:

SELECT * FROM `drop`
SELECT * FROM 'drop_truncate' -- drop drop

但这要触发:

DROP TABLE `users`

编辑:所以我的问题是关于正则表达式的,我收到了关于数据库安全的答案,毫无疑问,这个问题让你这么想,抱歉误导!不,我不关心我已经处理过的数据库安全性,我想要在这里检查是否有任何使用 drop 或 truncate 的 INTENT 并将其记录在某处。

4

2 回答 2

3

您完全以错误的方式处理数据库的安全性。

此处的此声明但没有简单的方法可以做到这一点是错误的。您只是希望以一种极其狭隘的狭隘思维方式来“保护”这种输入。

不要让用户通过输入用户定义的 SQL 来破坏您的查询!!

请至少研究准备好的陈述。PHP.net在解释其 PDO 库方面有一个很好的开端。虽然我强烈建议反对,但如果您真的认为这是您最好的行动方案"use preg_match to prevent malicious query intent",请参阅AD7six的回答。(提示:不是)。

于 2012-05-15T16:15:33.353 回答
1

您似乎将在同一个登录名下运行应用程序查询和用户生成的查询。这会迫使您彻底检查用户定义的查询。

相信这里的众多答案和评论。你会失败的。无论你想出什么聪明的理智检查,总有人会找到一种方法偷偷摸摸危险的东西过去。

因此,假设他们确实通过了您的健全性检查。你怎么能保护自己?
- 限制数据库本身的权限。


不要通过同一个登录名运行所有查询,而是有一个单独的登录名专门用于用户生成的查询。

拒绝对该登录名的 CREATE、DROP 和 EXECUTE 其他权限。拒绝对您不希望他们选择的数据的 SELECT 权限。使用您的数据库允许您执行的任何操作来控制新登录可以和/或不能执行的操作。

通过至少有两个不同的登录,你得到...
- 应用程序的登录仍然可以做它需要做的一切
- user_generated_query 登录不能做任何你不希望它做的事情

于 2012-05-15T16:48:26.597 回答