请求方法 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
最后但并非最不重要的是,不要忘记回应所有请求,否则第三方程序不会知道他们是否成功