我正在寻找关于如何确保其他(相对)不安全网站的“购物车”部分的最佳实践解决方案。
站点中的现有设置使用不安全cookie,并且仅保护(通过SSL)凭据事务。网站的其余部分通过HTTP访问,因此数据传输不安全。不过,这对我们来说不是问题。
但是,现在我们正在向网站添加“shopping-cart-esque”元素,我们希望确保结帐流程。
到目前为止我的想法是:
- 依赖于一个安全的cookie(它将持有一个长的随机“Base64编码”字符串作为一个值),到期时间为15分钟。
- 相同的值(和创建时间戳)将保存在SESSION中(当然在服务器端!)。注意:我说的是常规,不安全的会话。
- 如果他自己验证了cookie,则只会将其发送给用户。如果他已经登录 - 他必须“重新验证”(除非他有一个仍然有效的15分钟安全cookie)并再次给我们他的密码。
- 基本上,我认为这与常规的15分钟长安全“tomcat会话”并无太大不同。此会话中的凭据和数据均通过HTTPS / SSL传输。
醇>
笔记和想法:
- 要验证安全cookie,时间戳和令牌密钥都将存储在服务器上的常规(不安全)会话对象上。但是 - 由于安全令牌仅通过SSL传输,因此(理论上)中间人无法拦截它。因此,即使攻击者设法窃取常规会话ID并伪造用户身份 - ,他仍然需要知道与此用户关联的特定安全令牌 (常规) )会议,以获取他的信用卡详细信息。
- 15分钟的cookie生命周期将在客户端和服务器端强制执行(通过保留创建时间戳)。
- Cookie本身(和安全令牌)不保存任何机密(加密或其他)信息。密钥只是一个很长的随机字符串。
- 要生成令牌,我想使用java的SecureRandom,并对其生成的随机字节进行Base64编码,这样它只包含字母数字,'斜杠'和'加'字符。我想过使用512个随机字节,但是如果可以用更少的话来完成,我很乐意听到:)
这被认为是一个很好的解决方案吗?在这种情况下是否有更好的做法可以应用?有没有什么可以做到进一步提高安全性而不“过度”呢?
提前致谢!汤姆
1 个答案:
答案 0 :(得分:0)
我建议实现J2EE安全性。你应该没有问题使用Struts。
请参阅Oracle Security Guide
由于您使用的是Cookie,因此强制客户端在其浏览器中启用Cookie。
当用户想要使用购物篮然后只在客户端浏览器上存储JSESSION(Container默认)id时,您可以强制用户使用(J2EE安全性)登录(用户不需要按顺序进行身份验证)创建一个会话。)
如果您提供30分钟的会话超时并在会话中保留所有客户端信息,则会将其保留在服务器上,并在客户端消失时将其丢弃。
可以在浏览器上禁用Cookie,并让服务器识别客户端。见J2EE Spec