文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

实用Nodejs npm包:koa-csrf的示例分析

2023-06-14 19:36

关注

这篇文章将为大家详细讲解有关实用Nodejs npm包:koa-csrf的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

JS是什么

JS是JavaScript的简称,它是一种直译式的脚本语言,其解释器被称为JavaScript引擎,是浏览器的一部分,主要用于web的开发,可以给网站添加各种各样的动态效果,让网页更加美观。

koa-csrf是一个用于防止csrf攻击的koa中间件。

当然关于什么是csrf、以及如何预防这里就不赘述了,有兴趣的可以阅读understanding-csrf。egg处理csrf方案。

首先我们看个简单示例:

const router = require('koa-router')();const CSRF = require('koa-csrf');const csrfMD = new CSRF({  invalidSessionSecretMessage: 'Invalid session secret',  invalidTokenMessage: 'Invalid CSRF token',  invalidTokenStatusCode: 403,});router  .get('/',csrfMD,async (ctx, next) => {    ctx.cookies.set('cid','1234', cookieSet);    // 下发csrf token    await ctx.render('index', {      title: 'EJS !',      csrf: ctx.csrf    });  })  .post('/post', csrfMD ,async (ctx, next) => {    console.log(ctx.method);    ctx.session.email = ctx.request.body.email;    ctx.session.name = ctx.request.body.name;    ctx.redirect('/');  })module.exports = router;

简单理解其工作流程:

客户端请求页面:

用户写操作,比如发送post 请求时:

koa-csrf

koa-csrf中关于token的创建、校验逻辑都是在这个csrf包里。

const csrf = require('csrf');class CSRF {  constructor(opts = {}) {    // opts配置对象、并且有提供默认配置    // 允许自定义配置对象进行覆盖    this.opts = Object.assign(      {        // 使 koa 抛出的错误信息内容,默认值为:'Invalid CSRF token'。        // 它可以是一个接收 ctx 作为参数的函数,函数最后返回错误信息内容。        invalidTokenMessage: 'Invalid CSRF token',        // 验证失败时的响应状态码,默认值为:403(Forbidden)        // 跟 invalidTokenMessage 参数一样,它也会被传递给 ctx.throw,用于抛出错误和拒绝请求。        invalidTokenStatusCode: 403,        // 排除的请求方法,默认值为:['GET', 'HEAD', 'OPTIONS']。        excludedMethods: ['GET', 'HEAD', 'OPTIONS'],        // 是否禁止通过查询字符串传递 _csrf 校验 token,默认值为 false        // 如果校验 token 出现在 URL 中,则可能会通过 Referer 泄露,应尽量把 Token 放在表单中,把敏感操作由 GET 改为 POST。        disableQuery: false      },      opts    );    // 生成token generation/verification instance    this.tokens = csrf(opts);    // 早期很多这样的中间件写法、对接koa中间件    return this.middleware.bind(this);  }  // koa中间件  middleware(ctx, next) {    // __defineGetter__ API已经不推荐使用    // 在ctx上挂载csrf属性。    // 当读取ctx.csrf会执行该回调    ctx.__defineGetter__('csrf', () => {      // 如果已经存在直接返回、避免多次生成      if (ctx._csrf) {        return ctx._csrf;      }      // csrf依赖于koa session      if (!ctx.session) {        return null;      }      // 生成一个secret存储在ctx.session.secret      if (!ctx.session.secret) {        ctx.session.secret = this.tokens.secretSync();      }      // 根据上述的secret生成csrf toke存到ctx._csrf      // 一般非框架本身属性,都建议_xx表示私有      ctx._csrf = this.tokens.create(ctx.session.secret);      // 返回      return ctx._csrf;    });    // 挂栽ctx.response.csrf属性    ctx.response.__defineGetter__('csrf', () => ctx.csrf);    // 如果是请求方法黑名单直接不处理    if (this.opts.excludedMethods.indexOf(ctx.method) !== -1) {      return next();    }    if (!ctx.session.secret) {      ctx.session.secret = this.tokens.secretSync();    }    // 从ctx.request.body取出客户端传递过来的_csrf token    // 因此依赖于koa-bodyparser类库    const bodyToken =      ctx.request.body && typeof ctx.request.body._csrf === 'string'        ? ctx.request.body._csrf        : false;    // 除了从body获取token    // 支持从ctx.query._csrf即get方法查询字符串    // 支持从请求头获取 'csrf-token'、'xsrf-token'、'x-csrf-token'、'x-xsrf-token'    const token =      bodyToken ||      (!this.opts.disableQuery && ctx.query && ctx.query._csrf) ||      ctx.get('csrf-token') ||      ctx.get('xsrf-token') ||      ctx.get('x-csrf-token') ||      ctx.get('x-xsrf-token');      // 如果获取失败、根据配置对象的信息、抛出异常    if (!token) {      return ctx.throw(        this.opts.invalidTokenStatusCode,        typeof this.opts.invalidTokenMessage === 'function'          ? this.opts.invalidTokenMessage(ctx)          : this.opts.invalidTokenMessage      );    }    // 校验token失败    if (!this.tokens.verify(ctx.session.secret, token)) {      return ctx.throw(        this.opts.invalidTokenStatusCode,        typeof this.opts.invalidTokenMessage === 'function'          ? this.opts.invalidTokenMessage(ctx)          : this.opts.invalidTokenMessage      );    }    // 校验成功    return next();  }}module.exports = CSRF;

关于“实用Nodejs npm包:koa-csrf的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯