请求方法 POST w JSON

使用请求方法 POSTSSL 结合使数据传输更安全。

此外…

  • 不再需要大多数编码和解码
  • 该 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

当通过 POSTJSON-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

最后但并非最不重要的是,不要忘记回应所有请求,否则第三方程序不会知道他们是否成功