对于我的应用程序,我实现与zentask中显示的相同的安全性.
public class Secured extends Authenticator { @Override public String getUsername(Context ctx) { return ctx.session().get("email"); } @Override public Result onUnauthorized(Context ctx) { ctx.flash().put("error","please login to proceed"); return redirect(routes.Application.index()); } }
当用户被认证时isuser session().put(“email”,email);
我有两个问题第一:当用户离开应用而不使用注销时,您如何使会话无效?第二个更严重的一个是我使用firefox插件cookies管理器检查cookie,我可以复制一个cookie,然后粘贴它,因此我可以访问方法,而不必首次登录,基本上我可以窃取会话
解决方法
Play Framework使用无状态会话.没有状态存储在服务器端,而是所有状态都存储在会话cookie中.要验证会话,播放使用秘密密钥对会话进行签名,并在具有会话cookie的请求到达时验证签名.如果用户篡改会话数据,例如,如果他们将会话中的电子邮件地址更改为别人的电子邮件地址,则签名将不匹配,因此Play将拒绝会话cookie.
是的,您可以复制cookie并稍后使用.但是你不能改变cookie.这意味着你可以“偷”的唯一的cookie是你自己的,但从自己身上窃取并不是真的偷.所以不,你不能窃取会话,除了通过利用其他漏洞,如XSS,但会话令牌也容易受到这一点.
默认情况下,Play被配置为创建“会话”cookie,即关闭浏览器时过期的Cookie.因此,如果用户退出浏览器,浏览器将删除所有会话cookie,用户将不再登录.会话令牌是一样的.
有一个需要注意的问题,即会话令牌也会在服务器上过期,因为服务器保持状态.无状态签名的会话,例如在Play中使用的会话,没有.但是,您可以通过在创建会话期间将时间戳记存储在内部,并验证该时间戳记是否不早于getUsername()方法中配置的过期时间段来自己实现一个到期机制.由于时间戳记被存储在被签名的会话中,所以时间戳不能被篡改而不改变签名,所以这个简单的机制是相当安全的.更高级的解决方案可能是实现每次请求进入时更新该时间戳的过滤器,以便过期可以基于上次访问,而不是在用户登录时.