我正在使用 nginx,并且我想阻止来自未知引荐来源的发布、放置和删除请求。
意思是,我有推荐人:“.example.com”,并且我希望允许来自此引荐来源的所有 GET、PUT 和 POST(是的,我知道这很容易伪造引荐来源...),如果“.example.com" 不是引荐来源,只应允许 GET。
我想到的所有解决方案都不起作用......
我希望在服务器块上有这个,以使一切都干净(我使用一个包含所有位置的非常大的文件)。
我的第一个方法是:
limit_except none 阻止 server_names *.example.com { if ($http_request != GET) { 拒绝所有; }
但是,我不能嵌套 if ...
然后我尝试了这个:
映射 $http_referer $allow_referer { 默认 0; "~example.com" 1; } 映射 $allow_referer $disallow_referer { 0 1; 1 ""; }
位置 ... { ... if ($invalid_referer) { limit_except GET { 全部拒绝; } } }
同上。然后,我使用从网上找到的配置文件并进行了一些修改:
设置$cors';
如果 ($http_origin ~* (https?://.*.example.com(:[0-9]+)?)) { 设置 $cors "true"; }
如果 ($request_method = 'OPTIONS') { 设置 $cors "${cors}options"; }
如果 ($request_method = 'GET') { 设置 $cors "${cors}get"; }
如果 ($request_method = 'POST') { 设置 $cors "${cors}post"; }
如果 ($request_method = 'PUT') { 设置 $cors "${cors}put"; }
如果 ($request_method = 'DELETE') { 设置 $cors "${cors}delete"; }
如果 ($cors = "trueget") { 返回 200; }
如果 ($cors = "truepost") { 返回 403; }
如果 ($cors = "trueput") { 返回 403; }
如果 ($cors = "truedelete") { 返回 403; }
看起来很干净但是没有作用。
有什么办法吗?
答案1
我将其添加到服务器块并且它可以工作:
add_header Allow "GET, POST, PUT, DELETE, HEAD" always;
valid_referers none blocked server_names *.example.com;
if ($request_method !~ ^(GET)$ ) {
set $req A;
}
if ($invalid_referer) {
set $ref "${req}A";
}
if ($ref = AA) {
return 403;
}