【发布时间】:2018-07-11 19:00:31
【问题描述】:
问题:
通过header('Location: http://example.com') 将用户从http://sample.com 重定向到http://example.com - $_SERVER['HTTP_REFERER']; 为空。
即使通过header('Referer: http://sample.com') 设置referer,然后通过header('Location: http://example.com') 重定向-$_SERVER['HTTP_REFERER']; 仍然是空的。
预期结果:
http://example.com 通过header('Location: http://example.com') 接收带有适当引荐来源的$_SERVER['HTTP_REFERER']
用例
- 用户通过电子邮件收到指向http://sample.com的唯一邀请链接
- 用户点击链接并被重定向到http://sample.com/?i=123456
- http://sample.com 验证邀请,如果它仍然有效(即未使用)将用户重定向到 http://example.com/?i=123456
- http://example.com 无法验证邀请,因此了解用户是否从正确的来源重定向很重要
其他:
- 如果用户单击http://sample.com 上的链接,则行为正确
- 如果用户通过 javascript `window.location="http://example.com" 重定向,行为是正确的
- $_GET 不是一个选项,因为http://example.com 无法验证邀请,因此很容易伪造它
【问题讨论】:
-
HTTP_REFERRER 似乎是由浏览器通知的。它可能适用于 Chrome,但不适用于 Firefox,反之亦然,它不值得信赖,因为它没有标准化。
-
任何建议如何实现它并确保跨浏览器兼容性?
-
我能问一下你需要那个标题吗?正如下面的答案所述,此标头不值得信任并且并不总是存在。
-
也许用 $_GET 重定向?
-
您可以确定“在另一边”收到的唯一信息是您放入
Location:标头的任何信息。所以,是的,在 URL 本身中添加一些识别信息。