最近实施了一项关于安全编码的新公司政策。最初的审计评估表明我在以下方面存在缺陷:
Session state must be managed such that a session will withstand replay-attacks.我不太确定这句话是什么意思,也不知道为什么我对它不感兴趣。我正在开发一个Java Web应用程序,并按如下方式设置会话:
session.setMaxInactiveInterval(36000);
发布于 2011-07-13 05:45:41
必须对
会话状态进行管理,以使会话能够经受重放攻击。
这句话太让人困惑了。重新措辞将产生以下结果:
会话管理框架必须保护应用程序不受会话ID重播的影响。
它不那么令人困惑(希望如此),并继续承载着与前者相同的含义(再次希望如此)。
通常,如果要实现自己开发的会话管理框架,而不是依赖于容器提供的框架,则应用程序的会话管理功能很可能容易受到重放攻击。
会话重放攻击将涉及在会话过期后在请求中重放会话ID的场景。编写良好的会话管理框架会识别出所提供的会话ID不是有效的会话ID。但是,有漏洞的会话管理框架会接受现已过期的会话ID,并重新创建会话的内容。在更糟糕的情况下,会话管理框架在会话到期时根本不会破坏会话,从而导致会话ID重放导致请求被处理的情况。
必须记住,即使是应用程序的普通用户,如果他们能够在不登录的情况下浏览到应用程序中受保护的页面,也可能无意中执行会话重放攻击。这表明应用程序的身份验证和会话管理功能失败,因为理想情况下,应用程序应该只允许用户在身份验证成功后浏览受保护的页面,这将产生一个令牌(会话ID),该令牌可以在特定持续时间内用于访问站点,而无需进一步的身份验证。如果使用持久化cookies进行身份验证,则可能无意中引入了一个漏洞。
如上所述,可以通过以下方式保护任何应用程序免受会话重放攻击:
session.setMaxInactiveInterval的使用来看,我会假设您就是它。但是,为了确保这一点,请验证您是否使用其他方法创建会话ID,或者验证您使用的标识符是否等同于会话ID。简而言之,确保您的应用程序仅依赖JSESSIONID cookie的值(或容器中配置的等价物)将会话ID传递给浏览器。此外,验证是否正在使用持久cookie (请参阅上面发布的scenario).session.setMaxInactiveInterval中为当前使用的值指定的持续时间为10小时。我会认为这是不安全的。大多数应用程序不需要超过30分钟的会话过期滚动窗口,10分钟是高值apps.session.invalidate()来完成的。确保首先为用户提供了从应用程序注销的链接,以便可以使用前面提到的API调用处理注销请求以使会话无效。如果不执行此活动,服务器端会话对象将仅在会话到期时销毁(这将在用户处于非活动状态10小时后发生;现在您知道为什么10小时不是一个好主意了)。发布于 2011-07-13 03:30:00
这是与会话劫持类似的事情。其中身份验证令牌由黑客持有以便在稍后阶段登录。
在我的项目中,我添加了一个简单的过滤器,它执行以下操作。
响应的每个jsp页面都将被赋予一个名为id的属性(该标记是使用UUID()生成的。在会话中放置相同的令牌。
当页面发布时,过滤器(配置为过滤所有请求)检查这些令牌是否相等&仅当这些值匹配时才继续。
我们还在会话和数据库中添加了时间戳,无论何时提交页面,我们都会使用db检查会话中的时间戳。如果数字在10毫秒内,则请求通过,否则用户将被重定向...
https://stackoverflow.com/questions/6669769
复制相似问题