Да, это безопасно
К сожалению, holy text предлагает предоставить возможность отключить реферера (но вы все еще не можете придумать свой собственный механизм того, что такое реферер) является); действительно, кто-то может отключить ссылки в своем браузере, тем самым лишив себя доступа к вашему сайту.
Ваше решение является безопасным, но пользователи могут на законных основаниях жаловаться, если ваш сайт работает только с включенными реферерами.
Это очень печально, потому что теперь это означает, что не существует вменяемого способа гарантировать, что ваш сайт не защищен от CSRF.
Alternative
Единственное, что вы действительно можете сделать, это добавить nonce в каждый аутентифицированный запрос к вашему веб-сервису. Это, однако, несколько опасно, потому что вы должны убедиться, что каждая точка запроса на вашем веб-сервисе проверяет одноразовый номер. Тем не менее, вы можете использовать платформу, чтобы сделать это для вас, чтобы немного перенести это раздражение. Похоже, что переполнение стека использует одноразовые номера.
Однако
Рефереры в принципе немного более безопасны, потому что вы можете просто применить глобальное правило, которое гласит, что запрос не может быть выполнен, если реферер не находится в том же домене. Это приемлемо, если вы хотите удалить пользователей, которые отключают рефереры.
Вопреки тому, что здесь говорят глупости, вы не можете выдать HTTP-запрос с поддельным заголовком из непривилегированного кода браузера. Как и ожидалось, Flash смог сделать это один раз, чтобы обойти анти-CSRF, который опирается на реферер, но он был исправлен. Почему это было исправлено? Поскольку HTTP RFC диктует, что такое реферер, и, следовательно, вам не разрешено изменять его значение в коде клиента, чтобы ваш клиент не был небезопасным.
Кто-то здесь даже утверждал, что Java-апплет может выдавать произвольные заголовки по HTTP другому домену, но это просто не тот случай, потому что Java-апплету в песочнице не разрешено делать запросы к всему , кроме домен, на котором он был загружен. Он быстро удалил свой комментарий, прежде чем кто-то мог исправить его ...
Показательный пример
Веб-браузер - это HTTP-клиент. HTTP-клиент должен соответствовать HTTP RFC; таким образом он должен придерживаться того, что RFC заявляет, что заголовок реферера должен выглядеть. Поскольку веб-браузер является клиентом HTTP, любое приложение, встроенное в веб-браузер , не должно иметь возможность отправлять запросы, нарушающие протокол HTTP. Дело в том, что каждое нарушение стандарта является потенциальной дырой в безопасности.
В любом случае: нет правильного способа определить, является ли запрос от вашего домена или домена противника. Это всего лишь один из многих печальных недостатков Интернета. Вы должны использовать один из упомянутых обходных путей.