Nginx,如何检查是否有一些额外的查询参数(未知)未包含在允许的参数列表中

Nginx,如何检查是否有一些额外的查询参数(未知)未包含在允许的参数列表中,nginx,Nginx,我试图找到一种方法来检测nginx URL中未包含在允许参数列表中的任何额外查询参数。目标是阻止任何查询参数未包含在此列表中的请求 正确的url: 错误的url: 我管理了一个流量巨大的网站,有很多来自多个机器人的滥用。我在nginx中使用microching来保护站点,但是bot试图使用这个额外的参数来绕过缓存效果 我已经让缓存正常工作,并在fastcgi_cache_密钥中添加正确的密钥,而不考虑这个“额外”参数,从而减轻了这种滥用 但现在我想阻止他们 谢谢你的建议。使用正则表达式 例如,如

我试图找到一种方法来检测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,如果结果不是空的,则拒绝它们。但我不知道怎么做。