答案 0 :(得分:11)
我使用play2-authenticitytoken模块:
真实性令牌是解决最严重的互联网安全威胁之一:CRSF攻击。它确保提交表单的客户是收到该页面的人(而不是窃取会话数据的黑客)。
工作原理:
简而言之:
- 在每个表单帖子中,我们添加一个包含uuid的隐藏参数
- uuid已签名,其签名存储在会话中(转换为cookie)
醇>当用户提交表单时,我们会得到:uuid,签名和其他表单输入。
- 我们再次签署传入的uuid
- 如果签名匹配(session.sign = uuid.sign)
,则验证通过 醇>如果攻击者注入了不同的id,他将永远不知道如何生成正确的签名。
答案 1 :(得分:8)
为了完整起见,我在Scala for Play 2.0中有一个例子
此方法还使用cookie +隐藏字段方法。
使用SessionKey
操作来帮助签署表单:
object Application extends Controller {
def login = SessionKey{ (key,signature) =>
Action { implicit request =>
Ok( views.html.login(signature) ).withSession( key->signature )
}
}
}
解析表单时,请使用以下内容检查签名:
object Authenticator extends Controller {
def login = ValidateForm{
Action { implicit request =>
Ok( views.html.index("You're Loggd In") )
}
}
}
答案 2 :(得分:8)
自Play 2.1以来,在框架中支持这一点。尼克卡罗尔写了一篇关于如何使用它的好文章:
http://nickcarroll.me/2013/02/11/protect-your-play-application-with-the-csrf-filter/