【问题标题】:securing a jquery ajax to php connection保护 jquery ajax 到 php 的连接
【发布时间】:2013-08-19 00:11:55
【问题描述】:

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

【问题讨论】:

  • 您具体要保护什么?
  • @Brad 任何人都可以使用 jquery/ajax 创建一个页面,并将 URL 设置为我网站的 save.php。这将授予未经授权的访问权?我又在某处听说过“跨浏览器伪造”。
  • 请记住,任何人都可以在浏览器之外创建虚假请求,并轻松欺骗这些标头。

标签: php ajax security


【解决方案1】:

一般......

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

保护特定脚本

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

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

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

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

在服务器端...

如果收到一个合理的脚本请求,并且请求中包含正确的安全令牌,请从会话中删除安全令牌并执行脚本。

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

【讨论】:

    【解决方案2】:

    我知道你要做什么..

    最好这样做:

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

    如您所见,它并不是对用户的真正限制。如果你在服务器端做会更好。你可以看看这个Restrict direct page access

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

    【讨论】:

    • 我认为$_SERVER['HTTP_X_REQUESTED_WITH'] 会检查请求是否通过。
    • 是的,你是对的,因为它会检查 http 标头。我要稍微修改一下
    • 这是不安全的,因为 id 参数是可预测的,因此它不会防范 CSRF。可以使用 JavaScript 从另一个域发布到此脚本,检查 HTTP_X_REQUESTED_WITH 不会增加安全性。即使没有这些问题,也存在进一步的缺陷:脚本中的 php 变量的输出在输出时应该进行适当的清理,以防止存储的 XSS(在这种情况下可能是 JS 编码然后是 HTML 编码)。
    猜你喜欢
    • 2012-05-05
    • 2016-01-30
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多