Назад | Перейти на главную страницу

Запретить хотлинкинг на Nginx

Я пытаюсь защитить свои изображения от хотлинкинга. Мой первый подход был таким:

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 при попытке доступа к изображениям.