使用以下方法创建反向链接是否安全:
$backLink = htmlentities($_SERVER['HTTP_REFERER']);
还是有更好的解决方案?
答案 0 :(得分:5)
更简单的方法可能是做这样的事情:
<a href="javascript:history.back()">Go back</a>
这不依赖于浏览器填充Referer标题,而是与按下浏览器“Back”按钮完全相同。
这可能被认为更好,因为它实际上在浏览器历史记录中 back ,而不是将前一页面添加到 forward 方向的浏览器历史记录中。它的行为与您期望的“后退”按钮一样。
答案 1 :(得分:2)
只要你检查它的存在,这是非常安全的。在某些浏览器中,它可以关闭,我不确定它是否对浏览器是强制性的。但基线是,你不能指望它存在。 (RFC2616并未说referer-header必须存在。)
如果你真的需要反向导航,也许你可以使用一个会话变量来保存之前的(当前是真的,但只是在显示反向链接后更新它)。
答案 2 :(得分:0)
鉴于:
不,这不安全。危险并不大,但好处很小。
答案 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可能会有用。