首页 > 解决方案 > Apache - 阻止请求,但仅当查询字符串中不存在三个关键字时

问题描述

对于包含示例select、md5、declare、drop和类似内容的任何 GET 请求,我需要返回 403 ,但前提是QUERY_STRING中不存在以下三个关键字(key1、key2keyx)。

当前情况(如果查询字符串中不存在名称或类型或值,则可以正常工作):

RewriteCond %{QUERY_STRING} !(^|&)/key1|key2|keyx/($|&) 
RewriteCond %{QUERY_STRING} ^.*(phpunit|md5|benchmark|union|cast|declare|drop).* [NC]

基本上,当查询字符串中存在所有三个关键字时,我只需要绕过第二行的规则。

标签: regexapache.htaccesswebserver

解决方案


您可以使用以下 2 个条件:

RewriteCond %{QUERY_STRING} !(^|&)(key1|key2|keyx)\b [NC]
RewriteCond %{QUERY_STRING} \b(phpunit|md5|benchmark|union|cast|declare|drop)\b [NC]
  • \b用于单词边界
  • mod_rewrite 模式不允许/.../像 Javascript 这样的符号
  • 您的尝试分组错误
  • .*关键字前后无需匹配

推荐阅读