2

我在 SO 和其他网站上都读过,这$_SERVER['HTTP_REFERER']是我们作为程序员应该始终避免的事情。阅读 PHP 手册我们会遇到以下几行:

将用户代理引向当前页面的页面地址(如果有)。这是由用户代理设置的。不是所有的用户代理都会设置这个,有些提供修改 HTTP_REFERER 作为一个特性的能力。简而言之,它不能真正被信任。

考虑到“用户代理”之类的东西,比如 Web 浏览器(Safari、Chrome、Opera、Firefox,基本上都是),手册告诉我们这个变量可能会被他们改变。这是我的第一个问题:

问题一:为什么“用户代理”要修改这个参数?网络浏览器不设置此参数的原因是什么?

这只是好奇,我不会使用$_SERVER['HTTP_REFERER']。从我最近的声明中可以看出,如果我们确实需要这样的功能,我们需要弄清楚一些事情。我首先想到的是一个 cookie 解决方案,我们在其中执行以下操作:

setcookie('latest_page', __FILE__, 60 * 60 * 24 * 7);

然后,根据你喜欢的方式,你可以恢复你需要的东西。这是第二个也是最后一个问题:

问题2:这种方式最好吗?有什么办法可以改善吗?

4

7 回答 7

5

没有理由避免 HTTP_REFERER。只是在使用时要注意,它并不总是被设置,它可以被客户端自由操作,所以它是不受信任的数据。

绝大多数客户设置了变量,并且这样做是正确的。

阻止它的主要原因是隐私:例如,当在 Web 邮件客户端中打开电子邮件时,指向外部图像的链接会在HTTP_REFERER标题中包含 Web 邮件服务的地址。这就是GMail 和 Yahoo 努力阻止它的原因。

您建议的解决方法仅适用于同一站点内的移动,并且如果用户打开多个选项卡/浏览器窗口来浏览您的站点,则会中断。如果您需要知道引用页面,最好的方法是添加一个 GET 参数,例如

<a href="otherpage.html?from=thispage.html">

编辑:依赖 HTTP_REFERER 是危险的一个例子是在您的主页上显示一个实时更新的引用站点列表(“访问者来自...”),通过访问您的站点很容易将任意 URL 走私到该列表中用假HTTP_REFERER套。

于 2011-02-20T13:04:20.840 回答
3

为什么“用户代理”要修改这个参数?网络浏览器不设置此参数的原因是什么?

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 攻击更加困难。

于 2011-02-20T13:25:41.510 回答
1

基于 Cookie 的解决方案不是最好的,也不是解决方案。
没有人使用它,因为 cookie 是一个站点范围的问题。

大多数时候“返回”链接是无用的。每个现代浏览器都有一个后退按钮。
如果您仍然想实现它,只需使其与在其他站点上实现的方式相同。

于 2011-02-20T13:21:24.850 回答
1

如果你需要一个返回链接,你应该使用这个:

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

或者

<a href="javascript:history.go(-1);"><< Go Back</a>

这是向用户提供返回链接的最佳方式

于 2011-02-20T13:25:44.333 回答
0

好吧,请记住,就像客户端设置的任何标头一样,它可以被篡改。所以明智地使用它。

于 2011-02-20T13:05:52.670 回答
0

如果 Http 引荐来源网址未经清理就必须对您的网站数据库执行某些操作,则它可能会很危险。它也完全是客户端,所以有人可以利用它。但除此之外,它没有任何问题。

Cookies 也可以更改。如果您想要用户无法更改的内容,请使用 Php Sessions。

于 2011-02-20T13:25:18.837 回答
0

问题一:为什么“用户代理”要修改这个参数?网络浏览器不设置此参数的原因是什么?

好吧,网络浏览器真的没有理由不设置它。您被告知要避免它,因为某些浏览器会避免它的原因相同,这就是滥用。就像在 URL 中保存重要的会话信息一样。

你不应该试图避免使用它,你应该负责任地使用它。并且不必使用任何“噱头”。例如,将其用作“简历”导航非常常见。例如,某人的会话使用您的网页过期。您可以将它们发送到登录凭据页面。然后将它们重定向到请求的 URL。

当他们试图在不通过登录屏幕的情况下首次访问您的网页时也是如此。

  1. 启动浏览器(cookie o 会话中没有保存信息)
  2. 转到 www.YourApp.com/restrictedZone.php
  3. 重定向到登录
  4. 登录挑战已通过
  5. 重定向到受限区域而不是“index.php”或“home.php”

您应该确保在所有“受限区域”页面上检查有效会话。

于 2011-02-20T16:14:27.777 回答