Безопасно ли создавать новую модель, передавая ей параметры? - PullRequest
1 голос
/ 24 ноября 2011

У меня есть модель комментария.Я создаю новый экземпляр этой модели, передавая его параметры из моего представления в контроллер комментариев.Вот контроллер комментариев:

class CommentsController < ApplicationController
  def create
    session[:return_to] = request.referrer
    @comment = Comment.create(:user_id  => current_user.id,
                             :issue_id => params[:issue_id],
                             :content  => params[:content])
    redirect_to session[:return_to]
  end
end

Вот как я передаю параметры на мой взгляд:

<%= link_to "Test Comment", comments_path(:issue_id => @issue.id,
                                          :content  => "HeLLO"),
                            method: :create %>

мой вопрос - это безопасно?Что мешает кому-либо изменить параметры [: issue_id] и комментировать другую проблему?Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 24 ноября 2011

да, есть лучшие способы

сначала смотрим на ваш контроллер. сохранять реферер и перенаправлять его назад не имеет смысла (по крайней мере, вы НЕ должны сохранять это в сеансе), рельсы могут делать это с ключом: назад.

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

class CommentsController < ApplicationController
  def create
    Comment.create(:user=>current_user, :issue_id=>params[:issue_id],:content=> params[:content])
    redirect_to :back
  end
end

++ edit

на самом деле лучший способ это сделать так:

class CommentsController < ApplicationController
  def create
    current_user.comments.create(issue_id: params[:issue_id], content: params[:content])
    redirect_to :back
  end
end

просто используйте рельсовые ассоциации

- редактировать

и, как вы думаете, ДА, мы можем изменить Issue_id и написать комментарии к любой проблеме, которую я хочу. так что если вы хотите защититься от этого, вы должны сделать помощник, прежде чем написать комментарий (это всего лишь пример)

class CommentsController < ApplicationController
  def create
    issue = Issue.find(params[:issue_id]
    if issue.is_locked? || current_user.cant_write_at_issue(issue)
      return redirect_to :back, :notice=>"You dont have Privilegs"
    end
    issue.comments.create :user=>current_user, :content=>params[:content])
    redirect_to :back :notice=>"Comment was created successfully"
  end
end

is_locked и cant_write_at_issue, которые вы должны определить в своих моделях. это просто способ как-то защитить.

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

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