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

Перенаправление пользователей, пришедших не с того Referer

Игнорируя достоинства того, следует ли нам вносить это изменение или нет (обстоятельства несколько сложны и, вероятно, охватываются моим соглашением о неразглашении информации), наш клиент хотел бы, чтобы мы потребовали, чтобы посетители сайта, который мы создаем, пришли с другого из их сайтов. Если пользователь приходит к нам откуда-то еще, он должен быть отправлен на экран входа на этот другой сайт.

Похоже, самый простой способ сделать это - использовать mod_rewrite для перенаправления чего-либо с помощью реферера, который не является ни нашим сайтом, ни этим другим.

Мое текущее мышление

В httpd.conf

RewriteMap deflector txt:/path/to/deflector.map
RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} =NOT-FOUND
RewriteRule ^ http://www.theothersite.com/login.jsp [R=307,L]

В deflector.map

//www.oursite.com/ -
//oursite.com/ -
//www.theothersite.com/ -
//theothersite.com/ -

Это позволило бы нам легко расширить список «допустимых источников перехода», что кажется хорошей идеей.

Тогда у меня есть три вопроса:

  1. Является mod_rewrite (который мы уже активно используем) лучший способ сделать это?
  2. Если да, то это 307 Temporary Redirect ответ лучший способ справиться с этим?
  3. Поскольку я в первую очередь не разработчик / администратор LAMP, допустил ли я какие-нибудь глупые опечатки в этих правилах перезаписи? ; о)

Мне кажется, что 307 Temporary Redirect или 403 Forbidden являются наиболее подходящими коды состояния и я полагаю, что это Плохая вещь ™ - отправлять Location: заголовок перенаправления с 4xx ответ.

Все это имеет смысл?

Редактировать: Случай поиска по карте-вчувствительный по умолчанию? Мне нужно беспокоиться о случае здесь?
Изменить 2: Поиск по карте - это поиск по регулярному выражению или совпадение по всему ключу? Если карта содержит www.foo.com и Referer: заголовок читает http://www.foo.com/bar.php будет ли это совпадать?

Я думаю, что карта будет чувствительна к регистру, а также вам нужно извлечь имя хоста из Referer. Я его вообще не тестировал, но, возможно, что-то вроде этого может сработать:

RewriteMap deflector txt:/path/to/deflector.map
RewriteMap lc int:tolower
RewriteCond %{HTTP_REFERER} ^https?://([^:/?]+)
RewriteCond ${lc:%1} (.+)
RewriteCond ${deflector:%1|NOT-FOUND} =NOT-FOUND
RewriteRule ^ http://example.com/ [L]

Не путайтесь с необычными кодами ответа; значение по умолчанию 302 нормально.

Фактически мы сделали следующее:

RewriteCond %{REMOTE_HOST} !A.B.C.(D|E)
RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?://\1/ [NC]
RewriteCond %{HTTP_REFERER} !https?://referring.domain.com/ [NC]
RewriteRule ^ https://referring.domain.com/path/to/login/script [R,L]

Первый RewriteCond (и еще несколько подобных строк) означают, что разработчики и клиент не ограничены этой проверкой реферера (так как очень утомительно идти туда, прежде чем перейти на наш сайт).

Второй RewriteCond это гениальная работа, чтобы проверить, совпадает ли реферер с Host: в запросе. Это основано на Террис ответ на SO # 7398191: общая проверка реферера mod_rewrite - так как mod_rewrite выполняет только интерполяцию переменных в тестовой строке, у вас не может быть чтения строки

RewriteCond %{HTTP_HOST} !^https?://%{HTTP_REFERER}/ [NC]

поскольку он просто не будет выполнять эту проверку.

Очевидно, нам «никогда» не нужно будет разрешать другие источники перехода. Если бы мы это сделали, я бы просто установил последний RewriteCond линия до конца [NC,OR] и связать еще несколько условий.

Все работает нормально. Спасибо за вашу помощь всем!