104

确定当前页面发送或调用(通过 AJAX)哪个页面的最可靠和最安全的方法是什么。由于(缺乏)可靠性,我不想使用$_SERVER['HTTP_REFERER'],并且我需要调用的页面仅来自源自我网站的请求。

编辑:我希望验证是否正在从我网站上的页面调用执行一系列操作的脚本。

4

5 回答 5

93

REFERER 作为 HTTP 协议的一部分由客户端的浏览器发送,因此确实不可靠。它可能不存在,它可能是伪造的,如果出于安全原因,您就不能信任它。

如果您想验证请求是否来自您的站点,那么您不能,但您可以验证用户是否访问过您的站点和/或已通过身份验证。Cookie 是在 AJAX 请求中发送的,因此您可以依赖它。

于 2008-10-03T07:33:54.463 回答
23

我发现最好的是一个 CSRF 令牌,并将其保存在会话中,以便您需要验证引用者的链接。

因此,如果您正在生成一个 FB 回调,那么它看起来像这样:

$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

我确实知道一些安全网站对其所有安全页面都做了同样的事情。

于 2012-12-04T13:19:28.617 回答
19

使用$_SERVER ['HTTP_REFERER']

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

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;
于 2012-09-26T20:12:00.497 回答
0

没有可靠的方法来检查这一点。它真的在客户的手下告诉你它来自哪里。您可以想象仅在您网站的某些页面上使用 cookie 或会话信息,但这样做会破坏用户对书签的体验。

于 2008-10-03T07:36:25.783 回答
0

在阅读了所有虚假的引荐来源网址问题后,我们只剩下一个选项:即我们希望作为引荐来源网址跟踪的页面应该保留在会话中,并且作为 ajax 调用然后检查会话是否具有引荐来源页面值并执行其他明智的操作不行动。

另一方面,当他请求任何不同的页面时,将引荐来源会话值设为空。

请记住,会话变量仅在期望页面请求上设置。

于 2011-06-23T06:35:01.037 回答