請求方法 POST w JSON
使用請求方法 POST
與 SSL
結合使資料傳輸更安全。
此外…
- 不再需要大多數編碼和解碼
- 該 URL 對任何一個都是可見的,需要進行 url 編碼。
資料將單獨傳送,因此應通過 SSL 保護 - 資料的大小幾乎沒有得到證實
- 仍然需要防止跨邊指令碼(XSS)
為了使這個展示簡單,我們希望接收 JSON 資料,
並且應該通過跨源資源共享 (CORS)進行通訊。
以下指令碼還將演示兩種不同的內容型別。
#!/bin/bash
exec 2>/dev/null # We dont want any error messages be printed to stdout
trap "response_with_html && exit 0" ERR # response with an html message when an error occurred and close the script
function response_with_html(){
echo "Content-type: text/html"
echo ""
echo "<!DOCTYPE html>"
echo "<html><head>"
echo "<title>456</title>"
echo "</head><body>"
echo "<h1>456</h1>"
echo "<p>Attempt to communicate with the server went wrong.</p>"
echo "<hr>"
echo "$SERVER_SIGNATURE"
echo "</body></html>"
}
function response_with_json(){
echo "Content-type: application/json"
echo ""
echo "{\"message\": \"Hello World!\"}"
}
if [ "$REQUEST_METHOD" = "POST" ]; then
# The environment variabe $CONTENT_TYPE describes the data-type received
case "$CONTENT_TYPE" in
application/json)
# The environment variabe $CONTENT_LENGTH describes the size of the data
read -n "$CONTENT_LENGTH" QUERY_STRING_POST # read datastream
# The following lines will prevent XSS and check for valide JSON-Data.
# But these Symbols need to be encoded somehow before sending to this script
QUERY_STRING_POST=$(echo "$QUERY_STRING_POST" | sed "s/'//g" | sed 's/\$//g;s/`//g;s/\*//g;s/\\//g' ) # removes some symbols (like \ * ` $ ') to prevent XSS with Bash and SQL.
QUERY_STRING_POST=$(echo "$QUERY_STRING_POST" | sed -e :a -e 's/<[^>]*>//g;/</N;//ba') # removes most html declarations to prevent XSS within documents
JSON=$(echo "$QUERY_STRING_POST" | jq .) # json encode - This is a pretty save way to check for valide json code
;;
*)
response_with_html
exit 0
;;
esac
else
response_with_html
exit 0
fi
# Some Commands ...
response_with_json
exit 0
當通過 POST
將 JSON-Data 傳送到此指令碼時,你將獲得 {"message":"Hello World!"}
作為答案。其他任何東西都會收到 html 文件。
varialbe $JSON
也很重要。此變數沒有 XSS,但仍可能包含錯誤的值,需要先進行驗證。請記住這一點。
此程式碼在沒有 JSON 的情況下工作。
你可以用這種方式得到任何資料。
你只需根據需要更改 Content-Type
即可。
例:
if [ "$REQUEST_METHOD" = "POST" ]; then
case "$CONTENT_TYPE" in
application/x-www-form-urlencoded)
read -n "$CONTENT_LENGTH" QUERY_STRING_POST
text/plain)
read -n "$CONTENT_LENGTH" QUERY_STRING_POST
;;
esac
fi
最後但並非最不重要的是,不要忘記迴應所有請求,否則第三方程式不會知道他們是否成功