Обратная косая черта в JSON по телу запроса для ExpressJS - с парсером тела - PullRequest
1 голос
/ 27 марта 2019

Все выглядит нормально, если только символ обратной косой черты в JSON не приходит от клиента на сервер Express с body-parser.

Тело запроса выглядит следующим образом (мы помещаем это в Postman (необработанное значение) и Swagger-UI как:

{
  "username": "admin",
  "password": "abc%\-xyz"
}

Код curl почтальона выглядит так:

curl -X POST \
  http://localhost:3000/login \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: ef96edfd-dc43-47fe-89c0-76e562fa206d' \
  -H 'cache-control: no-cache' \
  -d '{
  "username": "admin",
  "password": "abc%\-xyz"
}'

Код curl Swagger-UI:

curl -X POST "http://localhost:3000/login" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"username\": \"admin\", \"password\": \"abc%\\-xyz\"}"

Я. Не знаю, в чем разница между Swagger-UI и Postman, но похоже, что в свитке Swagger есть еще один обратный слеш. Но на стороне сервера нет никакой разницы.

Действительно, я не могу контролировать тело запроса, которое приходит от клиента, и пароли могут содержать такие символы, как обратная косая черта. Приложение всегда выдает эту ошибку:

SyntaxError: Unexpected number in JSON at position 45
    at JSON.parse (<anonymous>)
    at parse (/path/to/project/node_modules/body-parser/lib/types/json.js:93:19)
    at /path/to/project/node_modules/body-parser/lib/read.js:121:18
    at invokeCallback (/path/to/project/node_modules/raw-body/index.js:224:16)
    at done (/path/to/project/node_modules/raw-body/index.js:213:7)
    at IncomingMessage.onEnd (/path/to/project/node_modules/raw-body/index.js:273:7)
    at IncomingMessage.emit (events.js:189:13)
    at endReadableNT (_stream_readable.js:1103:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

Если JSON становится с двумя обратными слешами (\):

{
  "username": "admin",
  "password": "abc%\\-xyz"
}

Тогда на стороне сервера больше нет ошибок (внутри функции route.post ()), но body.password имеет еще две обратные косые черты: abc%\\-xyz

Как было указано в комментариях, это может быть проблемой синтаксического анализа.

Как правильно с этим бороться? bodyParser.json({strict: false}) не помогает

1 Ответ

2 голосов
/ 27 марта 2019

Вы просто пытаетесь исправить неисправные клиенты.

Тот факт, что ваш сервер уже принимает пароли с обратной косой чертой, показывает это.

Если вы включите строгий режим для своего анализатора Jason, все станет более предсказуемым, так как анализатор больше не будет пытаться делать обоснованные предположения о том, как, по его мнению, должны выглядеть ваши данные.Это также означает, что теперь вам нужно отправлять JSON из своего почтового клиента, а не из собственного изобретенного протокола, поэтому отправьте "test\\", если ваш пароль \.

Это потому, что косая черта (идвойные кавычки) имеют особое значение при использовании в строке JSON, и, таким образом, они получают специальную обработку, то, что другие символы не получают.То же самое относится и к тому, когда кто-то содержит пароль ", в этом случае клиент должен отправить \" на ваш сервер.

...