6

例如
想象我有以下表格

  <%= 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>

我的问题是,如果有人更改了 post 参数而不是 :user_id => 1 的值,而是更改为 :user_id => 2 怎么办。文章也是如此。

我想相信这是用 rails 令牌验证的,但我不确定。

4

4 回答 4

7

表单中的隐藏字段与来自用户的任何其他数据一样安全或不安全。也就是说,它不应该简单地信任:它来自用户并且对操纵和专业注入是开放的。

当数据被发送回服务器时,服务器应该验证该数据,而不是仅仅基于特定的用户可修改上下文假设操作是允许/无效的。根据需要,可以使用像哈希校验和这样的方法来高度确信数据没有被篡改(但同样,这应该由服务器在每次请求时进行验证!)。使用“会话状态”通过将数据排除在用户操作区域之外来完全缓解问题。

快乐编码。

于 2011-03-02T05:50:16.100 回答
3

如果允许来自未注册用户的评论,那么为什么还要关心 user_id,如果只允许来自注册用户的评论,那么使用会话来跟踪用户,而不是在表单元素中传递 user_id。

如果使用隐藏字段不安全,如果没有适当的健全性检查,即使可见字段也不安全,请回答您的问题。

于 2011-03-02T05:40:49.370 回答
1

如果这些字段的值很关键,那么不要相信用户会原封不动地返回它们。否则,隐藏字段的安全性不会低于或不会高于常规可见字段 - 如果它在 HTML 中,则有人可以更改它。

于 2011-03-02T05:35:10.540 回答
1

如果没有服务器端检查(包括 HTML 表单和浏览器 cookie),则无法信任从客户端发送到服务器的数据。数据可能被恶意修改或多次发送。

我读过有关从 HTML 表单提交产品价格的电子商务网站的故事。便宜的用户可以编辑他们提交给服务器的 HTML 表单数据来更改产品价格。

于 2011-03-02T05:47:09.630 回答