我在SO和其他网站上都看到,$_SERVER['HTTP_REFERER']
是我们作为程序员应该始终避免的事情。阅读PHP手册,我们遇到以下几行:
将用户代理引用到当前页面的页面地址(如果有)。这是由用户代理设置的。并非所有用户代理都会设置此功能,有些用户可以将HTTP_REFERER修改为功能。简而言之,它无法真正被信任。
考虑到“用户代理”之类的东西,例如Web浏览器(Safari,Chrome,Opera,Firefox,基本上它们都是),手册告诉我们这个变量可能会被它们改变。 这是我的第一个问题:
问题1 :“用户代理”为什么要修改此参数? Web浏览器不设置此参数的原因是什么?
这只是好奇心,我不会使用$_SERVER['HTTP_REFERER']
。
从我最近的陈述中可以看出,如果我们确实需要这样的功能,我们需要弄明白。我想到的第一件事是一个cookie解决方案,我们在其中执行以下操作:
setcookie('latest_page', __FILE__, 60 * 60 * 24 * 7);
然后,根据您喜欢的方式,您可以恢复所需的内容。 这是第二个也是最后一个问题:
问题2 :这种方式最好吗?有没有办法改善它?
答案 0 :(得分:5)
没有理由避免 HTTP_REFERER
。就在使用它时,请注意它并不总是设置,并且它可以由客户端自由操作,因此它是不受信任的数据。
绝大多数客户端设置变量,并且正确地执行此操作。
阻止它的主要原因是隐私:例如,在Web邮件客户端中打开电子邮件时,指向外部图像的链接将在HTTP_REFERER
标题中携带Web邮件服务的地址。这就是为什么GMail and Yahoo make efforts to block it。
您建议的解决方法仅适用于同一网站内的移动,如果用户打开了多个用于浏览您网站的标签/浏览器窗口,则会中断。如果你需要知道引用页面,那么优越的方法是添加一个GET参数,如
<a href="otherpage.html?from=thispage.html">
编辑:依赖HTTP_REFERER危险的一个示例是在主页上显示实时更新的引荐网站列表(“访问者来自......”)这很容易通过使用假HTTP_REFERER
集访问您的网站,将任意网址走私到该列表中。
答案 1 :(得分:3)
“用户代理”为什么要修改此参数? Web浏览器不设置此参数的原因是什么?
HTTP引用来源可用于分析用户的行为,因为您可以看到引用当前页面的页面。它还可以向第三方站点显示敏感数据,例如URL中的会话ID。这就是为什么许多网站使用dereferrer作为所有外部链接的单一退出页面。
这是一些用户代理根本不发送HTTP引用的主要原因。与此相反,HTTP引用仅在您实际关注链接或在页面上提交表单时发送。否则触发的任何请求(HTTP重定向,通过位置栏/书签直接请求)都不是推荐人。
这种方式最好吗?有没有办法改善它?
如果您在多个标签/窗口中打开了网站,那么这样做是行不通的。您需要为每个页面请求设置一个标识符,以便您可以识别实际引用此页面的页面:
然后,每个链接都包含请求ID,以标识引用下一页的请求:
<a href="/foo.html?request-id=12345">
<a href="/bar.html?request-id=12345">
通过在表单上执行此操作以及另外使用页面请求ID的不可预测值,您还可以使CSRF攻击更加困难。
答案 2 :(得分:1)
基于Cookie的解决方案根本不是最佳解决方案,也不是解决方案 没有人使用它,因为cookie是一个网站范围内的问题。
大部分时间“回去”链接都没用。每个现代浏览器都有一个后退按钮 如果你想要实现它,只需使其与在其他站点上实现的方式相同。
答案 3 :(得分:1)
如果您需要返回链接,请使用此选项:
<a href="javascript:history.back();"><< Go Back</a>
OR
<a href="javascript:history.go(-1);"><< Go Back</a>
这是向用户提供返回链接的最佳方式
答案 4 :(得分:0)
好吧,请记住,就像客户端设置的任何标头一样,它可能会被篡改。所以明智地使用它。
答案 5 :(得分:0)
如果不进行清理,如果必须对您的网站数据库执行某些操作,那么Http引用可能会很危险。它也完全是客户端,因此有可能有人可以利用它。但除此之外,它没有任何问题。
Cookie也可以更改。如果您想要用户无法更改的内容,请使用Php Sessions。
答案 6 :(得分:0)
问题1:为什么要“用户代理” 修改这个参数?什么是 Web浏览器无法设置的原因 这个参数?
嗯,网络浏览器真的没有理由不设置它。你被告知要避免它,因为一些浏览器会避免使用它,这是误用。就像在URL中保存重要的会话信息一样。
你不应该试图避免使用它,你应该负责任地使用它。而不必使用任何'噱头'。例如,将其用作“简历”导航非常常见。比方说某人会话使用您的网页过期。您可以将它们发送到登录凭据页面。然后将它们重定向到请求的URL。
当他们尝试首次访问您的网页而不通过登录屏幕时也是如此。
您应该确保在所有“限制区域”页面上检查有效会话。