我的ajax代码是:
$.ajax({
type: "POST",
url: "save.php",
data: {
name: $(this).attr('name'),
value: $(this).val(),
id: <?php if(!empty($_SESSION['user'])) echo $_SESSION['user'];?>
}
});
在save.php中,我使用以下条件进行检查:
if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SESSION['user']!=$_POST['id']){
//then show an error
}
这是防止未经授权调用save.php的正确方法吗?
一般而言
客户端的任何东西都是不安全的。因此,任何脚本都可能在任何时候使用任何一组参数从任何人调用。
保护特定脚本
因此,我们需要在服务器端准备一些东西,以便在稍后的时间点验证某些东西是否有效。
让我们称之为安全令牌。安全令牌需要足够长且随机字符串。安全令牌需要不可预测。在这种情况下,只有服务器端应用程序可以作为此令牌的源。
将此安全令牌保存到用户的会话中,并将其传递给客户端。将安全令牌与要保护的脚本调用相关联。您的会话可能具有以下属性:
$_SERVER[ 'sys$securityTokens' ]
= array(
'AHSsd67sdSJDH/D6wehsd'
=> array( 'script' => 'sensibleScript.php',
'params' => array( 'kid' => 3, 'var5' => 12 )
),
'KSD87sd78sdsfk(DDF/sd'
=> array( 'script' => 'someOhterSensibleScript.php',
'params' => array( 'value' => 'welcome!' )
)
);
请注意,此结构将安全令牌与脚本名称和稍后调用的有效参数相关联。
如果客户端需要使用JavaScript调用脚本,它会将安全令牌传递回服务器。
在服务器端
如果收到合理的脚本请求,并且请求中包含正确的安全令牌,请从会话中删除该安全令牌并执行脚本。
如果一个合理的脚本请求没有安全令牌,请拒绝该请求。
当我看到你要做什么时…
最好这样做:
$.ajax({
type: "POST",
url: "save.php",
data: {
name: $(this).attr('name'),
value: $(this).val(),
id: <?php if(!empty($_SESSION['user'])) echo $_SESSION['user'];?>
}
});
并且在save.php中检查,条件是:
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest' || $_SESSION['user']!=$_POST['id']){
//here you can show an error
}
这个新条件还将检查请求是否通过ajax
正如您所看到的,这并不是对用户的真正限制。如果你在服务器端做会更好。你可以看看这个限制直接页面访问
它很安全,但也有更多的方法。。