Это уязвимо для массового назначения? - PullRequest
1 голос
/ 01 февраля 2011

Я использую это, чтобы позволить пользователям голосовать за запись:

 <% form_tag url_for(entry_votes_path(@entry)), :id => 'voting_form', :remote => true do %>
      <%= hidden_field_tag 'vote[user_id]', current_user.id  %>
      <%= submit_tag 'Vote for this entry', :id => 'voting_button' %>
 <% end %>

Это код моего контроллера:

def create
    @entry = Entry.find(params[:entry_id])
    @vote = @entry.votes.build(params[:vote])

    respond_to do |format|
    if @vote.save
        format.html { redirect_to @entry }
        format.js
      end
    end
  end

У меня два вопроса

  1. Как я могу назначить current_user.id без использования скрытого поля?

  2. Кроме того, сейчас я не использую attr_accessible или attr_protected в модели голосования. Как мне защитить модель, чтобы кто-то не мог набрать много голосов? Прямо сейчас все поля в модели голосования задаются хешем params - нужно ли мне использовать attr_protected, скажем, внешний ключ entry_id, а затем установить его отдельно в контроллере?

1 Ответ

2 голосов
/ 01 февраля 2011

Я не использую attr_accessible или attr_protected в модели голосования прямо сейчас ...

Тогда, по определению, массовое присвоение возможно из строки запроса.

Должен ли я использовать attr_protected, скажем, внешний ключ entry_id, а затем установить это отдельно в контроллере?

В общем, лучше использовать attr_accessible, чем attr_protected. Это связано с тем, что attr_accessible устанавливает по умолчанию запретить все для массового назначения и позволяет определять исключения из белого списка. С другой стороны, attr_protected заставляет вас занести в черный список определенные атрибуты. Когда вы изменяете программу и добавляете новый атрибут с установленным атрибутом attr_accessible, программа завершится ошибкой, если вам нужно добавить атрибут в белый список и забыть. Другими словами, это безопасно. В качестве альтернативы, если вы добавите новый атрибут с установленным атрибутом attr_protected, программа будет работать , даже если новый атрибут должен был быть включен в черный список . Другими словами, это небезопасно.

Правило здесь - защищать любой атрибут, который было бы опасно разрешать устанавливать из строки запроса. Защита ключа помогает предотвратить внедрение новых строк, но может потребоваться защитить другие поля, если вы хотите запретить возможность изменять содержимое существующих строк.

Хорошую справку об этом можно найти по адресу guides.rubyonrails.org .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...