PHP создает обратную ссылку с $ _SERVER ['HTTP_REFERER'] - PullRequest
0 голосов
/ 18 сентября 2009

Безопасно ли создавать обратную ссылку с:

$backLink = htmlentities($_SERVER['HTTP_REFERER']);

или есть лучшее решение?

Ответы [ 6 ]

5 голосов
/ 18 сентября 2009

Проще всего сделать что-то вроде этого:

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

Это не связано с тем, что браузер заполняет заголовок Referer, а делает то же самое, что и нажатие кнопки «Назад» в браузере.

Это может считаться лучшим, поскольку на самом деле он возвращается на назад в истории браузера, вместо добавления предыдущей страницы в историю браузера в направлении forward . Он действует так же, как вы ожидаете, что кнопка Назад будет действовать.

2 голосов
/ 18 сентября 2009

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

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

0 голосов
/ 18 сентября 2009

Вы должны быть осторожны с htmlentities, потому что это повреждает не-ASCII кодировку. Например,

echo(htmlentities("Привет, друг!")); //Contains russian letters

отображается как

& Iuml; & ETH; & egrave; & ACIRC; & Aring; & ograve ;, & AUML; & ETH; & oacute; & atilde;!

Что, конечно, неверно.

Каждый браузер отправляет не-ASCI символы в URL-адресах так, как он хочет. Mozilla в Unicode, IE в текущей кодировке системы (Windows-1251 в России).

Так что, возможно, было бы полезно заменить htmlentities на htmlspecialchars.

0 голосов
/ 18 сентября 2009

Я думаю, что Facebook использует похожую технику для перенаправления пользователя.

Они используют переменную GET, которая называется 'from'.

0 голосов
/ 18 сентября 2009

В некоторых случаях это будет работать. Однако вы должны знать, что заголовок реферера HTTP не гарантируется . Пользовательские агенты (браузеры, поисковые сподеры и т. Д.) Не могут полагаться на отправку чего-либо, правильного или нет. Кроме того, если пользователь переходит непосредственно к странице, заголовок реферера не будет представлен. Некоторые программные продукты для интернет-безопасности даже убирают реферер HTTP по соображениям «безопасности».

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

Альтернативным решением может быть использование JavaScript для перехода к «history.back». Это позволит использовать функцию возврата / истории браузера, чтобы вернуться на предыдущую страницу, на которой был пользователь.

0 голосов
/ 18 сентября 2009

Учитывая, что:

  • Заголовок реферера необязателен
  • Некоторое программное обеспечение безопасности переписывает заголовок реферера (например, в XXXX: XXXXXXXX или Advert For Product)
  • Ссылка на реферера, в лучшем случае , дублирует встроенную функциональность кнопки возврата
  • Пользователи часто ожидают, что ссылка с пометкой «назад» приведет их к предыдущей странице в последовательности, а не к предыдущей странице, на которой они были

Нет, это не безопасно. Опасности не велики, но выгоды крошечны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...