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