請求方法 GET
通過 GET
呼叫 CGI 指令碼非常容易。
首先,你需要指令碼的 encoded url
。
然後新增一個問號 ?
,後跟變數。
- 每個變數應該有兩個由 = 分隔的部分。
第一部分應始終是每個變數的唯一名稱,
而第二部分僅包含值 - 變數由 & 分開 ****
- 字串的總長度不應超過 255 個字元
- 名稱和值需要進行 html 編碼(替換: </,/?:@&= + $ )
提示:
使用 html-forms 時,請求方法可以由 self 生成。
使用 **Ajax,**你可以通過 encodeURI 和 encodeURIComponent 進行編碼 ****
例:
http://www.example.com/cgi-bin/script.sh?var1=Hello%20World!&var2=This%20is%20a%20Test.&
伺服器應僅通過跨源資源共享 (CORS)進行通訊,以使請求更安全。在這個展示中,我們使用 CORS 來確定我們想要使用的 Data-Type
。
我們可以選擇很多 Data-Types
,最常見的是……
- text / html 的
- 純文字/
- 應用程式/ JSON
傳送請求時,伺服器還將建立許多環境變數。目前最重要的環境變數是 $REQUEST_METHOD
和 $QUERY_STRING
。
該請求方法必須是 GET
沒有別的!
該查詢字串包括所有 html-endoded data
。
劇本
#!/bin/bash
# CORS is the way to communicate, so lets response to the server first
echo "Content-type: text/html" # set the data-type we want to use
echo "" # we dont need more rules, the empty line initiate this.
# CORS are set in stone and any communication from now on will be like reading a html-document.
# Therefor we need to create any stdout in html format!
# create html scructure and send it to stdout
echo "<!DOCTYPE html>"
echo "<html><head>"
# The content will be created depending on the Request Method
if [ "$REQUEST_METHOD" = "GET" ]; then
# Note that the environment variables $REQUEST_METHOD and $QUERY_STRING can be processed by the shell directly.
# One must filter the input to avoid cross site scripting.
Var1=$(echo "$QUERY_STRING" | sed -n 's/^.*var1=\([^&]*\).*$/\1/p') # read value of "var1"
Var1_Dec=$(echo -e $(echo "$Var1" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;')) # html decode
Var2=$(echo "$QUERY_STRING" | sed -n 's/^.*var2=\([^&]*\).*$/\1/p')
Var2_Dec=$(echo -e $(echo "$Var2" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;'))
# create content for stdout
echo "<title>Bash-CGI Example 1</title>"
echo "</head><body>"
echo "<h1>Bash-CGI Example 1</h1>"
echo "<p>QUERY_STRING: ${QUERY_STRING}<br>var1=${Var1_Dec}<br>var2=${Var2_Dec}</p>" # print the values to stdout
else
echo "<title>456 Wrong Request Method</title>"
echo "</head><body>"
echo "<h1>456</h1>"
echo "<p>Requesting data went wrong.<br>The Request method has to be \"GET\" only!</p>"
fi
echo "<hr>"
echo "$SERVER_SIGNATURE" # an other environment variable
echo "</body></html>" # close html
exit 0
在 HTML 文件看起來像這樣…
<html><head>
<title>Bash-CGI Example 1</title>
</head><body>
<h1>Bash-CGI Example 1</h1>
<p>QUERY_STRING: var1=Hello%20World!&var2=This%20is%20a%20Test.&<br>var1=Hello World!<br>var2=This is a Test.</p>
<hr>
<address>Apache/2.4.10 (Debian) Server at example.com Port 80</address>
</body></html>
變數的輸出看起來像這樣……
var1=Hello%20World!&var2=This%20is%20a%20Test.&
Hello World!
This is a Test.
Apache/2.4.10 (Debian) Server at example.com Port 80
負面影響……
- 所有的編碼和解碼都不好看,但是需要
- 請求將是公共可讀的並留下托盤
- 請求的大小有限
- 需要防止跨邊指令碼(XSS)