Блокировать POST PUT и DELETE, но разрешить GET от конкретного реферера

0

Я использую nginx и хочу блокировать запросы на публикацию, размещение и удаление, когда они приходят от неизвестного реферера.

То есть, у меня есть реферер: " .example.com", и от этого реферера я хочу разрешить все GET, PUT и POST (да, я знаю, что легко подделать реферер ...), если " .example.com" не реферер, только GET должен быть разрешен.

Все решения, с которыми я пришел, не работают ...

Я хотел бы иметь это на блоке сервера, чтобы сделать все чисто (я использую очень большой файл со всеми расположениями).

Мой первый подход был:

limit_except none block имя_сервера * .example.com {if ($ http_request! = GET) {запретить все; }

Но я не могу вкладывать, если ...

Затем я попробовал это:

карта $ http_referer $ allow_referer {по умолчанию 0; "~ example.com" 1; } map $ allow_referer $ disallow_referer {0 1; 1 ""; }

местоположение ... {... if ($ invalid_referer) {limit_except GET {запретить все; }}}

То же, что и выше. Затем я использовал файл конфигурации, который нашел в сети, с некоторыми изменениями:

установить $ cors '';

if ($ http_origin ~ * (https?: //.*.example.com (: [0-9] +)?)) {set $ cors "true"; }

if ($ request_method = 'OPTIONS') {set $ cors "$ {cors} options"; }

if ($ request_method = 'GET') {set $ cors "$ {cors} get"; }

if ($ request_method = 'POST') {set $ cors "$ {cors} post"; }

if ($ request_method = 'PUT') {set $ cors "$ {cors} put"; }

if ($ request_method = 'DELETE') {set $ cors "$ {cors} delete"; }

if ($ cors = "trueget") {return 200; }

if ($ cors = "truepost") {return 403; }

if ($ cors = "trueput") {return 403; }

if ($ cors = "truedelete") {return 403; }

Кажется, очень чисто, но не работает.

Есть ли способ к этому?

Жоао Перейра
источник

Ответы:

0

Я добавил это в блок сервера, и он работает:

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;
   }
Жоао Перейра
источник
Если это решено, пометьте его как решенное, щелкнув галочку слева, чтобы он стал зеленым.
Майкл Хэмптон