CSRF

跨站请求伪造( CSRF )允许攻击者在不知情或未经许可的情况下代表其他用户执行操作。

AdonisJs 通过拒绝未识别的请求来保护你的应用程序免受 CSRF 攻击。检查具有 POST,PUT 和 DELETE 方法的 HTTP 请求,以确保来自正确的人调用这些请求。

建立

通过 npm 安装 sheild 提供程序:

adonis install @adonisjs/shield

接下来,在 start/app.js 文件中注册提供程序:

const providers = [
  '@adonisjs/shield/providers/ShieldProvider'
]

最后,在 start/kernel.js 文件中注册全局中间件:

const globalMiddleware = [
  'Adonis/Middleware/Shield'
]

Shield 中间件依赖于会话,因此请确保它们已正确设置。

配置

CSRF 的配置保存在 config/shield.js 文件中:

csrf: {
  enable: true,
  methods: ['POST', 'PUT', 'DELETE'],
  filterUris: ['/user/:id'],
  cookieOptions: {}
}
描述
enable 布尔 一个布尔值,用于打开/关闭整个应用程序的 CSRF 。
methods 数组 要受 CSRF 保护的 HTTP 谓词。考虑添加允许最终用户添加或修改数据的所有动词。
filterUris 数组 过滤的 URL 和路由列表。你可以传递实际路径定义或正则表达式以进行匹配。
cookieOptions 对象 cookie option 的对象。

这个如何工作

  • AdonisJs 为访问你网站的每个用户创建 CSRF 。

  • 为每个请求生成一个相应的 token 标记,并作为 csrftoken 和 csrffield() 全局值传递给所有视图。

  • 此外,相同的标记设置为带密钥的 cookie XSRF-TOKEN。像 AngularJs 这样的前端框架会自动读取此 cookie 并将其与每个 Ajax 请求一起发送。

  • 每当发出 POST,PUT 或 DELETE 请求时,中间件都会使用密钥验证令牌以确保其有效。

如果你使用的是 XSRF-TOKENcookie 值,请确保标题键为 X-XSRF-TOKEN 。

查看助手

你可以使用以下视图助手之一访问 CSRF token ,以确保它在表单中设置。

要将令牌与每个请求一起发送,你需要访问它。有几种方法可以访问 CSRF 令牌。

csrfField

{{ csrfField() }}
<input type="hidden" name="_csrf" value="xxxxxx">

csrfToken

该 csrfToken 助手返回令牌的原始值:

{{ csrfToken }}

异常处理

在验证失败时,将使用代码 EBADCSRFTOKEN 抛出异常。

确保你侦听此异常并返回适当的响应,如下所示:

class ExceptionHandler {
  async handle (error, { response }) {
    if (error.code === 'EBADCSRFTOKEN') {
      response.forbidden('Cannot process your request.')
      return
    }
  }
}
最后一次更新: 6/30/2019, 6:20:27 PM