【发布时间】:2012-04-13 18:14:39
【问题描述】:
许多网络框架都有一个标准设置,用于生成带有身份验证令牌的表单。
我是否必须手动创建此类措施,或者 Play 是否带有防止 CSRF 的内置方法?
Play website 上的文档似乎没有解决这个问题。
【问题讨论】:
标签: security scala playframework csrf playframework-2.0
许多网络框架都有一个标准设置,用于生成带有身份验证令牌的表单。
我是否必须手动创建此类措施,或者 Play 是否带有防止 CSRF 的内置方法?
Play website 上的文档似乎没有解决这个问题。
【问题讨论】:
标签: security scala playframework csrf playframework-2.0
从 Play 2.1 开始,框架就支持这一点。 Nick Carroll 写了一篇关于如何使用它的不错的小文章:
http://nickcarroll.me/2013/02/11/protect-your-play-application-with-the-csrf-filter/
【讨论】:
我使用play2-authenticitytoken 模块:
真实性令牌是一种解决最严重的互联网安全威胁之一的方法:CRSF 攻击。它确保提交表单的客户是收到页面的人(而不是窃取您会话数据的黑客)。
它是如何工作的:
简而言之:
- 在每个表单帖子中,我们添加一个包含 uuid 的隐藏参数
- uuid 已签名,其签名存储在会话中(转换为 cookie)
当用户提交表单时,我们得到:uuid、签名和其他表单输入。
- 我们再次对传入的 uuid 进行签名
- 如果签名匹配则验证通过 (session.sign=uuid.sign)
如果攻击者注入不同的 id,他将永远无法弄清楚如何生成正确的签名。
【讨论】:
为了完整起见,我在 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") )
}
}
}
【讨论】: