【发布时间】:2019-09-25 04:06:36
【问题描述】:
在我的网站上,只允许少数查询参数,但是,一些扫描程序或黑客试图使用我的 php 应用程序不支持的唯一参数访问 url,我可以通过验证 $_GET 在 php 应用程序级别阻止它们参数,但我的服务器正在加载,所以如果参数无效,我想显示 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
带有查询参数的有效网址示例
http://example.com/search?query=test&debug=on&lang=en
带有查询参数的无效网址示例
(检查是否有除允许的以外的任何查询参数???)
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 字符串时,我该如何阻止它们。
【问题讨论】:
-
你能发布一些你想拒绝/允许访问的 url 示例吗?
-
@starkeen : 示例
http://example.com/search?query=test&debug=on&lang=en&foo=bar无效,因为只允许lang,debug,query查询参数,如果任何扫描器尝试这三个参数以外的其他参数,则应该得到 403 -
@starkeen:添加了更多描述
标签: mod-rewrite url-rewriting url-rewrite-module