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