Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用regex从drop、truncate等命令扫描查询。。?_Php_Sql_Regex - Fatal编程技术网

Php 如何使用regex从drop、truncate等命令扫描查询。。?

Php 如何使用regex从drop、truncate等命令扫描查询。。?,php,sql,regex,Php,Sql,Regex,我在正则表达式方面遇到了问题 我正在尝试对查询字符串使用preg_match。我希望它排除掉任何一个drop或truncate序列,不管大小写是什么?I在'or'之间,并且在序列和两个符号之间有任意数量的字符,但我希望捕捉到这两个词中不在两个符号之间的任何一个 如果您还没有猜到,我想检测输入是否试图删除|截断任何内容,但是如果不将这些词从非恶意输入中排除,就没有简单的方法可以做到这一点 e、 g 我希望这不会触发: SELECT * FROM `drop` SELECT * FROM 'drop

我在正则表达式方面遇到了问题

我正在尝试对查询字符串使用preg_match。我希望它排除掉任何一个drop或truncate序列,不管大小写是什么?I在'or'之间,并且在序列和两个符号之间有任意数量的字符,但我希望捕捉到这两个词中不在两个符号之间的任何一个

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

e、 g

我希望这不会触发:

SELECT * FROM `drop`
SELECT * FROM 'drop_truncate' -- drop drop
但这可能引发:

DROP TABLE `users`

编辑:所以我的问题是关于正则表达式的,我收到了关于数据库安全性的答案,毫无疑问,这个问题中有一些东西让你这么想,很抱歉误导了你!不,我不关心数据库的安全性,因为我已经处理过了,我只想检查是否有使用drop或truncate的意图,并将其记录到某个地方。唉

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

这句话在这里,但没有一个简单的方法可以做到这一点是错误的。你只是想以一种狭隘的思维方式“确保”这一投入

不允许用户通过输入用户定义的SQL来破坏您的查询


请至少研究一下。在解释其PDO库方面有一个很好的开端。虽然我强烈建议不要使用preg_match来防止恶意查询意图,但如果您真的认为这是您的最佳做法,请参阅的答案。提示:不是。

看起来您将在同一登录下运行应用程序查询和用户生成的查询。这将强制您检查用户定义的查询是否正常

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

所以,假设他们确实通过了你的精神检查。你如何保护自己? -限制数据库本身的权限

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

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

通过至少两次不同的登录,您可以。。。 -应用程序的登录仍然可以执行它需要执行的所有操作
-用户生成的查询登录不能做任何您不想做的事情

真正的解决方案是不逐字记录用户输入并运行它。你不是在寻找一个正则表达式,你在寻找一种方法来接受用户输入并构造一个不会做危险事情的查询——需要担心的不仅仅是删除和截断——那么为什么要问这个问题呢?只需问真正的问题。您正在将用户提交的sql提供给您的数据库?如果用户不能执行某些操作,则数据库应使用适当的权限阻止它