【问题标题】:How to Prevent CSRF in Play [2.0] Using Scala?如何使用 Scala 在 Play [2.0] 中防止 CSRF?
【发布时间】:2012-04-13 18:14:39
【问题描述】:

许多网络框架都有一个标准设置,用于生成带有身份验证令牌的表单。

我是否必须手动创建此类措施,或者 Play 是否带有防止 CSRF 的内置方法?

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

【问题讨论】:

    标签: security scala playframework csrf playframework-2.0


    【解决方案1】:

    从 Play 2.1 开始,框架就支持这一点。 Nick Carroll 写了一篇关于如何使用它的不错的小文章:

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

    【讨论】:

      【解决方案2】:

      我使用play2-authenticitytoken 模块:

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

      它是如何工作的:

      简而言之:

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

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

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

      如果攻击者注入不同的 id,他将永远无法弄清楚如何生成正确的签名。

      【讨论】:

      • 如果我错了请纠正我,但是绕过 XSS 的最佳方法是使用完整的 HTTPS,对吧?
      • @OlivierRefalo HTTPS 不会阻止 XSS 攻击,它只会保护传输中的数据。你可以用谷歌搜索“XSS HTTPS”,你会发现例如thisan article by IBM
      • @user166390 :这种方法也不会阻止气候变化。 XSS 在另一个层面得到缓解。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多