ExpressJS 的请求正文中 JSON 中的反斜杠 - 带有正文解析器
Backslash in JSON on request body for ExpressJS- with body-parser
一切看起来都正常,除非 JSON 中的反斜杠字符从客户端到带有正文解析器的 Express 服务器。
请求正文是这样的(我们把它放到 Postman(原始值)和 Swagger-UI 上:
{
"username": "admin",
"password": "abc%\-xyz"
}
Postman的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"
}'
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})
没有帮助
您只是在尝试修复损坏的客户端。
您的服务器已经接受带反斜杠的密码这一事实表明了这一点。
如果您为 Jason 解析器打开严格模式,一切都会变得更加可控,因为解析器不再试图对它认为您的数据应该是什么样子进行有根据的猜测。这也意味着你现在必须从你的邮递员客户端发送 JSON,而不是你自己发明的协议,所以当你的密码是 \
.
时发送 "test\"
这是因为斜杠(和双引号)在 JSON 字符串中使用时具有特殊含义,因此它们得到特殊处理,这是其他字符无法得到的。当某人的密码包含 "
时也是如此,如果是这种情况,客户端必须将 \"
发送到您的服务器。
一切看起来都正常,除非 JSON 中的反斜杠字符从客户端到带有正文解析器的 Express 服务器。
请求正文是这样的(我们把它放到 Postman(原始值)和 Swagger-UI 上:
{
"username": "admin",
"password": "abc%\-xyz"
}
Postman的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"
}'
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})
没有帮助
您只是在尝试修复损坏的客户端。
您的服务器已经接受带反斜杠的密码这一事实表明了这一点。
如果您为 Jason 解析器打开严格模式,一切都会变得更加可控,因为解析器不再试图对它认为您的数据应该是什么样子进行有根据的猜测。这也意味着你现在必须从你的邮递员客户端发送 JSON,而不是你自己发明的协议,所以当你的密码是 \
.
"test\"
这是因为斜杠(和双引号)在 JSON 字符串中使用时具有特殊含义,因此它们得到特殊处理,这是其他字符无法得到的。当某人的密码包含 "
时也是如此,如果是这种情况,客户端必须将 \"
发送到您的服务器。