带有主体解析器的ExpressJS-请求主体上的JSON中的反斜杠

时间:2019-03-27 15:59:33

标签: node.js json express body-parser

一切看起来都不错,除非JSON中的反斜杠字符从客户端到带有主体解析器的Express服务器。

请求正文是这样的(我们将其原样放在Postman(原始值)和Swagger-UI上:

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

邮递员的卷曲代码是这样的:

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"
}'

Swagger-UI的curl代码:

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 个答案:

答案 0 :(得分:2)

您正试图修复损坏的客户端。

您的服务器已经接受带有反斜杠的密码这一事实表明了这一点。

如果您为Jason解析器打开了严格模式,那么一切都会变得更加可预测,因为解析器不再试图对数据的外观做出有根据的猜测。这也意味着您现在必须从邮递员客户端发送JSON,而不是自己发明的协议,因此,当密码为"test\\"时发送\

这是因为在JSON字符串中使用斜杠(和双引号)具有特殊含义,因此它们得到特殊处理,而其他字符则没有。当某人的密码包含"时,情况也是如此,在这种情况下,客户端必须将\"发送到您的服务器。