我必须使用 JSON 负载向某些服务发送 POST 请求,其中包含一些用户输入。该输入变量需要进行 JSON 编码以防止注入攻击。
发送请求并将响应 JSON 解析为 RESP 变量的代码示例:
RESP=`curl --connect-timeout "10" -s -H "Content-Type: application/json" \
-X POST -d '{ "Attribute": '"'$USERINPUT'" }',\
$ENDPOINT | $JQ -r '.key'`
$USERINPUT
在创建 JSON 有效负载之前如何进行清理或 JSON 编码?
答案1
使用实用jo
程序,可以使用以下方式构建清理后的 JSON 文档
data=$( jo Attribute="$USERINPUT" )
然后,您可以使用-d "$data"
withcurl
将其传递到端点。
旧的(但仍然有效)答案使用jq
而不是jo
:
使用jq
:
USERINPUT=$'a e""R<*&\04\n\thello!\''
该字符串有几个双引号、一个 EOT 字符、一个换行符、一个制表符和一个单引号,以及一些普通文本。
data="$( jq -nc --arg Attribute "$USERINPUT" '$ARGS.named' )"
这会构建一个 JSON 对象,其中包含用户数据作为单独字段的值Attribute
。
由此,我们得到
{"Attribute":"ae\"\"R<*&\u0004\n\thello!'"}
作为 中的值$data
。
现在可以在您的调用中使用curl
:
RESP="$( curl --connect-timeout "10" -s \
-H "Content-Type: application/json" \
-X POST -d "$data" \
"$ENDPOINT" | jq -r '.key' )"
答案2
您可以从命令行使用 Python 模块 json.tool 来解析 JSON:
export USERINPUT="[1,2,3]"
echo $USERINPUT| python -mjson.tool
[
1,
2,
3
]