返回文章列表

CGI Shell 指令碼實務應用與安全注意事項

本文探討使用 Shell 指令碼編寫 CGI 程式的實務方法、安全注意事項以及實際案例,包含基本結構、環境變數運用、紀錄 Web 事件指令碼例項,並著重於輸入驗證、許可權控制和安全編碼等安全性議題,提供網頁伺服器與外部程式互動的實用技巧與安全防護策略。

Web 開發 資安

CGI 介面允許開發者使用 Shell 指令碼等語言撰寫動態網頁內容,本文將探討 Shell 指令碼編寫 CGI 程式的實務方法及安全性議題。首先,正確的 HTTP 標頭輸出是 CGI Shell 指令碼的基礎,接著可運用環境變數取得客戶端請求資訊,例如使用者代理和 IP 位址。文章提供記錄使用者搜尋查詢的指令碼範例,示範如何記錄和處理使用者輸入。安全性方面,嚴格的輸入驗證至關重要,以防止惡意程式碼注入等攻擊。此外,正確的許可權控制和安全的編碼方式,例如跳脫特殊字元,也有助於降低安全風險,確保 CGI 程式安全可靠地執行。

CGI Shell Script 實務應用與安全注意事項

CGI(Common Gateway Interface)是一種讓網頁伺服器與外部程式溝通的標準介面,允許開發者使用多種程式語言(如Shell、Perl、Python等)撰寫動態網頁內容。本篇文章將探討使用Shell指令碼編寫CGI程式的實務方法、安全注意事項以及實際案例。

CGI Shell Script 的基本結構

撰寫CGI Shell指令碼時,首要任務是輸出正確的HTTP標頭,接著才是HTML內容。以下是一個基本的CGI Shell指令碼結構:

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><body>"
echo "<h1>Hello, World!</h1>"
echo "</body></html>"
exit 0

內容解密:

  1. #!/bin/bash 指定了指令碼的直譯器為Bash。
  2. echo "Content-type: text/html" 輸出了HTTP標頭,告訴瀏覽器接下來的內容是HTML格式。
  3. echo "" 輸出一個空行,表示HTTP標頭的結束。
  4. 後續的echo陳述式輸出HTML內容。
  5. exit 0 表示指令碼正常結束。

CGI 環境變數的運用

CGI指令碼可以透過環境變數取得客戶端請求的相關資訊。以下是一個顯示CGI執行環境變數的指令碼:

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><body bgcolor=\"white\"><h2>CGI Runtime Environment</h2>"
echo "<pre>"
env || printenv
echo "</pre>"
echo "</body></html>"
exit 0

內容解密:

  1. env || printenv 用於輸出CGI指令碼的環境變數。如果env命令失敗,則使用printenv作為備用方案。
  2. 透過這個指令碼,可以檢視諸如HTTP_USER_AGENTREMOTE_ADDR等重要的環境變數。

紀錄Web事件的CGI指令碼例項

以下是一個記錄使用者透過DuckDuckGo搜尋框輸入的查詢字串的CGI指令碼:

#!/bin/bash
logfile="/var/www/wicked/scripts/searchlog.txt"
if [ ! -f $logfile ] ; then
    touch $logfile
    chmod a+rw $logfile
fi
if [ -w $logfile ] ; then
    echo "$(date): $QUERY_STRING" | sed 's/q=//g;s/+/ /g' >> $logfile
fi
echo "Location: https://duckduckgo.com/html/?$QUERY_STRING"
echo ""
exit 0

內容解密:

  1. 該指令碼首先檢查日誌檔案是否存在,若不存在則建立並設定適當的許可權。
  2. 將查詢字串記錄到日誌檔案中,同時對字串進行簡單的處理(如移除q=及將+轉換為空格)。
  3. 使用Location標頭將使用者重新導向至DuckDuckGo搜尋結果頁面。

CGI Shell Script 的安全性考量

  1. 輸入驗證:務必對來自客戶端的輸入進行嚴格驗證,避免惡意輸入導致的安全問題。
  2. 許可權控制:確保CGI指令碼及其相關檔案(如日誌檔案)的許可權設定正確,避免未授權的存取。
  3. 使用安全的編碼方式:對特殊字元進行適當的編碼或跳脫處理,防止注入攻擊。

網頁管理員必備指令碼:動態生成網頁內容

在網站管理中,動態生成網頁內容是一項非常實用的技術,可以讓網站保持更新和吸引訪客。本篇文章將介紹兩個實用的指令碼,分別用於記錄搜尋查詢和動態生成網頁內容。

記錄搜尋查詢指令碼

這個指令碼的主要功能是記錄使用者在網站上的搜尋查詢,並將查詢結果重定向到DuckDuckGo搜尋引擎。指令碼的關鍵元素在於如何處理網頁伺服器和客戶端的通訊。

程式碼解析

#!/bin/bash
# log-duckduckgo-search.cgi - 記錄搜尋查詢並重定向到DuckDuckGo
echo "Content-type: text/html"
echo ""
QUERY_STRING=$(echo "$QUERY_STRING" | sed 's/+/ /g')
echo "$(date): $QUERY_STRING" >> searchlog.txt
echo "Location: https://duckduckgo.com/html?$QUERY_STRING"
echo ""
exit 0

內容解密:

  1. QUERY_STRING=$(echo "$QUERY_STRING" | sed 's/+/ /g'):將QUERY_STRING中的+號轉換回空格,以便正確記錄搜尋查詢。
  2. echo "$(date): $QUERY_STRING" >> searchlog.txt:將搜尋查詢記錄到searchlog.txt檔案中,並加上日期和時間戳記。
  3. echo "Location: https://duckduckgo.com/html?$QUERY_STRING":將使用者重定向到DuckDuckGo搜尋引擎,並傳遞搜尋查詢引數。

執行指令碼

要執行這個指令碼,需要將其放置在適當的目錄中,並設定正確的檔案許可權。可以使用curl命令來測試指令碼的功能。

$ curl "10.37.129.5/cgi-bin/log-duckduckgo-search.cgi?q=metasploit"

結果

執行指令碼後,使用者將被重定向到DuckDuckGo搜尋引擎,並顯示搜尋結果。同時,搜尋查詢將被記錄到searchlog.txt檔案中。

動態生成網頁內容指令碼

這個指令碼的主要功能是動態生成網頁內容,以顯示最新的漫畫圖片。指令碼的關鍵元素在於如何根據當前日期生成正確的圖片URL。

程式碼解析

#!/bin/bash
# kevin-and-kell - 動態生成網頁內容以顯示最新的漫畫圖片
month="$(date +%m)"
day="$(date +%d)"
year="$(date +%y)"
echo "Content-type: text/html"
echo ""
echo "<html><body bgcolor=white><center>"
echo "<table border=\"0\" cellpadding=\"2\" cellspacing=\"1\">"
echo "<tr bgcolor=\"#000099\">"
echo "<th><font color=white>Bill Holbrook's Kevin &amp; Kell</font></th></tr>"
echo "<tr><td><img "
/bin/echo -n " src=\"http://www.kevinandkell.com/20${year}/"
echo "strips/kk20${year}${month}${day}.jpg\">"
echo "</td></tr><tr><td align=\"center\">"
echo "&copy; Bill Holbrook. Please see "
echo "<a href=\"http://www.kevinandkell.com/\">kevinandkell.com</a>"
echo "for more strips, books, etc."
echo "</td></tr></table></center></body></html>"
exit 0

內容解密:

  1. month="$(date +%m)"day="$(date +%d)"year="$(date +%y)":取得當前日期的月份、日份和年份。
  2. /bin/echo -n " src=\"http://www.kevinandkell.com/20${year}/":生成圖片URL的字首部分。
  3. echo "strips/kk20${year}${month}${day}.jpg\">":生成圖片URL的完整路徑。

執行指令碼

要執行這個指令碼,需要將其放置在適當的目錄中,並設定正確的檔案許可權。然後,只需在瀏覽器中輸入正確的URL即可。

自動化網頁內容轉電子郵件與線上相簿生成

在現代的網路環境中,自動化處理網頁內容並將其轉換為電子郵件或建立線上相簿,已經成為一種常見的需求。本文將探討兩個實用的指令碼,分別用於將網頁內容轉換為電子郵件以及建立線上相簿。

將網頁內容轉換為電子郵件

實作原理

這個指令碼的核心是結合了反向工程檔名約定與網站跟蹤工具,利用 curlgrepsedcut 等命令來提取特定網頁的最新內容,並透過電子郵件傳送給指定的收件人。

程式碼解析

#!/bin/bash
# getdope--自動取得最新的 Straight Dope 專欄
now="$(date +%y%m%d)"
start="http://www.straightdope.com/"
to="[email protected]" # 請根據需要修改此處
# 首先,取得當前專欄的 URL
URL="$(curl -s "$start" | grep -A1 'teaser' | sed -n '2p' | cut -d\" -f2)"
# 現在,使用該資料生成電子郵件
( cat << EOF
Subject: The Straight Dope for $(date "+%A, %d %B, %Y")
From: Cecil Adams <[email protected]>
Content-type: text/html
To: $to
EOF
curl "$URL"
) | /usr/sbin/sendmail -t
exit 0

內容解密:

  1. curl -s "$start":靜默模式下載首頁內容。
  2. grep -A1 'teaser':查詢包含 teaser 類別的行及其後一行。
  3. sed -n '2p':輸出結果中的第二行。
  4. cut -d\" -f2:提取 URL。
  5. curl "$URL":下載最新專欄的內容。
  6. /usr/sbin/sendmail -t:透過 Sendmail 傳送電子郵件。

執行指令碼

將此指令碼設定為每天執行,即可自動取得最新的 Straight Dope 專欄並透過電子郵件傳送。

結果展示

最終,收件人將收到一封包含最新專欄內容的電子郵件,包括選單、影像和頁尾資訊。

線上相簿生成

實作原理

這個指令碼透過遍歷指定目錄中的影像檔案,生成一個簡單的線上相簿。

程式碼解析

#!/bin/bash
# album--線上相簿指令碼
echo "Content-type: text/html"
echo ""
header="header.html"
footer="footer.html"
count=0
if [ -f $header ] ; then
  cat $header
else
  echo "<html><body bgcolor='white' link='#666666' vlink='#999999'><center>"
fi
echo "<table cellpadding='3' cellspacing='5'>"
for name in $(file /var/www/html/* | grep image | cut -d: -f1)
do
  name=$(basename $name)
  if [ $count -eq 4 ] ; then
    echo "</td></tr><tr><td align='center'>"
    count=1
  else
    echo "</td><td align='center'>"
    count=$(( $count + 1 ))
  fi
  nicename="$(echo $name | sed 's/.jpg//;s/-/ /g')"
  echo "<a href='../$name' target=_new><img style='padding:2px'"
  echo "src='../$name' height='200' width='200' border='1'></a><BR>"
  echo "<span style='font-size: 80%'>$nicename</span>"
done
echo "</td></tr></table>"
if [ -f $footer ] ; then
  cat $footer
else
  echo "</center></body></html>"
fi
exit 0

內容解密:

  1. file /var/www/html/* | grep image | cut -d: -f1:列出目錄中的影像檔案。
  2. for 迴圈:遍歷每個影像檔案,生成 HTML 表格顯示縮圖。
  3. nicename 變換:將檔名中的 - 替換為空格,並移除 .jpg 字尾,使檔名更易讀。

執行指令碼

將此指令碼命名為 index.cgi,放置於包含 JPEG 影像的目錄中,並確保 Web 伺服器組態正確,即可自動生成線上相簿。

結果展示

最終,將呈現一個包含縮圖和影像名稱的表格,若存在 header.htmlfooter.html 檔案,則會自動包含在輸出中。

網頁管理自動化:利用 Shell 指令碼最佳化網站維護

在管理網站的過程中,網站管理員經常需要執行一些重複性的任務,例如檢查網站內部和外部連結的有效性。利用 Shell 指令碼,可以自動化許多這類別任務,從而提高工作效率並減少錯誤。

自動建立線上相簿

首先,讓我們考慮一個自動建立線上相簿的指令碼。這個指令碼可以將一組圖片轉換成一個簡單的線上相簿,方便使用者瀏覽。

程式碼解析

#!/bin/bash
# 建立線上相簿的指令碼
# 假設圖片存放在當前目錄下

# 建立相簿索引頁面
echo "<html><body>" > album.html
for file in *.jpg; do
  echo "<a href='$file'><img src='$file' width='100'></a>" >> album.html
done
echo "</body></html>" >> album.html

#### 內容解密:
1. `echo "<html><body>" > album.html`:建立一個名為 `album.html` 的檔案,並寫入 HTML 的基本結構。
2. `for file in *.jpg;`:迴圈遍歷當前目錄下所有的 `.jpg` 檔案。
3. `echo "<a href='$file'><img src='$file' width='100'></a>" >> album.html`:為每個圖片檔案建立一個縮圖連結,並將其新增到 `album.html` 中。
4. `echo "</body></html>" >> album.html`:完成 HTML 結構的建立。

這個指令碼的一個限制是,它需要下載完整的圖片檔案才能顯示相簿。如果圖片檔案很大,這可能會導致載入時間過長。為瞭解決這個問題,可以使用 ImageMagick 工具自動建立縮圖。

隨機顯示文字或圖片

另一個有趣的應用是利用 Shell 指令碼在網頁上隨機顯示文字或圖片。這可以透過使用 awk 程式來實作。

程式碼解析

#!/bin/bash
# randomquote--隨機顯示一行文字
awkscript="/tmp/randomquote.awk.$$"
if [ $# -ne 1 ]; then
  echo "用法:randomquote 資料檔名" >&2
  exit 1
fi

trap "$(which rm) -f $awkscript" 0
cat << "EOF" > $awkscript
BEGIN { srand() }
{ s[NR] = $0 }
END { print s[randint(NR)] }
function randint(n) { return int (n * rand() ) + 1 }
EOF

awk -f $awkscript < "$1"
exit 0

#### 內容解密:
1. `if [ $# -ne 1 ];`:檢查是否提供了正確的引數個數。
2. `trap "$(which rm) -f $awkscript" 0`:確保在指令碼結束時刪除臨時檔案。
3. `awk -f $awkscript < "$1"`:使用 `awk` 程式處理輸入檔案,並隨機輸出其中一行。

這個指令碼可以被用來在網頁上隨機顯示不同的文字或圖片,只需將輸出的結果嵌入到網頁中即可。

檢查網站內部連結的有效性

最後,讓我們討論如何使用 Shell 指令碼檢查網站內部連結的有效性。這可以透過利用 lynx 瀏覽器的遍歷功能來實作。

程式碼解析

#!/bin/bash
# checklinks--檢查網站內部連結的有效性
trap "$(which rm) -f traverse.dat traverse2.dat" 0
if [ -z "$1" ]; then
  echo "用法:checklinks URL" >&2
  exit 1
fi

lynx -traversal -accept_all_cookies -realm "$1" > /dev/null
if [ -s "traverse.errors" ]; then
  echo "錯誤數量:$(wc -l < traverse.errors)"
  sed "s|$1||g" < traverse.errors
else
  echo "未發現錯誤。"
fi

#### 內容解密:
1. `lynx -traversal -accept_all_cookies -realm "$1" > /dev/null`:使用 `lynx` 瀏覽器遍歷指定的 URL,並檢查連結的有效性。
2. `if [ -s "traverse.errors" ];`:檢查是否發現了錯誤的連結。
3. `sed "s|$1||g" < traverse.errors`:格式化錯誤輸出,去除 URL 中的冗餘資訊。

透過使用這些 Shell 指令碼,網站管理員可以更輕鬆地管理和維護網站,提高工作效率並減少錯誤。這些指令碼不僅展示了 Shell 指令碼的強大功能,也體現了自動化在網站管理中的重要性。