【问题标题】:CakePHP hidden edit fieldsCakePHP 隐藏的编辑字段
【发布时间】:2012-02-17 05:16:03
【问题描述】:

我刚开始使用 CakePHP 框架,准确地说是 2.0。我阅读了大部分文档和示例,并看到了博客教程。

http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html#editing-posts 在本教程的“编辑帖子”部分,我看到他们使用隐藏字段来记住帖子 ID。由于客户端修改,这不是不好的做法吗?

我处理此问题的方式是删除隐藏字段,并在提交表单时将帖子 ID 添加到 POST 数据中,然后再保存和验证它。这是正确的方法吗?

【问题讨论】:

  • 你怎么知道要使用哪个帖子 ID?
  • 好吧,我使用示例来编辑用户而不是帖子。所以我从 Auth 组件中获取了登录用户的 ID: $this->Auth->user('id');
  • 当用户被授权只能编辑数据库中的一个记录时,这是最好的方法,但是当他们可以编辑多个时呢?
  • 尝试更改它,看看它是否“不安全的直接对象引用”。为什么你会想问?

标签: security cakephp cakephp-2.0 hidden-field postdata


【解决方案1】:

您所要做的就是将 SecurityComponent 添加到您的 AppController::$components 变量中,以防止客户端更改隐藏字段。

【讨论】:

  • 虽然这是一个真实的陈述,但它忽略了更重要的一般要点。 OP 不信任客户端数据是正确的;控制器中的每个操作都必须始终验证用户是否有权在受影响的数据上执行该操作,然后才允许它发生。如果用户不拥有数据,或者不应被允许对其执行此类操作,则拒绝该请求。
【解决方案2】:

是的,如果您担心数据被篡改,这几乎是正确的方法。 如果记录属于某个用户,您需要确保该用户不能只用其他用户的记录替换 id。 安全组件在这里也没有帮助(至少在某些方面)。

在此处阅读更多信息: http://www.dereuromark.de/2010/09/21/saving-model-data-and-security/

【讨论】:

  • SecurityComponent 不允许客户端更改隐藏字段。
  • 好的,对。 2.0 的文档说明了新行为。
  • 如果您不想(或不能 - 例如 ajax)使用安全性,您仍然可以使用上述方法(不使用隐藏字段并使用传递的第一个参数,这也是 id)零件。否则我会推荐 wylie 的答案。
【解决方案3】:

SecurityComponent 将有助于隐藏字段。它将黑洞检测到的任何请求包含被篡改的隐藏输入,但它不会对下拉输入做任何事情。你可以破解一些在 firebug 中打开的 AddUser 表单并添加一个选项:

<option value="superadmin">SuperAdmin</option>

进入“角色”下拉菜单,在表单上选择它,提交后,CakePHP 将创建一个新的 SuperAdmin。所以最好的策略仍然是不信任客户。客户端是一群木狼,而您的服务器是一群兔子。将这两者分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多