表单中隐藏字段的使用是不安全的吗?
例如
想象一下,我有以下表格
我得到了:user_id和:article_id值:
Comment.new(:user_id => current_user.id, :article_id => @article.id)
当我在浏览器中显示表单时,它将如下所示:
我的问题是,如果有人更改了post参数而不是以下值:user_id => 1,它会更改为:user_id => 2.与文章相同。
我想相信这是用铁轨令牌validation的,但我不确定。
表单中的隐藏字段不会比来自用户的任何其他数据更安全或更不安全 。 也就是说, 它不应该是微不足道的信任 :它来自用户,并且对操作和专业注入持开放态度 。
当数据被发送回服务器时,服务器应该validation该数据,而不是仅仅基于特定的用户可修改的上下文假设操作是允许/无效的。 根据需要,可以使用像哈希校验和这样的方法来确保数据没有被篡改(但同样,这应该由服务器validation每个请求!)。 使用“会话状态”完全通过将数据保留在用户操作域之外来缓解问题。
快乐的编码。
如果允许来自未注册用户的注释,那么为什么根本不关心user_id,并且如果仅允许来自注册用户的注释,则使用会话来跟踪用户,而不是在表单元素中传递user_id。
并回答你的问题,如果使用隐藏的字段是不安全的,没有适当的理智检查甚至可见字段是不安全的。
如果这些字段的值很重要,那么不要相信用户不改变它们。 否则,隐藏字段不会比常规可见字段更安全或更安全 – 如果它在HTML中,则有人可以更改它。
如果没有服务器端检查(包括HTML表单和浏览器cookie),则无法信任从客户端发送到服务器的数据。 数据可能被恶意修改或多次发送。
我读过有关从HTML表单提交产品价格的电子商务网站的故事。 便宜的用户可以编辑他们提交给服务器的HTML表单数据以更改产品价格。