PHP使用$ _SERVER ['HTTP_REFERER']创建反向链接

时间:2009-09-18 09:35:03

标签: php

使用以下方法创建反向链接是否安全:

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

还是有更好的解决方案?

6 个答案:

答案 0 :(得分:5)

更简单的方法可能是做这样的事情:

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

这不依赖于浏览器填充Referer标题,而是与按下浏览器“Back”按钮完全相同。

这可能被认为更好,因为它实际上在浏览器历史记录中 back ,而不是将前一页面添加到 forward 方向的浏览器历史记录中。它的行为与您期望的“后退”按钮一样。

答案 1 :(得分:2)

只要你检查它的存在,这是非常安全的。在某些浏览器中,它可以关闭,我不确定它是否对浏览器是强制性的。但基线是,你不能指望它存在。 (RFC2616并未说referer-header必须存在。)

如果你真的需要反向导航,也许你可以使用一个会话变量来保存之前的(当前是真的,但只是在显示反向链接后更新它)。

答案 2 :(得分:0)

鉴于:

  • referer标头是可选的
  • 某些安全软件会重写引用标题(例如XXXX:XXXXXXXX或广告产品)
  • 链接到引用者,充其量,复制后退按钮的内置功能
  • 用户通常会希望标记为“返回”的链接将其带到序列中的上一页,而不是显示在上一页上

不,这不安全。危险并不大,但好处很小。

答案 3 :(得分:0)

在某些情况下会起作用。但是,您应该知道HTTP referer标头不能保证。用户代理(浏览器,搜索spoders等)不能依赖于发送任何内容,无论是否正确。此外,如果用户直接浏览该页面,则不会出现任何引用标头。一些互联网安全软件产品甚至出于“安全”的原因剥离了HTTP引用者。

如果您希望使用此解决方案,请务必进行回退,例如不显示反向链接或链接到默认的起始页面等(这取决于要使用的情况)

另一种解决方案可能是使用javascript导航到“history.back”。这将使用浏览器的后退/历史记录功能返回用户所在的上一页。

答案 4 :(得分:0)

我认为Facebook使用类似的技术来重定向用户。

他们使用名为'from'的GET变量。

答案 5 :(得分:0)

你必须小心htmlentities,因为它会破坏非ASCII编码。例如,

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

显示为

  

Ïðèâåò,   äðóã!

这当然是不正确的。

每个浏览器都会根据需要在URL中发送非ASCI字符。 Mozilla采用Unicode,IE采用系统当前的字符集(俄罗斯的Windows-1251)。

因此,用htmlspecialchars替换htmlentities可能会有用。