这与我提出的另一个问题有关.总而言之,我有一个URL的特殊情况,当一个表单发布到它时,我不能依赖cookie进行身份验证或维护用户的会话,但我不知何故需要知道他们是谁,我需要知道他们已经登录了!
我想我想出了解决问题的方法,但需要充实.这就是我在想的.我创建一个名为"username"的隐藏表单字段,并在其中放置用户的用户名加密.然后,当表单POST时,即使我没有从浏览器收到任何cookie,我知道他们已经登录,因为我可以解密隐藏的表单字段并获取用户名.
我能看到的主要安全漏洞是重播攻击.如何阻止某人获取该加密字符串,并以该用户身份进行POST?我知道我可以使用SSL来更难以窃取该字符串,也许我可以定期轮换加密密钥来限制字符串有用的时间,但我真的很想找到一个防弹解.有人有什么想法吗?ASP.Net ViewState是否阻止重播?如果是这样,他们是如何做到的?
编辑:我希望解决方案不需要存储在数据库中的任何内容.应用程序状态是可以的,除了它将无法在IIS重新启动或在Web场或园林场景中完全工作.我现在接受克里斯的回答,因为我不相信它甚至可以在没有数据库的情况下保证这一点.但如果有人想出一个不涉及数据库的答案,我会接受它!
如果您使用用户名和密码在时间戳中哈希,则可以在几秒钟内关闭重播攻击窗口.我不知道这是否符合您的需求,但它至少是部分解决方案.
如果你真的不想存储任何状态,我认为你能做的最好的事情是通过使用时间戳和短暂的到期时间来限制重放攻击.例如,服务器发送:
{Ts,U,HMAC({Ts,U},Ks)}
其中Ts是时间戳,U是用户名,Ks是服务器的密钥.用户将其发送回服务器,服务器通过重新计算提供的值上的HMAC来验证它.如果它有效,你知道它何时发出,并且如果它比5分钟更早,则可以选择忽略它.
这种类型的开发的一个很好的资源是Web上的客户端身份验证的做法和注意事项
这里有几个很好的答案,把它们放在一起就是答案最终的答案:
块密码加密(使用AES-256 +)和散列(使用SHA-2 +)发送到客户端的所有状态/随机数相关信息.否则黑客只是操纵数据,查看它以学习模式并规避其他一切.记住......它只需一个打开的窗口.
为POST请求发回的每个请求生成一次性随机和唯一的随机数.这样做有两件事:它确保POST响应符合THAT请求.它还允许跟踪一组给定的get/POST对的一次性使用(防止重放).
使用时间戳使nonce池可管理.按照上述#1将时间戳存储在加密的cookie中.丢弃任何早于应用程序的最大响应时间或会话的请求(例如,一小时).
存储机器的"相当独特"的数字指纹,使用加密的时间戳数据发出请求.这将阻止攻击者窃取客户端cookie以执行会话劫持的另一个技巧.这将确保请求不仅返回一次,而且从机器(或足够接近以使攻击者几乎不可能复制)返回表单.
存在基于ASPNET和Java/J2EE安全过滤器的应用程序,它们通过零编码完成上述所有操作.如果性能至关重要,那么管理大型系统的nonce池(如股票交易公司,银行或高容量安全站点)并非易事.建议查看这些产品,而不是尝试为每个Web应用程序编程.