2

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

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

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

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

FWIW,更新脚本在 PHP 中,并且 Edit in Place 插件是:jeditable

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

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

4

4 回答 4

3

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

于 2008-10-28T01:35:32.033 回答
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.
      });

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

于 2008-10-28T01:54:23.293 回答
2

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

如果您包含根据不可编辑的 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.
});

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

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

于 2008-12-18T16:10:19.197 回答
-2

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

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

于 2008-10-28T01:25:17.157 回答