2

我的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 的正确方法吗?

4

2 回答 2

4

一般来说..

客户端的任何东西都是不安全的。因此,任何人都可以使用任何参数集随时调用任何脚本。

保护特定脚本

因此,我们需要在服务器端准备一些东西,以便稍后验证某些东西是否有效。

我们称它为安全令牌。安全令牌需要足够长且随机的字符串。安全令牌需要是不可预测的。在这种情况下,只有服务器端应用程序才能成为此令牌的来源。

将此安全令牌保存到用户的会话并将其传递给客户端。将安全令牌与要保护的脚本调用相关联。您的会话可能具有以下属性:

$_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 调用脚本,它会将安全令牌传递回服务器。

在服务器端...

如果一个合理的脚本请求进来并且正确的安全令牌是请求的一部分,则从会话中删除安全令牌并执行脚本。

如果合理的脚本请求没有附带安全令牌,请拒绝该请求。

于 2013-08-19T00:52:45.387 回答
1

正如我看到你要做什么..

最好这样做:

$.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 提出的请求?

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

它是安全的,但也有更多的方法..

于 2013-08-19T00:25:48.247 回答