用户的密码字段应该是attr_protected吗?

时间:2011-09-14 17:43:25

标签: ruby-on-rails authentication authlogic

Authlogic让我感到紧张,因为它在用户模型上强制执行,:password是attr_accessible:

class User < ActiveRecord::Base

  attr_accessible :password, :email
  ...

end

我对此感到不舒服的原因是某人设置中密码字段的正常设计模式是您需要在输入新密码之前重新确认旧密码。

这可以防止有人更改某人的密码(并且csrf_meta_tag之前也会阻止跨站点伪造)。

未经许可切换某人的密码

但是:password必须是attr_accessible,有人提交任何新密码并破坏其好友的帐户很简单。

我想将:password字段默认为attr_protected,这样虽然可以更新,但由我决定启用它而不是取决于我保护它。

如果您忘记密码,这种保护措施是否重要?

我什么都不担心?我确实认识到,鉴于你有一个“发送密码重置到我的电子邮件”功能,这有点多余,但它仍然存在额外的障碍。

修改

我以一种令人困惑的方式表达了我的初步问题。我并不是说我使用attr_protected阻止人们登录彼此的帐户,我使用的是完全正常的身份验证设置。

我所指的是保护您免受朋友攻击的类型,在您的计算机上打开您的帐户,有人坐下来更改您的密码。在创建新密码之前,可以(大部分)通过要求旧密码来保护它。即使密码设置为att_accessible,也可以完全实现,但需要先刷新新密码。

如果需要旧密码来更新它,我会感觉更舒服,如果密码首先是attr_protected,则会更加清晰。

2 个答案:

答案 0 :(得分:2)

  

但是:password必须是attr_accessible,有人提交任何新密码并破坏其好友的帐户很简单。

您需要确保用户拥有他们尝试更新的记录,无论是帖子,评论还是他们自己的用户帐户。 attr_protected不会为您执行此操作并将其更改为attr_accessable不会引入您认为它的问题。 attr_protected nothing 与控制哪些用户可以更新哪些记录有关,它只指定哪些字段可以通过批量分配进行更新。

如果您依靠attr_protected来阻止用户更改他们不拥有的记录,那么您的系统就会被严重破坏。访问控制方法不会为您执行此操作。每个写操作都应检查以确保用户有权写入该对象。

所有这些都说明,您的:password 应<{1}},以便您可以将其与attr_accessable以及{{{{}}一起进行大量分配1}}。这是完全典型的,并没有引入新的问题。

答案 1 :(得分:0)

那么,

  1. 要更新密码,必须登录才能轻松放弃对其他人个人资料的更改

  2. 如果您愿意,可以添加密码确认(个人而言,我会这样做)

  3. 即使您有一些“忘记密码”功能,也应该让用户随时更改密码。