#javascript #node.js #ajax #ejs #csrf
#javascript #node.js #ajax #ejs #csrf
Вопрос:
Я использую csurf для защиты от атак csrf.
Теперь по какой-то причине запросы перестали работать из-за следующей ошибки:
message: 'invalid csrf token', code: 'EBADCSRFTOKEN'
Теперь я проверил, что такое токен csrf, и вот что-то странное, что я получаю:
{ csrfToken:
'n miXCD9Di-HtygtQPxEVhUETpYQDHrKM5auE8n ' }
Что обычно должно быть:
{ csrfToken:'miXCD9Di-HtygtQPxEVhUETpYQDHrKM5auE8'}
Теперь я проверил везде, но, похоже, не могу найти причину этого.
Вот часть исходного кода: EDIT.EJS:
<p id="csurf" style="display: none;">
<%=csurf%>
</p>
APPROVE.JS:
const csurf = document.getElementById("csurf").innerText.toString();
//more functionality
const data = {
name: bizName.value,
email: bizEmail.value,
location: getlocation(),
owner: {
firstName: ownerFname.value,
lastName: ownerLname.value,
},
phone: phone.value,
website: bizUrl.value,
category: selectedCat,
logo: logoImage,
_csrf: csurf, //here i send it to the server
};
BUSINESS.JS // Серверный код
res.render("business/admin/edit", {
title: `Edit ${doc.name}`,
csurf: req.csrfToken(),
biz: { ...doc, id: paramId },
});
APP.JS // вот обработчик ошибок и настройка
const session = require("express-session");
const csurf = require("csurf");
const flash = require("connect-flash");
var cookieParser = require("cookie-parser");
const csrfMiddleware = csurf({
cookie: true,
});
app.use(csrfMiddleware);
// error handler
app.use(function (err, req, res, next) {
console.log(err);
if (err.code !== "EBADCSRFTOKEN") return next(err);
// error handler
console.log(req.cookies._csrf);
var csrfToken = req.body._csrf.toString();
console.log({csrfToken});
// handle CSRF token errors here
res.status(403);
logger.warn(`Bad CSRF token: ${req.connection.remoteAddress}`);
res.json({ message: "form tampered with", success: false });
next();
});
Ответ №1:
Вы видите новую строку и пробелы, которые находятся <p>
внутри вашего шаблона. Вы можете просто использовать .trim()
для их удаления:
const csurf = document.getElementById("csurf").innerText.trim();
В качестве альтернативы вы можете просто удалить перевод строки и пробелы:
<p id="csurf" style="display: none;"><%=csurf%></p>