例如
想象一下,我有以下表格
<%= 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 =&gt; 1它改为:user_id =&gt; 2.与文章相同。
我想相信这是用铁轨令牌验证的,但我不确定。
答案 0 :(得分:6)
表单中的隐藏字段不会比来自用户的任何其他数据更安全或更不安全。也就是说,
当数据被发送回服务器时,服务器应验证该数据,而不是仅仅根据特定用户认为操作是允许/无效的 - 可修改的背景。根据需要,可以使用像哈希校验和这样的方法来确保数据没有被篡改(但同样,这个应该由服务器验证每个请求!)。使用“会话状态”完全通过将数据保留在用户操作域之外来缓解问题。 快乐的编码。
答案 1 :(得分:3)
如果允许来自未注册用户的评论,那么为什么要干扰user_id,如果仅允许注册用户发表评论,则使用sessions来跟踪用户,而不是在表单元素中传递user_id
要回答你的问题,如果使用隐藏的字段是不安全的,没有适当的理智检查甚至可见字段是不安全的。
答案 2 :(得分:1)
如果这些字段的值很重要,则不要相信用户不更改它们。否则,隐藏字段不会比常规可见字段更安全或更安全 - 如果它在HTML中,则有人可以更改它。
答案 3 :(得分:1)
如果没有服务器端检查(包括HTML表单和浏览器cookie),则无法信任从客户端发送到服务器的数据。数据可能会被恶意修改或多次发送。
我读过有关从HTML表单提交产品价格的电子商务网站的故事。便宜的用户可以编辑他们提交给服务器的HTML表单数据以更改产品价格。