📜  在 Node.js 中实现 Csurf 中间件

📅  最后修改于: 2022-05-13 01:56:30.655000             🧑  作者: Mango

在 Node.js 中实现 Csurf 中间件

Node.js 中的 Csurf 模块可防止对应用程序的跨站点请求伪造 (CSRF) 攻击。通过使用这个模块,当浏览器从服务器渲染一个页面时,它会发送一个随机生成的字符串作为CSRF令牌。因此,当执行 POST 请求时,它会将随机 CSRF 令牌作为 cookie 发送。每个请求发送的令牌都是不同的,因为它们是随机生成的。
先决条件

  • 您选择的 IDE
  • 在您的系统中安装和设置 NodeJs 和 NPM。
  • Node.js 模块和嵌入式 JavaScript(ejs) 的基本知识。

安装:

  1. 首先,我们需要使用package.json文件初始化我们的应用程序。因此,在终端中编写以下命令:
npm init
  1. 之后,创建了package.json ,是时候安装我们的依赖项了。因此,通过以下命令安装所需的依赖项:
npm install body-parser cookie-parser express csurf --save
  1. Cookie-parser用于解析传入的 cookie。 Body-parser用于解析我们将在 HTML 文件中创建的传入表单数据。
  2. 创建一个文件并命名为app.js并为所需模块编写以下代码:
    文件名:app.js
javascript
const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');


javascript
const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
  
var csrfProtection = csrf({ cookie: true });
var parseForm = bodyParser.urlencoded({ extended: false });
  
var app = express();
app.set('view engine','ejs')
  
app.use(cookieParser());
  
app.get('/form', csrfProtection, function (req, res) {
  // pass the csrfToken to the view
  res.render('login', { csrfToken: req.csrfToken() });
});
  
app.post('/process', parseForm,
      csrfProtection, function (req, res) {
  res.send('Successfully Validated!!');
});
  
app.listen(3000, (err) => {
   if (err) console.log(err);
   console.log('Server Running');
});


html


      Csurf Middleware


    
                            


  1. 在这里, csrf将充当生成和验证 CSRF cookie 的中间件。该中间件将添加一个用于生成 cookie 的函数。此函数将通过隐藏的表单字段传递给请求。然后,当用户发送请求时,将验证此创建的 cookie。中间件填充req.csrfToken()
  2. 现在我们需要所有模块之后,现在让我们写下完整的代码,如下所示:
    文件名:app.js

javascript

const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
  
var csrfProtection = csrf({ cookie: true });
var parseForm = bodyParser.urlencoded({ extended: false });
  
var app = express();
app.set('view engine','ejs')
  
app.use(cookieParser());
  
app.get('/form', csrfProtection, function (req, res) {
  // pass the csrfToken to the view
  res.render('login', { csrfToken: req.csrfToken() });
});
  
app.post('/process', parseForm,
      csrfProtection, function (req, res) {
  res.send('Successfully Validated!!');
});
  
app.listen(3000, (err) => {
   if (err) console.log(err);
   console.log('Server Running');
});
  1. 在上面的代码中,在导入模块后,我们设置了路由中间件,并将验证方法作为cookie而不是token传递。 Body-parser用于解析来自表单的数据。由于使用cookie作为验证方法,因此使用cookie-parser 。现在,在GET请求中,我们将传递的 cookie 值呈现给视图。在POST请求中,我们首先验证 cookie,如果验证通过,我们将发送一条消息。
  2. 现在,创建一个文件夹并命名为view并创建一个文件并将其命名为login.ejs并在其中编写以下代码:

html



      Csurf Middleware


    
                            

上面的代码示例将作为一个简单的应用程序运行,但会增加额外的安全措施来防止 CSRF。
运行此程序的步骤:

  1. 确保您已经使用以下命令安装了 express、csurf、cookie-parser、body-parser 模块:
npm install express
npm install express
npm install csurf
npm install cookie-parser
npm install body-parser
  1. 使用以下命令运行 index.js 文件:
node index.js
  1. 打开浏览器并转到http://localhost:3000/form ,然后您将看到带有输入字段的表单,如下所示:

  1. 提交表单后,您将看到以下输出:
Successfully Validated!!

结论: Csurf是一个非常有用的节点模块,可以防止跨站请求伪造攻击。