这一直让我压力很大..我有一个隐藏的输入:
<input type="hidden" value="North Miami" name="city">
在提交表单之前,我通过 JavaScript 使用有效的城市名称填充隐藏输入。假设有人想提交Banana
而不是城市名称。罪魁祸首可以通过 Firebug 等 DOM 检查器轻松更改输入值。
如何确保隐藏的输入不被篡改?我已经在验证输入以防止攻击,但只要我接受字母字符,就可以提交任何内容,因此banana
...
编辑:我指的是一般的隐藏输入,而不仅仅是城市名称。由脚本填充的任何值以及必须未经更改地提交的值。
一些想法:
仅限服务器端。最简单的方法是使用会话变量(例如$_SESSION
)这样所有数据都保存在服务器端,但是管理它并保留用户可能打开的单独选项卡可能会有点棘手。此选项可防止用户查看或编辑信息。
让客户端携带加密的 blob。获取所有“临时但受保护”的数据,以某种方式将其组合(例如 JSON),然后使用只有服务器知道的密钥加密*整个数据。对结果进行 Base64 处理并将其放入隐藏字段值中。 (请注意,对于高安全性应用程序,您还需要在此过程中使用 HMAC,以验证密文未被修改。)此选项还可以防止用户查看或编辑信息,但可以更轻松地处理一个用户打开多个选项卡的情况。
仍然使用不太秘密的隐藏输入字段,但添加防篡改机制。因此,当生成页面时,获取所有现有的“受保护”变量,以某种方式将它们与服务器端秘密值组合起来,并对它们进行散列[更正:HMAC]。将哈希值存储在其自己的隐藏字段中。然后在用户提交后,您重复该过程并检查哈希是否匹配。如果没有,则说明安全违规页面出现所有错误。
*与所有密码学一样,以“正确”的方式执行此操作可能很棘手,并且在很大程度上取决于您的加密/验证方式。在密码和密码模式等方面存在很多陷阱。
最后,请记住,阻止人们修改它并不意味着用户无法复制所有内容并在以后或在另一个帐户下重新使用它,除非您采取措施包括“时间戳”等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)