就地编辑更新脚本安全
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