在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仅设置在期望的页面请求上。