Nginx,如何检查是否有一些额外的查询参数(未知)未包含在允许的参数列表中
我试图找到一种方法来检测nginx URL中未包含在允许参数列表中的任何额外查询参数。目标是阻止任何查询参数未包含在此列表中的请求 正确的url: 错误的url: 我管理了一个流量巨大的网站,有很多来自多个机器人的滥用。我在nginx中使用microching来保护站点,但是bot试图使用这个额外的参数来绕过缓存效果 我已经让缓存正常工作,并在fastcgi_cache_密钥中添加正确的密钥,而不考虑这个“额外”参数,从而减轻了这种滥用 但现在我想阻止他们Nginx,如何检查是否有一些额外的查询参数(未知)未包含在允许的参数列表中,nginx,Nginx,我试图找到一种方法来检测nginx URL中未包含在允许参数列表中的任何额外查询参数。目标是阻止任何查询参数未包含在此列表中的请求 正确的url: 错误的url: 我管理了一个流量巨大的网站,有很多来自多个机器人的滥用。我在nginx中使用microching来保护站点,但是bot试图使用这个额外的参数来绕过缓存效果 我已经让缓存正常工作,并在fastcgi_cache_密钥中添加正确的密钥,而不考虑这个“额外”参数,从而减轻了这种滥用 但现在我想阻止他们 谢谢你的建议。使用正则表达式 例如,如
谢谢你的建议。使用正则表达式 例如,如果此检查仅针对
/search
URI,并且q=
的值可以是任何文本,order=
的值可以是asc
或desc
,则可以使用:
location = /search {
if ($args !~ ^q=[^&]+&order=(asc|desc)$) { return 403; }
...
}
~
运算符是正则表达式的负匹配项。块的其余部分包含处理请求所需的语句
请参见关于的使用,如果
或者,在映射中使用正则表达式。有关详细信息,请参阅
例如,与上述检查相同,但不必使用额外的位置
块:
map $request_uri $reject {
default 0;
~^/search[?]q=[^&]+&order=(asc|desc)$ 0;
~^/search[?]order=(asc|desc)&q=[^&]+$ 0;
~^/search$ 1;
}
server {
if ($reject) { return 403; }
...
}
正则表达式是按顺序计算的,因此第一个正则表达式将只匹配有效的URI,而最后一个正则表达式将拒绝任何无效的/search
URI
map
的优点是,您可以轻松添加案例,例如其他URI和参数反转的案例(如上例所示)。使用正则表达式
例如,如果此检查仅针对/search
URI,并且q=
的值可以是任何文本,order=
的值可以是asc
或desc
,则可以使用:
location = /search {
if ($args !~ ^q=[^&]+&order=(asc|desc)$) { return 403; }
...
}
~
运算符是正则表达式的负匹配项。块的其余部分包含处理请求所需的语句
请参见关于的使用,如果
或者,在映射中使用正则表达式。有关详细信息,请参阅
例如,与上述检查相同,但不必使用额外的位置
块:
map $request_uri $reject {
default 0;
~^/search[?]q=[^&]+&order=(asc|desc)$ 0;
~^/search[?]order=(asc|desc)&q=[^&]+$ 0;
~^/search$ 1;
}
server {
if ($reject) { return 403; }
...
}
正则表达式是按顺序计算的,因此第一个正则表达式将只匹配有效的URI,而最后一个正则表达式将拒绝任何无效的/search
URI
map
的优点是,您可以轻松添加案例,例如其他URI和参数反转的情况(如上面的示例所示)。感谢您的回答,但它比这更复杂。可能的URL是整个站点的URL,有8个可能的有效参数可以按任何顺序指定(将来可能会更多),因此“if”和“map”可能会变得非常大,并且很难维护。理想的方法是获取整个args列表,减去有效的args,如果结果不是空的,则拒绝它们。但我不知道怎么做。谢谢你的回答,但比这更复杂。可能的URL是整个站点的URL,有8个可能的有效参数可以按任何顺序指定(将来可能会更多),因此“if”和“map”可能会变得非常大,并且很难维护。理想的方法是获取整个args列表,减去有效的args,如果结果不是空的,则拒绝它们。但我不知道怎么做。