分享一个实用Nodejs npm包:koa-csrf
本篇文章给大家分享一个实用Nodejs npm包---koa-csrf。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
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;
简单理解其工作流程:
客户端请求页面:
- 服务端为用户当前 session 生成 secret 值,并存到 session 里;
- 根据secret生成csrf token,存到ctx._csrf;
- 下发csrf token到客户端
用户写操作,比如发送post 请求时:
- 服务端获取客户端传递过来的csrf token;
- 服务端从当前 session找到 secret 值;
- 服务器用secret与接收的csrf token进行校验;
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;
下一期我们看下csrf库,这个里面处理更多相关逻辑。
好了,今天就到这结束了,下期见。
ps:如果你对node也有兴趣,欢迎关注我公众号:xyz编程日记。
相关推荐:《nodejs 教程》
Atas ialah kandungan terperinci 分享一个实用Nodejs npm包:koa-csrf. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Perkhidmatan Node yang dibina berdasarkan bukan sekatan dan dipacu peristiwa mempunyai kelebihan penggunaan memori yang rendah dan sangat sesuai untuk mengendalikan permintaan rangkaian besar-besaran. Di bawah premis permintaan besar-besaran, isu yang berkaitan dengan "kawalan memori" perlu dipertimbangkan. 1. Mekanisme kutipan sampah V8 dan had ingatan Js dikawal oleh mesin kutipan sampah

Artikel ini akan memberi anda pemahaman yang mendalam tentang memori dan pengumpul sampah (GC) enjin NodeJS V8 saya harap ia akan membantu anda!

Modul fail ialah enkapsulasi operasi fail asas, seperti membaca/menulis/membuka/menutup/memadam fail, dsb. Ciri terbesar modul fail ialah semua kaedah menyediakan dua versi **segerak** dan ** asynchronous**, dengan Kaedah dengan akhiran penyegerakan adalah semua kaedah penyegerakan, dan kaedah yang tidak semuanya adalah kaedah heterogen.

Memilih imej Docker untuk Node mungkin kelihatan seperti perkara remeh, tetapi saiz dan potensi kelemahan imej itu boleh memberi kesan yang ketara pada proses dan keselamatan CI/CD anda. Jadi bagaimana kita memilih imej Node.js Docker yang terbaik?

Node 19 telah dikeluarkan secara rasmi Artikel ini akan memberi anda penjelasan terperinci tentang 6 ciri utama Node.js 19. Saya harap ia akan membantu anda!

Bagaimanakah Node.js melakukan GC (pengumpulan sampah)? Artikel berikut akan membawa anda melaluinya.

Sebab mengapa nod tidak boleh menggunakan arahan npm adalah kerana pembolehubah persekitaran tidak dikonfigurasikan dengan betul Penyelesaiannya ialah: 1. Buka "Sistem Sifat"; 2. Cari "Pembolehubah Persekitaran" -> "Pembolehubah Sistem", dan kemudian edit persekitaran. pembolehubah; 3. Cari lokasi folder nodejs;

Gelung peristiwa ialah bahagian asas Node.js dan mendayakan pengaturcaraan tak segerak dengan memastikan bahawa utas utama tidak disekat Memahami gelung peristiwa adalah penting untuk membina aplikasi yang cekap. Artikel berikut akan memberi anda pemahaman yang mendalam tentang gelung acara dalam Node.
