Mod重写查询参数验证和阻止也会请求url阻止

时间:2019-05-07 13:16:57

标签: mod-rewrite url-rewriting url-rewrite-module

在我的网站上,只允许使用少量查询查询参数,但是,某些扫描器或黑客试图使用php应用程序不支持的唯一参数访问url,我可以通过验证{{1 }}参数,但是服务器正在加载,因此如果参数无效,我想显示403

查询参数可以任意顺序

到目前为止,我尝试的方法如下

$_GET

但是这里的问题是

# IF there is query string
RewriteCond %{QUERY_STRING} ^.+$

# Then parameters can be only query|debug|lang
# block any extra parameter
RewriteCond %{QUERY_STRING} !(^|$)(query|debug|lang)=[^&]+(&|$) [NC]

RewriteRule ^(.*)$ - [F,L]

即使黑客通过http://example.com/search?query=test&debug=on&lang=en&foo=bar ,它也要通过,我想显示404,在到达php应用程序之前进行严格的参数检查。

这里是:Rewrite Tester

它没有显示404

带有查询参数的有效网址示例

foo=bar

带有查询参数的无效网址示例

(检查是否有除允许的一个查询参数之外的其他查询参数???)

http://example.com/search?query=test&debug=on&lang=en

我可以在php中做同样的事情,但是我想在到达我的php应用程序之前阻止请求。

http://example.com/search?query=test&debug=on&lang=en&foo=bar
http://example.com/search?a=1
http://example.com/search?a=2
http://example.com/search?query=test&a=1

也在我的网站上,请求uri允许的字符为$allowed = array('query', 'lang', 'debug'); foreach($_GET as $key => $value) { if(!in_array($key, $allowed)) { http_response_code(403) die('Forbidden'); } }

如果请求uri包含多余的内容,如何阻止

也想知道,

  1. 是否可以重写以检查POST变量?
  2. 我看到许多可疑的代理人串起我该如何阻止他们
  3. 我还看到在引荐网址黑客中试图注入xss和sqlinjection字符串,如何阻止它们。

2 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

RewriteEngine on

#if there is query string
RewriteCond %{QUERY_STRING} ^.+$
# Then parameters can be only query|debug|lang
# block any extra parameter
RewriteCond %{QUERY_STRING} !^(query|debug|lang)=[^&]+&(query|debug|lang)=[^&]+&(query|debug|lang)=[^&]+$ [NC]
RewriteRule .* - [F,L]

对于与RewriteCond正则表达式不匹配的URL,这将返回403禁止错误。

答案 1 :(得分:1)

您可以用以下规则替换现有规则:

# Then parameters can be only query|debug|lang
# block any extra parameter
RewriteCond %{QUERY_STRING} ^(?!(?:query|debug|lang)=[^&]+(?:&(?:query|debug|lang)=[^&]+)*$). [NC]

RewriteRule ^ - [F]

如果URL中存在403以外的任何查询参数,则此规则将返回query|debug|lang

这里(?!...)是一个negative lookahead assertion,如果查询字符串除给定参数以外的任何内容,都将失败。


RegEx详细信息:

  • ^:开始
  • (?!:否定超前开始
    • (?:query|debug|lang)=[^&]+:匹配3个允许的查询参数之一及其值
    • (?::启动非捕获组
      • &:匹配一个&
      • (?:query|debug|lang)=[^&]+:匹配3个允许的查询参数之一及其值
    • )*:结束非捕获组。 *表示0或属于该组
    • $:结束
  • ):否定超前表达的结尾
  • .:确保查询字符串不为空

简单地说,当查询字符串具有除3个允许的参数以外的任何查询参数时,否定超前断言断言。