Использование скрытых полей в формах небезопасно? - PullRequest
5 голосов
/ 02 марта 2011

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

  <%= 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. То же самое со статьей.

Я хочу верить, что это подтверждается токенами рельсов, но я не уверен.

Ответы [ 4 ]

6 голосов
/ 02 марта 2011

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

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

Счастливое кодирование.

3 голосов
/ 02 марта 2011

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

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

1 голос
/ 02 марта 2011

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

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

1 голос
/ 02 марта 2011

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

...