Узел js пустое тело запроса с CORS и JSON

Я публикую эту тему относительно проблемы, которую предлагает название. Я видел несколько других вопросов, касающихся пустых тел запросов, но ни один из них не помог мне. Надеюсь, если я опубликую свой код, кто-нибудь сможет дать мне хороший совет.

В основном у меня есть клиент, использующий JavaScript для выполнения HTTP-запросов CORS к серверу Node.js. Обычно эти HTTP-запросы являются сообщениями объектов JSON.

Вот пример кода клиента.

username = document.getElementById("username").value;
password = document.getElementById("password").value;
var str = '{"name":"'+username+'","pass":"'+password+'"}';
var req = new XMLHttpRequest();
req.open("POST","http://xxxx:8099/register",true)
req.setRequestHeader("Content-type", "application/json");
req.onreadystatechange = function() 
{
     //irrelevant
}
req.send(str);

}

Вот код сервера.

var express    = require('express');
var bodyParser = require('body-parser');
var app = express();
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
extended: true
}));

// parse application/json
app.use(bodyParser.json());
app.listen(8099);
app.post("/register", function (req, res) {
console.log(req.body); // populated!
console.log(req.body.name);
res.send(200, req.body);
});

Теперь вот результаты, которые я получаю:

Если я устанавливаю тип контента запроса на application/json, то на сервере я получаю пустое тело запроса.

Если я установлю тип содержимого запроса на application/x-www-form-urlencoded, то получу заполненное тело, например { '{"name":"usernamtest","pass":"123"}': '' }.

Однако, если я попытаюсь напечатать req.body.name, я получу неопределенное значение, означающее, что анализатор тела неправильно проанализировал тело в JSON.

Как я это решу? Я просто хочу закончить с объектом JSON этих свойств в примере.

Для тех, кто читает это, я благодарю вас за ваше время. Дополнения, Рикардо Феррейра да Силва

1 ответ

Решение

Современный веб-браузер добавил новое требование безопасности, которое помогает ограничить несанкционированный доступ к вашему веб-сервису из другого домена. Хакерство CSRF (или подделка межсайтовых запросов) включает в себя отправку HTTP-запросов от другого домена к веб-службе в попытке нарушить безопасность сервера и получить доступ к потенциально ценным данным, хранящимся на сервере. Если браузер видит, что запрос направляется в тот же домен, что и веб-сайт, с которого сделан запрос, то он позволяет выполнить запрос. Однако, если домены различаются и запрос включает в себя что-то иное, чем получение статического файла, браузер сначала проверяет разрешение на доступ к службе с сервера.

Заголовки CORS (или общий доступ к ресурсам разных источников) - это то, что сервер должен ответить, чтобы уведомить браузер о том, что разрешено. CORS может создавать белые списки доменов, методы http и конкретные заголовки.

Этот процесс известен как предварительная проверка CORS.

Используя следующий заголовок:

Access-Control-Allow-Origin: *

По сути делает так, чтобы все домены имели доступ. Веб-сервис полностью публичный. Это может оставить зияющую дыру в безопасности, если вы не намерены предоставлять свои услуги публично.

Access-Control-Request-Method указывает, какие методы HTTP разрешены. GET-запросы часто разрешены по умолчанию, если это разрешено.

Access-Control-Request-Age определяет, как долго будет работать предпросмотр CORS. Это измеряется в секундах.

Access-Control-Allow-Headers указывает любые заголовки, которые приняты сервером.

Я настоятельно рекомендую узнать о AJAX Hacking и способах его предотвращения (если вы этого еще не сделали).

Другие вопросы по тегам