清理 JSON 以使用 Curl 发送

清理 JSON 以使用 Curl 发送

我必须使用 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
]

相关内容