Mod 重写查询参数验证和阻塞也请求 url 阻塞
Mod rewrite query parameter validation and blocking also request url blocking
在我的站点上,只允许使用少数查询参数,但是一些扫描器或黑客试图使用我的 php 应用程序不支持的独特参数访问 url,我可以阻止它们在 php 应用程序级别,通过验证 $_GET
参数,但是我的服务器正在加载,所以如果参数无效我想显示 403
查询参数可以任意顺序
目前我试过的如下
# 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
即使黑客通过 foo=bar
,它也通过了,我想显示 404,在到达 php 应用程序之前严格检查参数。
这里是:Rewrite Tester
它没有显示 404
带有查询参数
的有效 url 示例
http://example.com/search?query=test&debug=on&lang=en
带有查询参数
的无效示例 url
(检查是否有允许的查询参数以外的参数???)
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
我可以在 php 中做同样的事情,但我想在到达我的 php 应用程序之前阻止请求。
$allowed = array('query', 'lang', 'debug');
foreach($_GET as $key => $value)
{
if(!in_array($key, $allowed))
{
http_response_code(403)
die('Forbidden');
}
}
同样在我的网站上,请求 uri 允许的字符是 [A-Za-z0-9_-]
如果请求 uri 包含任何额外内容,我该如何阻止
也想知道,
- 重写是否也可以检查 POST 变量?
- 我看到很多可疑代理字符串,我该如何阻止它们
- 我还在推荐中看到 url 黑客试图注入 xss 和 sqlinjection 字符串,我该如何阻止它们。
您可以使用以下内容:
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,这将 return 出现 403 禁止错误。
您可以用此规则替换现有规则:
# 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.
中存在 query|debug|lang
以外的任何查询参数,则此规则将 return 403
此处 (?!...)
是一个 negative lookahead assertion,如果查询字符串包含给定参数以外的任何参数,它将失败。
正则表达式详细信息:
^
: 开始
(?!
:负先行开始
(?:query|debug|lang)=[^&]+
:匹配 3 个允许的查询参数之一及其值
(?:
: 开始non-capture组
&
:匹配一个&
(?:query|debug|lang)=[^&]+
:匹配 3 个允许的查询参数之一及其值
)*
: 结束non-capture组。 *
表示0或本组
$
:结束
)
:负先行表达式结束
.
: 确保查询字符串不为空
简而言之,当查询字符串具有除 3 个允许参数之外的任何查询参数时,否定先行断言失败。
在我的站点上,只允许使用少数查询参数,但是一些扫描器或黑客试图使用我的 php 应用程序不支持的独特参数访问 url,我可以阻止它们在 php 应用程序级别,通过验证 $_GET
参数,但是我的服务器正在加载,所以如果参数无效我想显示 403
查询参数可以任意顺序
目前我试过的如下
# 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
即使黑客通过 foo=bar
,它也通过了,我想显示 404,在到达 php 应用程序之前严格检查参数。
这里是:Rewrite Tester
它没有显示 404
带有查询参数
的有效 url 示例http://example.com/search?query=test&debug=on&lang=en
带有查询参数
的无效示例 url(检查是否有允许的查询参数以外的参数???)
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
我可以在 php 中做同样的事情,但我想在到达我的 php 应用程序之前阻止请求。
$allowed = array('query', 'lang', 'debug');
foreach($_GET as $key => $value)
{
if(!in_array($key, $allowed))
{
http_response_code(403)
die('Forbidden');
}
}
同样在我的网站上,请求 uri 允许的字符是 [A-Za-z0-9_-]
如果请求 uri 包含任何额外内容,我该如何阻止
也想知道,
- 重写是否也可以检查 POST 变量?
- 我看到很多可疑代理字符串,我该如何阻止它们
- 我还在推荐中看到 url 黑客试图注入 xss 和 sqlinjection 字符串,我该如何阻止它们。
您可以使用以下内容:
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,这将 return 出现 403 禁止错误。
您可以用此规则替换现有规则:
# 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.
中存在query|debug|lang
以外的任何查询参数,则此规则将 return 403
此处 (?!...)
是一个 negative lookahead assertion,如果查询字符串包含给定参数以外的任何参数,它将失败。
正则表达式详细信息:
^
: 开始(?!
:负先行开始(?:query|debug|lang)=[^&]+
:匹配 3 个允许的查询参数之一及其值(?:
: 开始non-capture组&
:匹配一个&
(?:query|debug|lang)=[^&]+
:匹配 3 个允许的查询参数之一及其值
)*
: 结束non-capture组。*
表示0或本组$
:结束
)
:负先行表达式结束.
: 确保查询字符串不为空
简而言之,当查询字符串具有除 3 个允许参数之外的任何查询参数时,否定先行断言失败。