Это плохая практика для подтверждения параметров, представленных через браузер? - PullRequest
6 голосов
/ 09 апреля 2011

У меня есть установка наследования одной таблицы, где у меня есть один контроллер (я чувствовал, что наличие нескольких будет дублировать).Однако для некоторых методов я бы хотел обратиться к подклассам моделей.Я решил, что браузер может отправить параметр, против которого я напишу оператор case.Что-то вроде:

case @model[:type]
when "A"
  @results = Subclass1.search(params[:term])
when "B"
  @results = Subclass2.search(params[:term])
...
end

В качестве альтернативы я узнал, что Ruby, несмотря на все свои хитрости, может создать модель из строки.Что-то вроде:

@results = params[:model].constantize.search(params[:term])

Мой вопрос: это плохая практика?Я могу представить, что кто-то подлый мог бы создать запрос, который заставил бы меня сформировать произвольный внутренний объект ... но я мог бы подтвердить, что объект является подклассом того, что я хочу ..

Ответы [ 3 ]

7 голосов
/ 10 апреля 2011

Когда я делаю это, мне нравится рефакторинг с помощью case, просто чтобы быть очень ясным относительно моих разрешенных входов:

@results = case params[:model]
  when 'page'   then Page
  when 'post'   then Post
  else raise 'finger'
end.search(params[:term])
1 голос
/ 10 апреля 2011

Этот фрагмент использует Ick maybe для простоты, но запишите его, как вам удобно, смысл просто использовать хеш:

@results = {"A" => Subclass1, "B" => Subclass2}[params[:model]].maybe.search(params[:term])
1 голос
/ 10 апреля 2011

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

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