【问题标题】:Edit in Place Update Script Security就地编辑更新脚本安全
【发布时间】:2010-09-19 12:12:48
【问题描述】:

我正在使用 Edit in Place jquery 插件,它需要将数据发布到将执行实际数据库更新的脚本。

这个更新脚本的 URL 可以在 html 源代码和 Firebug 中轻松查看,因此我需要在更新处理之前添加某种身份验证检查。这当然是为了让用户不能只传递他们想要的任何旧的用户 ID/字段/值并弄乱其他人的记录。

我最初也传递了他们的用户名和密码,但这并不理想,因为它在 GET 请求中,所以它都在 URL 中。该网站本身至少是 SSL,但无论如何都不是最佳实践。

验证此类更新的最佳方式是什么?

FWIW,更新脚本是 PHP 的,Edit in Place 插件是:jeditable

编辑:澄清一下:实际的数据负载已发布到脚本,但就地编辑插件没有明确的身份验证方法,因此我将身份验证作为 URL 的一部分传递给更新脚本,然后通过 GET 获取这些变量并使用它们进行检查。

编辑 2: 是的,我可以从更新脚本访问会话信息,所以我决定只提取之前保存的用户 ID 并在 db update 语句中使用它。这似乎是最安全的方法。

【问题讨论】:

    标签: php jquery ajax security edit-in-place


    【解决方案1】:

    我认为您最好将脚本切换为 POST 方法,因为大多数就地编辑使用太大而无法实际使用 GET。您永远不应该使用 SessionId 或密码作为 URL 参数,除了查看公共配置文件之外,我不会将用户名用于任何事情。如果您的 AJAX URL 是 PHP 文件,我相当确定它应该能够访问会话,而无需将其传递到 GET 或 POST 数组中。另外请注意,请确保在更新数据库之前验证并清理所有信息。

    【讨论】:

    • 是的,您绝对可以访问 Session 而无需在提交时传入 session_id。我星期五刚做了这个。
    • 感谢 mabwi 的验证。我以为你可以,但我已经有一段时间没有这样做了。
    【解决方案2】:

    更新(基于评论和问题更新):您可以将用户名/密码作为 submitdata 选项传递给 Jeditable,如下所示:

    $(".edit_area")
        .editable("http://www.example.com/save.php", { 
             submitdata: { userid:'johnsmith',  passwd:'god' }
             // ..other settings, etc.
          });
    

    快速且肮脏的解决方案 - 肮脏,因为它以明文形式(通过查看源代码)公开用户的隐私。

    由于您确实可以访问服务器上的用户 ID/会话 ID,因此使用该选项是迄今为止最明智的选择。

    嗯...既然您说 Jeditable 使用 GET,我只能假设您使用的是 loadurl 选项(因为 Jeditable 使用 $.post() 来保存更改,而 $.post() 总是使用POST)。

    那么,您是否尝试过将 Jeditable 的 loadtype 设置切换为“POST”,并像以前一样发送用户名/密码?

    $(".edit_area")
        .editable("http://www.example.com/save.php", { 
             loadurl: 'http://www.example.com/load.php',
             loadtype: 'POST'
             // ..other settings, etc.
          });
    

    这听起来像是一种快速而肮脏的解决方案——假设您在服务器端没有任何标准的用户/会话处理。

    【讨论】:

    • 正在发布实际的数据负载。我只是通过 GET 传递额外的数据进行身份验证。
    • 感谢您的澄清。我相应地更新了我的答案。
    【解决方案3】:

    如果您只是在会话中查找用户,该站点是否仍然容易受到跨站点请求伪造的攻击?

    如果您包含根据不可编辑的 POST 字段的值计算的加盐哈希字段,则可以 POST 所有需要的信息。如果包含时间戳,也可以防止脚本重播。

    例子:

    $(".edit_area")
      .editable("http://www.example.com/save.php", { 
        submitdata: { 
          userid: 'johnsmith',
          pageid: '123',  // or other value unique to the page
          timestamp: '1324354657',  // time when page loaded
          hash: '0bee89b07a248e27c83fc3d5951213c1' }
        // ..other settings, etc.
    });
    

    哈希可以是例如'johnsmith$123$1324354657$' + $secret_salt 的 MD5。在保存之前检查它是否匹配。如果时间过少或过长,可选择拒绝。

    ditch-pycrypto branch of django-magicforms 将此实现为 Django 的可重用 Form 基类。它并不直接适用于 AJAX 请求,但文档和单元测试应该为其他实现提供良好的基础。

    【讨论】:

      【解决方案4】:

      要传递信息,您应该在实际的 GET 字符串中使用会话 ID。这样,php 脚本可以连接到会话,验证用户,并查看用户是否有权编辑他们发布的内容。然后,如果他们有权限,则继续,否则返回错误消息。

      我相信您可以在 javascript 中获取会话 ID,因此无需公开传递。

      【讨论】:

        猜你喜欢
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多