网络安全,隐藏字段是否存在问题(没有敏感数据)?

18

我和同事讨论过这个问题。我们需要实施一些安全标准。我们知道不应该在隐藏字段中存储“敏感的地址、出生日期”等信息,但通常情况下使用隐藏字段是否可行。

例如:

action=goback

使用隐藏字段似乎比将信息添加到查询字符串中更安全。这样做可以减少黑客可以用于攻击应用程序的信息。

10个回答

23

一个黑客可以使用拦截代理(或任何数量的工具)来访问隐藏字段,就像查询字符串值一样容易。

只要您像验证从客户端获取的任何其他值一样验证它们,并且不用于任何敏感信息,我认为使用隐藏字段是没有问题的。


你认为数据库记录的ID是否敏感? - Dimitris Papageorgiou
1
@DimitrisPapageorgiou 是的,想象一下您有一个用户更新表单来更新用户数据,并且您有userID作为隐藏字段。然后,用户可以通过浏览器开发人员工具更改该userID值,然后用户就可以更新另一个可能没有权限执行的用户数据。我知道这是一个非常晚的答案,但我希望它能帮助未来的某个人。 - Wibisono Indrawan

6
使字段“隐藏”与安全几乎没有任何关系,应该被视为UI决策。任何“黑客”都会阅读您的HTML源代码。最好要么根本不显示敏感信息,或者如果必须显示,则使用SSL(以防止网络中介截取数据)和一些登录挑战的组合(以防止未经授权的访问)。

5

只有在您暴露了终端用户无法获得的信息并且/或者没有在返回时进行验证时,才会存在安全漏洞。

我建议将该信息存储在服务器端会话变量中...


4
在安全方面,将数据存储在隐藏字段中与将其存储在查询字符串中完全相同。实际上,如果您的表单使用GET操作,它最终会出现在查询字符串中。
隐藏字段与安全完全无关;它们只是一种在表单中存储数据的方法,而不会“强制”用户看到它。它们不能提供一种“防止”用户查看数据的方式。

3

隐藏字段并不总是问题,但它们应该始终引起警惕,因为它们有两个潜在问题:

1)如果数据是敏感的,则会将其暴露给客户端(例如使用代理或查看源代码 - 试图以编程方式防止这种情况是无意义的)

2)如果服务器解释数据,则有知识的用户可以更改数据。以一个愚蠢的例子来说,如果隐藏字段包含用户的银行余额,则他们可以使用代理或某些非标准客户端使服务器认为他们的银行余额是任何他们选择的。

第二个问题是Web应用程序中漏洞的一个重要来源。与会话相关的数据应该保存在服务器端,除非您有一种验证它的手段(例如,如果字段由服务器签名或加密)。

只要您确信没有陷入上述任何陷阱,它们就可以使用。作为一个经验法则,我不会使用隐藏字段,除非用于您希望在查询字符串中看到的数据,或者如果JavaScript需要它们进行处理。在后一种情况下,您仍然需要确保服务器正在进行验证,不要假设客户端将运行您的JavaScript。


2
考虑加密隐藏字段的名称和值,以进行篡改检查,因为黑客仍然可以获取您的隐藏字段并按照他们想要的方式操纵它们。请保留HTML标记。

1

正如其他人提到的,查询字符串和隐藏字段都是基本上公共数据,可供用户查看。

如果您将数据放在查询字符串中,请记住一件事情,那就是人们会传递URL,因此不应包含任何特定于当前用户的信息。

如果该状态无法直接输入,则最好不要在URL中包含状态信息,或者至少需要处理查询字符串中的无效状态信息。


0
一般情况下不要使用隐藏表单字段存储敏感数据。只用于静态非敏感的 POST 数据,你意识到其不能安全处理 "as its received"。我仅在渲染和接收 POST 时存储会话令牌,以防止 CSRF 攻击或至少使其更难实施。

0
除了其他帖子中提供的所有有用建议外,我还要补充一点:隐藏字段使您的应用程序对SQL注入攻击的脆弱性与URL查询字符串值一样。像往常一样,对输入进行消毒处理。

0

我认为这与将项目放在查询字符串中一样安全,也不更安全。毕竟,一个人始终可以在网站上查看源代码(由于一个人始终可以以编程方式下载源代码,因此没有任何防止方法)。

更好的解决方案是使用服务器生成的密钥加密字段和值的名称,只有服务器可以解密。除非服务器被黑客攻击,否则客户端不会知道价值的名称或其价值。

当然,由于这是来自客户端的内容,您仍然必须检查返回的数据的有效性,不要认为它没有以您未指定的方式被更改。

为此,您需要使用散列来确保该值没有被篡改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接