【问题标题】:What are some alternatives to CSRF tokens in Laravel?Laravel 中的 CSRF 代币有哪些替代品?
【发布时间】:2016-10-28 04:29:16
【问题描述】:

对于使用 Laravel 控制器的非基于 PHP 的 Web 客户端 (JSON); Laravel 中用于保护 Web 请求的 CSRF 令牌的潜在替代方案是什么?

【问题讨论】:

  • 无论您的控制器返回 JSON 数据还是 HTML 文件,您仍然需要在链接中添加一个令牌(GET 或 POST 参数)以使其无法被攻击者重现。它可以是任何在后端生成并预先传递给客户端的 ID。
  • @pumbo 您不应在 url 中传递 csrf 令牌,因为攻击者可能更容易获取 url 参数(浏览器可能存储这些参数,代理记录它们等),还有令牌当然,甚至可能在客户端上生成一些额外的风险,但它对于许多场景仍然足够安全。

标签: javascript php laravel security


【解决方案1】:

如果您的 API 使用的身份验证方案不依赖于浏览器自动发送的身份验证令牌(这实际上意味着令牌或会话 ID 不在 cookie 中),则您的 API 不会受到 CSRF 的攻击。这包括基于令牌的身份验证,除非令牌存储在 cookie 中。

如果使用 cookie 传递身份验证令牌(包括会话 ID,这方面相同),您需要对所有更改服务器状态的请求(主要是数据,但也包括登录状态或权限级别)进行 CSRF 保护.

对于 Laravel,您需要将来自 XSRF-TOKEN cookie 的令牌值作为 X-CSRF-TOKEN 中的请求标头值传递。使用 jQuery,这可以在任何客户端框架中通过读取 cookie 值并将其添加到请求中轻松完成:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': csrfCookieValue
  }
});

如果您的客户端不是基于浏览器的,您可以实现与 Laravel 中不同的保护。 OWASP 有一个cheat sheet 说明您的选择,可能 双重提交 是最容易实现的,同时也相当安全。简而言之,您创建一个随机令牌并将其作为 cookie 和请求标头发送到服务器,服务器仅比较两者(cookie 和标头)是否匹配。这是可行的,因为不同来源(域)上的攻击者由于浏览器中的相同来源策略而无法设置或访问应用程序来源的 cookie。

【讨论】:

    【解决方案2】:

    我认为使用csrf token 的全部意义在于在应用程序内部使用。如果您从应用程序本身通过 ajax 发送请求,那么您只需将 csrf_token 附加到请求中即可。但是,如果您通过json 从外部源发送数据,那么最好的方法是使用oAuth 来保护对您的api 的访问。幸运的是,laravel 已经用laravel/passport 构建了这个功能,所以实现起来相当简单。

    【讨论】:

      猜你喜欢
      • 2012-12-18
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      相关资源
      最近更新 更多