CSURF возвращает EBADCSRFTOKEN, если токен записан неправильно

#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>