表单中隐藏字段的使用是否不安全?

Dav*_*d R 6 ruby-on-rails hidden-field

例如
Imagine我有以下表格

  <%= 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 %>
Run Code Online (Sandbox Code Playgroud)

我得到了:user_id和:article_id值:

Comment.new(:user_id => current_user.id, :article_id => @article.id)
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中显示表单时,它将如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果有人更改了post参数而不是以下值:user_id => 1,它会更改为:user_id => 2.与文章相同.

我想相信这是用铁轨令牌验证的,但我不确定.

小智 7

表单中的隐藏字段不会比来自用户的任何其他数据更安全或更不安全.也就是说,它应该被信任trivally:它来自从用户和是开放的操作和专业注射.

当数据被发送回服务器时,服务器应该验证该数据,而不是仅仅基于特定的用户可修改的上下文假设操作是允许/无效的.根据需要,可以使用诸如散列校验和之类的方法来非常高度确信数据未被篡改(但同样,这应该由服务器每次请求验证!).使用"会话状态"完全通过将数据保留在用户操作域之外来缓解问题.

快乐的编码.