在PHP中确定Referer
什么是最可靠和最安全的方式来确定哪些页面发送或调用(通过AJAX),当前页面。 我不想使用$_SERVER['HTTP_REFERER']
,因为(缺less)可靠性,我需要调用的页面只来自我的网站上的请求。
编辑:我正在寻找validation一个脚本,执行一系列的行动是从我的网站上的一个页面被调用。
REFERER由客户端的浏览器作为HTTP协议的一部分发送,因此确实是不可靠的。 它可能不在那里,它可能是伪造的,如果出于安全原因,你就不能相信它。
如果您想validation一个请求是否来自您的网站,那么您不能,但是您可以validation用户是否已经访问了您的网站和/或进行了身份validation。 Cookies是通过AJAX请求发送的,所以你可以依靠这个。
我发现最好的是一个CSRF令牌,并将其保存在会话中,以便您需要validation引用者的链接。
所以,如果你正在生成一个FBcallback,那么它看起来像这样:
$token = uniqid(mt_rand(), TRUE); $_SESSION['token'] = $token; $url = "http://example.com/index.php?token={$token}";
那么index.php将如下所示:
if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token']) { show_404(); } //Continue with the rest of code
我确实知道安全网站对所有安全页面都是这样做的。
使用$ _SERVER ['HTTP_REFERER']
将用户代理引用到当前页面的页面地址(如果有)。 这由用户代理设置。 并不是所有的用户代理都会设置这个function,有些提供了修改HTTP_REFERERfunction的function。 总之,它不能真正被信任。
if (!empty($_SERVER['HTTP_REFERER'])) { header("Location: " . $_SERVER['HTTP_REFERER']); } else { header("Location: index.php"); } exit;
没有可靠的方法来检查这一点。 告诉你它从哪里来的真的在客户的手中。 您可以想象,仅在您的网站的某些页面上使用cookie或会话信息,但这样做会破坏用户使用书签的体验。
在阅读所有假引用问题后,我们只剩下单一选项:即,我们希望作为引用者跟踪的页面应该保留在会话中,并且作为ajax调用,然后检查会话中是否具有引荐页面值,并执行其他明智的否行动。
而另一方面,当他请求任何不同的页面,然后使引用会话值为空。
请记住,会话variables仅设置在期望的页面请求上。