就地编辑更新脚本安全

Posted

技术标签:

【中文标题】就地编辑更新脚本安全【英文标题】: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 语句中使用它。这似乎是最安全的方法。

【问题讨论】:

【参考方案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,因此无需公开传递。

【讨论】:

以上是关于就地编辑更新脚本安全的主要内容,如果未能解决你的问题,请参考以下文章

添加 div javascript,然后就地编辑 jquery

使用 sed 在 bash 脚本中进行就地重命名

就地编辑内容编辑

什么是一个好的Python配置文件格式,可以轻松安全地由一个脚本编辑并由另一个脚本读取?

编辑文本图层 - Photoshop 脚本

潜在的安全漏洞——打开谷歌脚本?