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

时间:2012-03-30 03:18:54

标签: security scala playframework csrf playframework-2.0

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

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

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

3 个答案:

答案 0 :(得分:11)

我使用play2-authenticitytoken模块:

  

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

工作原理:

  

简而言之:

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

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

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

      如果攻击者注入了不同的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/