$ _SERVER ['HTTP_REFERER']和cookies

时间:2011-02-20 13:01:17

标签: php http-referer

我在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 :这种方式最好吗?有没有办法改善它?

7 个答案:

答案 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重定向,通过位置栏/书签直接请求)都不是推荐人。

  

这种方式最好吗?有没有办法改善它?

如果您在多个标签/窗口中打开了网站,那么这样做是行不通的。您需要为每个页面请求设置一个标识符,以便您可以识别实际引用此页面的页面:

  • 当前请求的页面: /index.html
  • 当前请求页面的请求ID:12345

然后,每个链接都包含请求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。

当他们尝试首次访问您的网页而不通过登录屏幕时也是如此。

  1. 启动浏览器(Cookie会话中没有保存信息)
  2. 访问www.YourApp.com/restrictedZone.php
  3. 重定向登录
  4. 登录挑战已通过
  5. 重定向到限制区域而不是'index.php'或'home.php'
  6. 您应该确保在所有“限制区域”页面上检查有效会话。