Является ли использование скрытых полей в формах небезопасным?

Например
Представьте, что у меня есть следующая форма

  <%= form_for(@comment) do |f| %>

    <%= f.hidden_field :user_id%>
    <%= f.hidden_field :article_id%>

    <%= f.label :content %><br />
    <%= f.text_area :content %>

    <%= f.submit %>
  <% end %>

Я получил значения :user_id и :article_id с помощью:

Comment.new(:user_id => current_user.id, :article_id => @article.id)

Когда я отображаю форму в браузере, она будет выглядеть так:

<form action="/comments" method="post">

  <input some_rails_tokens_here />

  <!-- THIS AREA HERE-->
  <input id="comment_user_id" name="comment[user_id]" type="hidden" value="1" />
  <input id="comment_article_id" name="comment[article_id]" type="hidden" value="1" />
  <!-- THIS AREA HERE-->

  <label for="comment_content">Content</label><br />
  <textarea id="comment_content" name="comment[content]"></textarea>

  <input type="submit" />
</form>

У меня вопрос, что если кто-то изменит параметры поста и вместо значения :user_id => 1 изменится на :user_id => 2. То же самое со статьей.

Я хочу верить, что это проверено с помощью токенов rails, но я не уверен.


person David R    schedule 02.03.2011    source источник
comment
Было очень легко изменить значения. В опции firebug -> edit я просто изменил значение в HTML и вуаля! вместо того, чтобы быть пользователем 1, я публиковал как пользователь 2.   -  person David R    schedule 02.03.2011


Ответы (4)


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

Когда данные отправляются обратно на сервер, сервер должен проверять эти данные и не предполагать, что операция разрешена/недействительна только на основе определенного контекста, который может быть изменен пользователем. В зависимости от потребностей можно использовать такие подходы, как контрольные суммы хэшей, чтобы иметь очень высокую степень уверенности в том, что данные не были подделаны (но опять же, это должно проверяться сервером при каждом запросе!). Использование «состояния сеанса» полностью смягчает проблему, защищая данные от манипуляций пользователя.

Удачного кодирования.

person Community    schedule 02.03.2011

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

И чтобы ответить на ваш вопрос, небезопасно ли использование скрытых полей, без надлежащей проверки работоспособности даже видимые поля небезопасны.

person Anand Shah    schedule 02.03.2011

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

person Marc B    schedule 02.03.2011

Данным, отправляемым с клиента на сервер, нельзя доверять без проверок на стороне сервера (включая HTML-формы и файлы cookie браузера). Данные могут быть злонамеренно изменены или отправлены несколько раз.

Я читал истории о сайтах электронной коммерции, которые отправляли цену продукта из HTML-формы. Дешевый пользователь может отредактировать данные HTML-формы, которые он отправляет на сервер, чтобы изменить цену продукта.

person Chris Peterson    schedule 02.03.2011