Безопасность на Rails: избежание массового назначения - PullRequest
3 голосов
/ 24 марта 2011

Мне не нужна функция массовое назначение в моем производственном коде.(В моем тестовом коде я часто его использую, но в этих случаях я делаю хочу установить произвольные столбцы.)

Так что если в моем производственном коде я просто избегаю этих форм:

Article.new(params[:article])  # or create
article.attributes = params[:article]
article.update_attributes(params[:article])

и вместо этого всегда вручную перечислять все атрибуты, например так:

Article.new(:title => params[:article][:title], :body => params[:article][:body], ...)

Я спасаюсь от проблем безопасности массового назначения (даже без использования attr_accessible / attr_protected)?

Редактировать: Причина, по которой я не просто отключаю массовое назначение, заключается в том, что я хотел бы написать Article.create!(:blog_id => @blog.id, ...), где blog_id - это атрибут "unsave".

Ответы [ 3 ]

10 голосов
/ 24 марта 2011

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

Это СУХОЙ способ написать это, хотя:

Article.new(params[:article].slice(:title, :body))

-или-

def article_params
  params[:article].slice(:title, :body)
end

Article.new(article_params)  # or create
article.attributes = article_params
article.update_attributes(article_params)
2 голосов
/ 24 марта 2011

Добавьте это в конце config/environments/production.rb:

ActiveRecord::Base.send(:attr_accessible, nil)
0 голосов
/ 16 июня 2011

Я не смог заставить метод Джона Даута работать с несколькими параметрами, поэтому я предложил следующую альтернативу (взято из моего CommentsController):

def set_params
  @comment.parent_id = params[:blog_comment][:parent_id] 
  @comment.ip_address = request.remote_ip
  @comment.commentator = current_user.username || "anonymous"
  @comment.name = params[:blog_comment][:name]
  @comment.email = params[:blog_comment][:email]
  @comment.url = params[:blog_comment][:url]
end

def create
  @comment = @post.comments.build(params[:blog_comment])
  set_params

  if @comment.save
  ...
end

def update
  @comment = Blog::Comment.find(params[:id])
  set_params

  if @comment.update_attributes(params[:blog_comment])
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...