CGI 如何操作

目錄

簡介

CGI (通用閘道介面) 定義了 Web 伺服器與外部內容產生程式互動的方式,這些程式通常稱為 CGI 程式或 CGI 腳本。

在 Tomcat 中,當您使用 Tomcat 作為 HTTP 伺服器且需要 CGI 支援時,可以新增 CGI 支援。這通常是在開發期間進行,當您不想執行 Apache httpd 等 Web 伺服器時。Tomcat 的 CGI 支援與 Apache httpd 的支援大致相容,但有一些限制 (例如,只有一個 cgi-bin 目錄)。

CGI 支援是使用 servlet 類別 org.apache.catalina.servlets.CGIServlet 實作的。傳統上,此 servlet 會對應到 URL 模式「/cgi-bin/*」。

預設情況下,CGI 支援在 Tomcat 中會停用。

安裝

注意 - CGI 腳本用於執行 Tomcat JVM 外部的程式。如果您使用 Java SecurityManager,這將繞過 catalina.policy 中的安全原則組態。

若要啟用 CGI 支援

  1. 在預設的 $CATALINA_BASE/conf/web.xml 檔案中,有 CGI servlet 的註解範例 servlet 和 servlet 對應元素。若要在您的 Web 應用程式中啟用 CGI 支援,請將該 servlet 和 servlet 對應宣告複製到 Web 應用程式的 WEB-INF/web.xml 檔案中。

    取消 $CATALINA_BASE/conf/web.xml 檔案中 servlet 和 servlet 對應的註解,即可同時為所有已安裝的 Web 應用程式啟用 CGI。

  2. 為您的 Web 應用程式中的 Context 元素設定 privileged="true"

    只有標記為特權的 Context 才允許使用 CGI servlet。請注意,修改全域 $CATALINA_BASE/conf/context.xml 檔案會影響所有 Web 應用程式。有關詳細資訊,請參閱 Context 文件

組態

有幾個 servlet 初始化參數可用於設定 CGI servlet 的行為。

  • cgiMethods - HTTP 方法的逗號分隔清單。使用其中一種方法的請求將傳遞給 CGI 腳本,以便腳本產生回應。預設值為 GET,POST。如果要讓腳本處理所有請求,無論其方法為何,請使用 *。除非被此參數的設定覆寫,否則使用 HEAD、OPTIONS 或 TRACE 的請求將由超類別處理。
  • cgiPathPrefix - CGI 搜尋路徑將從 Web 應用程式根目錄 + File.separator + 此字首開始。預設值為空值,這會導致使用 Web 應用程式根目錄作為搜尋路徑。建議值為 WEB-INF/cgi
  • cmdLineArgumentsDecoded - 如果啟用命令列引數(透過 enableCmdLineArguments),而且 Tomcat 在 Windows 上執行,則每個個別的已解碼命令列引數都必須符合此模式,否則請求將會被拒絕。這是為了防範已知的從 Java 傳遞命令列引數到 Windows 的問題。這些問題可能導致遠端程式碼執行。有關這些問題的更多資訊,請參閱 Markus Wulftange 的部落格Daniel Colascione 的這篇已封存的部落格
  • cmdLineArgumentsEncoded - 如果啟用命令列引數(透過 enableCmdLineArguments),則每個個別的已編碼命令列引數都必須符合此模式,否則請求將會被拒絕。預設值與 RFC3875 定義的允許值相符,為 [\w\Q%;/?:@&,$-.!~*'()\E]+
  • enableCmdLineArguments - 是否根據 3875 RFC 的第 4.4 節從查詢字串產生命令列引數?預設值為 false
  • environment-variable- - 要為 CGI 腳本的執行環境設定的環境。變數的名稱取自參數名稱。若要設定名為 FOO 的環境變數,請設定名為 environment-variable-FOO 的參數。參數值用作環境變數值。預設值為沒有環境變數。
  • executable - 用於執行腳本的可執行檔名稱。如果您的腳本本身可執行(例如 exe 檔案),您可以明確地將此參數設定為空字串。預設值為 perl
  • executable-arg-1executable-arg-2,依此類推 - 可執行檔的其他引數。這些引數會出現在 CGI 腳本名稱之前。預設值沒有其他引數。
  • envHttpHeaders - 用於選取傳遞給 CGI 程序作為環境變數的 HTTP 標頭的正規表示法。請注意,標頭在比對之前會轉換成大寫,而且整個標頭名稱必須與模式相符。預設值為 ACCEPT[-0-9A-Z]*|CACHE-CONTROL|COOKIE|HOST|IF-[-0-9A-Z]*|REFERER|USER-AGENT
  • parameterEncoding - 要與 CGI servlet 一起使用的參數編碼名稱。預設值為 System.getProperty("file.encoding","UTF-8")。也就是系統預設編碼,如果沒有此系統屬性,則為 UTF-8。
  • passShellEnvironment - 是否將 Tomcat 程序的 shell 環境變數(如果有)傳遞給 CGI 腳本?預設為 false
  • stderrTimeout - 在終止 CGI 程序前等待 stderr 讀取完成的時間(以毫秒為單位)。預設為 2000

執行的 CGI 腳本取決於 CGI Servlet 的組態,以及如何將要求對應到 CGI Servlet。CGI 搜尋路徑從 Web 應用程式根目錄 + File.separator + cgiPathPrefix 開始。然後搜尋 pathInfo,除非它為 null,這種情況下會搜尋 servletPath

搜尋從第一個路徑區段開始,一次擴充一個路徑區段,直到沒有路徑區段(導致 404)或找到腳本。任何剩餘的路徑區段都會在 PATH_INFO 環境變數中傳遞給腳本。