我和同事讨论过这个问题。我们需要实施一些安全标准。我们知道不应该在隐藏字段中存储“敏感的地址、出生日期”等信息,但通常情况下使用隐藏字段是否可行。
例如:
action=goback
使用隐藏字段似乎比将信息添加到查询字符串中更安全。这样做可以减少黑客可以用于攻击应用程序的信息。
我和同事讨论过这个问题。我们需要实施一些安全标准。我们知道不应该在隐藏字段中存储“敏感的地址、出生日期”等信息,但通常情况下使用隐藏字段是否可行。
例如:
action=goback
使用隐藏字段似乎比将信息添加到查询字符串中更安全。这样做可以减少黑客可以用于攻击应用程序的信息。
只有在您暴露了终端用户无法获得的信息并且/或者没有在返回时进行验证时,才会存在安全漏洞。
我建议将该信息存储在服务器端会话变量中...
隐藏字段并不总是问题,但它们应该始终引起警惕,因为它们有两个潜在问题:
1)如果数据是敏感的,则会将其暴露给客户端(例如使用代理或查看源代码 - 试图以编程方式防止这种情况是无意义的)
2)如果服务器解释数据,则有知识的用户可以更改数据。以一个愚蠢的例子来说,如果隐藏字段包含用户的银行余额,则他们可以使用代理或某些非标准客户端使服务器认为他们的银行余额是任何他们选择的。
第二个问题是Web应用程序中漏洞的一个重要来源。与会话相关的数据应该保存在服务器端,除非您有一种验证它的手段(例如,如果字段由服务器签名或加密)。
只要您确信没有陷入上述任何陷阱,它们就可以使用。作为一个经验法则,我不会使用隐藏字段,除非用于您希望在查询字符串中看到的数据,或者如果JavaScript需要它们进行处理。在后一种情况下,您仍然需要确保服务器正在进行验证,不要假设客户端将运行您的JavaScript。
正如其他人提到的,查询字符串和隐藏字段都是基本上公共数据,可供用户查看。
如果您将数据放在查询字符串中,请记住一件事情,那就是人们会传递URL,因此不应包含任何特定于当前用户的信息。
如果该状态无法直接输入,则最好不要在URL中包含状态信息,或者至少需要处理查询字符串中的无效状态信息。
我认为这与将项目放在查询字符串中一样安全,也不更安全。毕竟,一个人始终可以在网站上查看源代码(由于一个人始终可以以编程方式下载源代码,因此没有任何防止方法)。
更好的解决方案是使用服务器生成的密钥加密字段和值的名称,只有服务器可以解密。除非服务器被黑客攻击,否则客户端不会知道价值的名称或其价值。
当然,由于这是来自客户端的内容,您仍然必须检查返回的数据的有效性,不要认为它没有以您未指定的方式被更改。
为此,您需要使用散列来确保该值没有被篡改。