在 Node.js 中实现 Csurf 中间件
原文:https://www . geeksforgeeks . org/impering-csurf-节点内中间件-js/
Node.js 中的 Csurf 模块防止对应用程序的跨站点请求伪造(CSRF)攻击。通过使用这个模块,当浏览器从服务器呈现一个页面时,它会发送一个随机生成的字符串作为 CSRF 标记。因此,当执行开机自检请求时,它将随机发送 CSRF 令牌作为 cookie。对于每个请求,发送的令牌都是不同的,因为它们是随机生成的。 先决条件
- 您选择的集成开发环境
- node.js 和 npm 在您的系统中安装和设置
- Node.js 模块和嵌入式 JavaScript(ejs)的基本知识。
安装:
- 首先,我们需要用 package.json 文件初始化我们的应用程序。因此,在终端中写下以下命令:
npm init
- 之后, package.json 被创建,是时候安装我们的依赖了。因此,通过以下命令安装所需的依赖项:
npm install body-parser cookie-parser express csurf --save
-
Cookie 解析器用于解析传入的 Cookie。正文解析器用于解析我们将在一个 HTML 文件中创建的输入表单数据。
-
创建一个名为 app.js 的文件,并为需求模块编写如下代码: 文件名:app.js
java 描述语言
const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
-
这里, csrf 将作为生成和验证 CSRF cookie 的中间件。这个中间件将增加一个生成 cookies 的功能。该函数将通过隐藏的表单字段传递给请求。当用户发送请求时,这个创建的 cookie 将被验证。中间件填充 req.csrfToken() 。
-
现在我们已经要求了所有的模块,现在让我们写下完整的代码如下所示: 文件名:app.js
java 描述语言
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');
});
-
在上面的代码中,导入模块后,我们设置了路由中间件,并将验证方法作为 cookie 而不是令牌传递。正文解析器用于解析来自表单的数据。由于使用 cookie 作为验证方法,因此使用 cookie 解析器。现在,在获取请求中,我们将传递的 cookie 值呈现给视图。在 POST 请求中,我们首先验证 cookie,如果通过验证,我们将发送一条消息。
-
现在,创建一个名为的文件夹,查看并创建一个名为 login.ejs 的文件,并在其中编写以下代码:
超文本标记语言
<html>
<head>
<title>Csurf Middleware</title>
</head>
<body>
<form action="process" method="POST">
<input type="hidden" name="_csrf"
value="<%= csrfToken %>">
<input type="text" name="myname">
<input type="submit" value="Submit">
</form>
</body>
</html>
版权属于:月萌API www.moonapi.com,转载请注明出处