2

概括我今天早上提出的这个问题,如果之前有人问过这个问题并且我根本不知道要搜索什么,请接受我的歉意,但我很好奇 Rails 如何处理以下情况:

  1. 使用 Devise,我登录了一个 ID 为 2 的用户。
  2. 我单击已创建的链接以“编辑我的个人资料”(该链接将转到 /users/2/edit 页面)。
  3. 使用 Firebug(或类似的东西),我修改表单并将操作从更改action='/users/2'action='/users/5'.
  4. 我更改了表单上的一个元素,然后单击提交。

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

我猜我不是第一个问这个问题的人。在我看来,Rails 应该“开箱即用”地处理这个问题,但我可能是错的。Rails 是否本机处理此问题,而我只是遗漏了一些东西?之前是否曾在 SO 或其他我想念的地方问过这个问题?

4

1 回答 1

4

一些东西:

  • 不要创建接受 DB 的路由id。相反,让它像/my_profile.
  • 如果id在参数中传递了一个,则在控制器中完全忽略它。而是查找current_user已登录的用户并向他们显示他们自己的个人资料,而不管id传入的是什么个人资料/用户。
  • 最后,可能也是最重要的,使用授权(允许用户做什么)来禁止一个用户编辑另一个用户的配置文件。不要与身份验证(用户登录/注销)混淆。

使用这种方法,是否更改 DOM 无关紧要,因为服务器永远不应该隐式信任传递给它的内容,这就是您现在面临的问题。任何 web/app 服务器都必须始终确认传递给它的参数在当前用户被允许执行的操作的上下文中实际上是有效的。

服务器永远不应该相信传递给它的东西的想法是一个关键的想法,适用于应用程序中的每一个操作,无一例外。

于 2013-04-13T20:40:47.983 回答