一部のユーザー入力を含む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"
その後、withを使用してcurl
エンドポイントに渡すことができます。
以前の(しかしまだ有効な)答えは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
]