确定当前页面发送(或通过AJAX调用)哪个页面的最可靠,最安全的方法是什么。$_SERVER['HTTP_REFERER']
由于(缺乏)可靠性,我不想使用,并且我需要被调用的页面仅来自于源自我网站的请求。
编辑:我正在寻找从我的网站页面上调用执行一系列动作的脚本。
确定当前页面发送(或通过AJAX调用)哪个页面的最可靠,最安全的方法是什么。$_SERVER['HTTP_REFERER']
由于(缺乏)可靠性,我不想使用,并且我需要被调用的页面仅来自于源自我网站的请求。
编辑:我正在寻找从我的网站页面上调用执行一系列动作的脚本。
Answers:
客户端浏览器发送的REFERER作为HTTP协议的一部分,因此确实不可靠。它可能不存在,可能是伪造的,如果出于安全原因,您就是无法信任它。
如果您想验证请求是否来自您的站点,那么您不能这样做,但是您可以验证用户是否已访问您的站点和/或已通过身份验证。Cookie是在AJAX请求中发送的,因此您可以依靠它。
我发现最好的是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
我确实知道安全站点在所有安全页面上都做到了这一点。
$_GET['token'] == $_SESSION['token']
不$_GET['token'] !== $_SESSION['token']
?
使用$ _SERVER ['HTTP_REFERER']
将用户代理引至当前页面的页面地址(如果有的话)。这是由用户代理设置的。并非所有的用户代理都将设置此功能,有些用户代理提供了将HTTP_REFERER修改为功能的功能。简而言之,它不能真正被信任。
if (!empty($_SERVER['HTTP_REFERER'])) {
header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
header("Location: index.php");
}
exit;