繁体   English   中英

如何在Play [2.0]中使用Scala防止CSRF?

[英]How to Prevent CSRF in Play [2.0] Using Scala?

许多Web框架都有一个标准设置,用于使用auth令牌生成表单。

我是否必须手动创建此类措施,或者Play是否采用了防止CSRF的方法?

Play网站上的文档似乎没有解决这个问题。

我使用play2-authenticitytoken模块:

真实性令牌是围绕最严重的互联网安全威胁之一:CRSF攻击。 它确保提交表单的客户是收到该页面的人(而不是窃取会话数据的黑客)。

这个怎么运作:

简而言之:

  1. 在每个表单帖子中,我们添加一个包含uuid的隐藏参数
  2. uuid已签名,其签名存储在会话中(转换为cookie)

当用户提交表单时,我们得到:uuid,签名和其他表单输入。

  1. 我们再次签署传入的uuid
  2. 如果签名匹配则验证通过(session.sign = uuid.sign)

如果攻击者注入了不同的id,他将永远不知道如何生成正确的签名。

自Play 2.1以来,在框架中支持这一点。 Nick Carroll写了一篇关于如何使用它的好文章:

http://nickcarroll.me/2013/02/11/protect-your-play-application-with-the-csrf-filter/

为了完整起见,我在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") )
        }
    }   
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM