2013-04-13 28 views
2

推广this question今天早上我问了,请接受我的道歉,如果这之前已经问过,我只是不知道要搜索什么,但我很好奇Rails如何处理以下情况:Rails 3 - 防止form_for DOM动作变化

  1. 使用设计,我登录用户,用2
  2. 的ID我点击已创建的“编辑个人资料”(这只是会去一个链接/ users/2 /编辑页面)。
  3. 使用Firebug(或类似的东西),我修改表单并将动作从action='/users/2'更改为action='/users/5'
  4. 我更改表单上的元素,然后单击提交。

此时,Rails似乎允许使用ID 5提交和更新用户以及我的更改。

我猜我不是第一个问这个问题的人。在我看来,像Rails应该处理这个“开箱即用”,但我可能是错的。 Rails是否可以处理这个问题,我只是错过了一些东西?这是否曾经在SO或我失踪的其他地方被问过?

回答

4

有几件事情:

  • 不要创建一个接受DB id的路线。相反,使它像/my_profile
  • 如果参数中传递了id,请在控制器中完全忽略它。相反,查找已登录的current_user,并向他们显示他们自己的配置文件,而不管使用哪个配置文件/用户id
  • 最后,并且可能最重要的是,使用授权(用户允许执行的操作),以便不允许一位用户编辑其他用户的配置文件。不要与身份验证(用户登录/注销)相混淆。

通过这种方法,DOM是否发生了变化并不重要,因为服务器不应该隐式地信任传递给它的内容,这是您现在面临的问题。任何Web /应用程序服务器必须始终确认传递给它的参数在当前用户允许执行的内容的上下文中实际上是有效的。

这个想法,服务器应该从来没有信任什么传递给它是一个重要的想法适用于你的应用程序中的每一个动作,毫无例外。