$ _SERVER ['HTTP_REFERER'] и файлы cookie - PullRequest
       6

$ _SERVER ['HTTP_REFERER'] и файлы cookie

2 голосов
/ 20 февраля 2011

Я читал, как на SO, так и на других сайтах, что $_SERVER['HTTP_REFERER'] - это то, чего мы, программисты, должны всегда избегать.Читая руководство по PHP, мы сталкиваемся со следующими строками:

Адрес страницы (если есть), которая направляла пользовательский агент на текущую страницу.Это устанавливается пользовательским агентом.Не все пользовательские агенты будут устанавливать это, а некоторые предоставляют возможность изменять HTTP_REFERER как функцию.Короче говоря, этому нельзя доверять.

Учитывая «пользовательские агенты», такие как веб-браузер (Safari, Chrome, Opera, Firefox, в основном все они), руководство говорит нам, что эта переменнаямогут быть изменены ими.Вот мой первый вопрос:

Вопрос 1 : почему «агент пользователя» должен изменить этот параметр?Почему веб-браузер не устанавливает этот параметр?

Это просто любознательность, и я не буду использовать $_SERVER['HTTP_REFERER'].Из моего последнего заявления, очевидно, что если нам нужна такая функция, нам нужно что-то придумать.Первое, что приходит мне в голову, это решение для файлов cookie, в котором мы делаем что-то вроде:

setcookie('latest_page', __FILE__, 60 * 60 * 24 * 7);

А затем, основываясь на том, как вы предпочитаете это делать, вы можете восстановить то, что вам нужно.Здесь встает второй и последний вопрос:

Вопрос 2 : Это лучший способ?Есть ли способ улучшить его?

Ответы [ 7 ]

5 голосов
/ 20 февраля 2011

Нет никаких оснований для избегать HTTP_REFERER.Просто при использовании имейте в виду, что он не всегда установлен и что клиент может свободно им манипулировать, поэтому это ненадежные данные.

Подавляющее большинство клиентов устанавливает переменную и делает это правильно.

Основная причина блокировки - конфиденциальность: например, при открытии электронной почты в клиенте веб-почты ссылки на внешние изображения будут содержать адрес службы веб-почты в заголовке HTTP_REFERER.Вот почему GMail и Yahoo прилагают усилия, чтобы заблокировать его .

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

<a href="otherpage.html?from=thispage.html">

Редактировать: Один из примеров, когда использование HTTP_REFERER опасно, - это показОбновленный список ссылающихся сайтов на вашей главной странице («Посетители пришли из ...») позволит легко вводить произвольные URL-адреса в этот список, посещая ваш сайт с поддельным набором HTTP_REFERER.

3 голосов
/ 20 февраля 2011

Почему «агент пользователя» должен изменять этот параметр? Почему веб-браузер не устанавливает этот параметр?

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

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

Это лучший способ? Есть ли способ улучшить его?

Это не сработает, если вы открыли веб-сайт в нескольких вкладках / окнах. Вам потребуется идентификатор для каждого запроса страницы, чтобы вы могли идентифицировать страницу, которая фактически ссылалась на этот:

  • Текущая запрашиваемая страница: / index.html
  • Запрос идентификатора текущей запрашиваемой страницы: 12345

Каждая ссылка будет содержать идентификатор запроса для идентификации запроса, который ссылается на следующую страницу:

<a href="/foo.html?request-id=12345">
<a href="/bar.html?request-id=12345">

Делая это также на формах и дополнительно используя непредсказуемое значение для идентификатора запроса страницы, вы также можете усложнить CSRF-атаку.

1 голос
/ 20 февраля 2011

Если вам нужна ссылка для возврата назад, вы должны использовать это:

<a href="javascript:history.back();"><< Go Back</a>

ИЛИ

<a href="javascript:history.go(-1);"><< Go Back</a>

Это лучший способ предоставить пользователям ссылку для возврата назад

1 голос
/ 20 февраля 2011

Решение на основе файлов cookie не является ни лучшим, ни решением вообще.
Никто не использует его, потому что файлы cookie относятся ко всему сайту.

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

0 голосов
/ 20 февраля 2011

Вопрос 1: Почему «агент пользователя» должен изменять этот параметр?Почему веб-браузер не устанавливает этот параметр?

Что ж, у веб-браузеров на самом деле нет причин не устанавливать этот параметр.Вам сказали избегать этого по той же причине, по которой некоторые браузеры избегали этого, что является неправильным использованием.Как и сохранение важной информации о сеансе в URL.

Вы не должны пытаться избегать ее использования, вы просто должны использовать ее ответственно.И не нужно использовать какой-либо «трюк».Например, очень часто его используют в качестве навигации «Возобновить».Скажем, у кого-то сеанс истек с вашей веб-страницыВы можете отправить их на страницу авторизации.А затем перенаправьте их на запрошенный URL.

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

  1. Запустить браузер (информация не сохраняется вкуки-файлы o сессий)
  2. Перейти на www.YourApp.com/restrictedZone.php
  3. Перенаправить на вход
  4. Выполнено задание на вход
  5. Вместо этого перенаправить в зону с ограниченным доступомof 'index.php' или 'home.php'

Вы должны просто убедиться, что вы проверяете действительный сеанс на ВСЕХ ваших страницах "зоны ограниченного доступа".

0 голосов
/ 20 февраля 2011

Ссылка Http может быть опасной, если она должна что-то делать с базой данных вашего сайта, если она не очищена. Это также полностью клиентская сторона, так что есть шанс, что кто-то может использовать его. Но кроме этого в этом нет ничего плохого.

Также можно изменить файлы cookie. Если вы хотите что-то, что не может быть изменено пользователем, зайдите в Php Sessions.

0 голосов
/ 20 февраля 2011

Хорошо, помните, что, как и любой заголовок, который устанавливает клиент, он может быть подделан.Так что используйте это с умом.

...