确保jquery ajax到php的连接


securing a jquery ajax to php connection

我的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

正如您所看到的,这并不是对用户的真正限制。如果你在服务器端做会更好。你可以看看这个限制直接页面访问

它很安全,但也有更多的方法。。