请求方法 GET

通过 GET 调用 CGI 脚本非常容易。
首先,你需要脚本的 encoded url

然后添加一个问号 ?,后跟变量。

  • 每个变量应该有两个由 = 分隔的部分。
    第一部分应始终是每个变量的唯一名称,
    而第二部分仅包含值
  • 变量由 分开 ****
  • 字符串的总长度不应超过 255 个字符
  • 名称和值需要进行 html 编码(替换: </,/?:@&= + $
    提示:
    使用 html-forms 时,请求方法可以由 self 生成。
    使用 **Ajax,**你可以通过 encodeURIencodeURIComponent 进行编码 ****

例:

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!&amp;var2=This%20is%20a%20Test.&amp;<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)