阻止 POST PUT 和 DELETE 但允许来自特定引荐来源的 GET

阻止 POST PUT 和 DELETE 但允许来自特定引荐来源的 GET

我正在使用 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;
   }

相关内容