Я пытаюсь защитить свои изображения от хотлинкинга. Мой первый подход заключался в следующем:
location ~* \.(png|jpg)$ {
valid_referers none blocked server_names;
if ($invalid_referer) {
return 403;
}
}
Проблема здесь в теге none , потому что, если вы вводите URL-адрес напрямую, ссылки не будет. Таким образом, каждый веб-сайт может показывать мои изображения, если пользователь вводит URL-адрес напрямую. Поэтому я удалил тег none , и, к удивлению, он все еще работает на моем веб-сайте.
Если я ввожу свой URL напрямую, он все еще работает. Но почему?
Теперь мой референт пуст, но я все еще могу видеть свои изображения. Это определенно работает из-за тега server_names , но насколько я понимаю, server_names означает, что если у кого-то есть имя моего сервера в реферере, они могут показать мои изображения. Но если я ввожу свой URL напрямую, у меня не будет ссылки.
Может ли кто-нибудь мне это объяснить?
Это хорошо объяснено в документации для valid_referers
:
none
поле
Referer
отсутствует в заголовке запроса;
заблокировал
поле
Referer
присутствует в заголовке запроса, но его значение был удален брандмауэром или прокси-сервером; такие ценности строки, которые не начинаются сhttp: //
илиhttps://
;
server_names
поле заголовка запроса
Referer
содержит один из серверов names;
Он ведет себя так, как и предполагалось: none
разрешает запрос без какого-либо referer и server_names
referers, совпадающим с именами вашего сервера.
Эта настройка предназначена для предотвращения хотлинкинга, т.е. встраивание ваших изображений на другие сайты. Это не должно препятствовать просмотру изображений, если вы знаете URL-адрес, например, если вы ищете его в источнике страницы.
Кроме того, вы должны в первую очередь подумать об удобстве использования вашего сайта. В конце концов, вы просто хотите сделать заявление кому-то, кто использует ваши изображения на своих страницах, а не тому, кто их действительно просматривает. Некоторые браузеры или брандмауэры могут удалить реферер, в результате чего изображения исчезнут даже на вашем собственном сайте, если не разрешено none
.
Если вы хотите быть очень строгими, я не рекомендую , вы бы вообще не стали полагаться на реферера. Вместо этого вы можете установить ограниченный по времени файл cookie на своей странице и проверять его наличие при попытке доступа к изображениям.