Должно ли поле: пароль для пользователя быть attr_protected? - PullRequest
1 голос
/ 14 сентября 2011

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, но требует, чтобы вы сначала сбросили новый.

Я бы чувствовал себя более комфортно, если старый пароль требуется для его обновления, и это намного чище, если пароль * 1038.* на первом месте.

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Однако, если :password требуется равным attr_accessible, для кого-то просто ввести любой новый пароль и взломать учетную запись своего друга.

Вам необходимо убедиться, что пользователю принадлежит запись, которую он пытается обновить, будь то запись, комментарий или собственная учетная запись пользователя. attr_protected не делает этого для вас, и изменение его на attr_accessable не представляет проблему, которую вы думаете, это делает. attr_protected не имеет никакого отношения к контролю того, какие пользователи могут обновлять какие записи, оно только указывает, какие поля могут быть обновлены посредством массового назначения.

Если вы полагаетесь на attr_protected, чтобы запретить пользователям изменять записи, которыми они не владеют, ваша система ужасно сломана. Методы контроля доступа не делают этого за вас . Каждая операция записи должна проверяться, чтобы убедиться, что пользователь авторизован для записи в этот объект.

Все это говорит о том, что ваш :password должен быть attr_accessable, так что вы можете назначить его вместе с password_confirmation вместе с validates_confirmation_of :password. Это полностью типично и не создает новых проблем.

0 голосов
/ 15 сентября 2011

Ну,

  1. , чтобы обновить пароль, необходимо войти в систему, чтобы можно было легко отменить изменения в чужом профиле

  2. выВы можете добавить подтверждение пароля, если хотите (лично я бы это сделал)

  3. Даже если у вас есть функция «забытый пароль», вы должны разрешать пользователям менять свой пароль всякий раз, когда онихочу.

...