Блокировать POST PUT и DELETE, но разрешить GET от конкретного реферера
Я использую 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; }
Кажется, очень чисто, но не работает.
Есть ли способ к этому?
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;
}