CGI ファイル形式とは?
.cgi 拡張子は Common Gateway Interface の略で、ウェブアプリケーションやウェブページ上の動的コンテンツを生成するための標準的な手法です。ウェブサーバー上で .cgi 拡張子が適用されると、実行プログラムとウェブサイトのコンテンツを生成するウェブサーバーとの間のインターフェースを提供します。このようなプログラムはすべて CGI または CGI スクリプトと呼ばれます。
これらのファイルは一般的に Perl、Python、または shell script などのスクリプト言語を使用して記述されますが、.cgi ファイルはコンパイルされたバイナリ(例:C言語プログラム)である場合もあります。拡張子自体は内部の言語を規定しません。スクリプトの最上部にある #!/usr/bin/perl や #!/usr/bin/python3 といったシバン(shebang)行が、どのインタプリタを呼び出すかをウェブサーバーに伝えます。
CGI スクリプトは、HTTP リクエストが届くたびにサーバー上で一度実行されます。環境変数(QUERY_STRING、REQUEST_METHOD、CONTENT_TYPE)からリクエストデータを読み取り、stdin 経由で POST ボディデータを受け取ります。その後、HTTP レスポンス(ヘッダーとそれに続くボディコンテンツ)を stdout に直接書き込みます。機能させるには、ファイルを CGI が有効なディレクトリ(伝統的には /cgi-bin/)に配置し、サーバー上で実行権限を設定する必要があります。
.cgi はインターフェースの規格であり、プログラミング言語ではありません。他のいくつかのファイル形式も .cgi 拡張子を共有することがあります。.pl、.py、.sh スクリプトは、ウェブサーバーが CGI メカニズムを介してルーティングするように、しばしば .cgi にリネームされます。CGI はリクエストごとに新しいプロセスを生成するため、大規模な環境では低速であり、現在は FastCGI、mod_php、WSGI、および現代的なアプリケーションサーバーに大きく取って代わられています。ただし、現在でもほとんどのウェブサーバーでサポートされ続けています。
セキュリティと安全性
リスク: MEDIUMテキストエディタで .cgi を読み取ることは安全です。開くだけで実行されることはありません。リスクはサーバー上での「実行」にあります。CGI スクリプトはサーバーの権限で動作し、歴史的に主要なウェブ脆弱性の温床となってきました(2014年の Shellshock バグは主に CGI シェルスクリプトを通じて悪用されました。不適切に記述された CGI はコマンドインジェクション、パス・トラバーサル、任意コード実行を可能にします)。内容を理解していないダウンロードした .cgi をデプロイしないでください。インタプリタとサーバーを最新の状態に保ち、/cgi-bin/ の権限を制限し、新規開発では FastCGI やアプリサーバーなどの代替手段を優先してください。未知の CGI ソースは、実行前にレビューすべき信頼できないコードとして扱ってください。
形式の詳細
概要- EToys / .cgi を使用するニッチなアプリデータ - ごく一部の無関係なアプリケーションが独自のデータファイルに .cgi を再利用していますが、ウェブサーバー上では .cgi はほぼ常にゲートウェイスクリプトを指します。
CGI ファイルを開くプログラム
技術的詳細
詳細仕様| MIME タイプ | application/x-httpd-cgi |
| 代替 MIME タイプ | text/plain, application/octet-stream |
| ファイルのエンコーディング | スクリプトの場合はプレーンテキスト(ASCII/UTF-8)、コンパイルされた実行ファイルの場合はネイティブバイナリ |
| ファイルシグネチャ | 固定されたマジックバイトはありません。テキストスクリプトはシバン行(#!/usr/bin/perl、#!/usr/bin/python3、#!/bin/sh など)で始まります。コンパイルされた CGI バイナリは、プラットフォームの実行ファイルヘッダー(Linux では ELF、Windows では MZ)を持ちます |
| 実行モデル | ウェブサーバーは HTTP リクエストごとに新しい OS プロセスをフォークしてスクリプトまたはバイナリを実行し、レスポンス送信後にプロセスは終了します |
| 入力メカニズム | 環境変数(QUERY_STRING、REQUEST_METHOD、CONTENT_TYPE、HTTP_* ヘッダー)を介してリクエストデータが渡されます。POST ボディは stdin 経由で渡されます |
| 出力メカニズム | スクリプトは HTTP レスポンスヘッダー(名前: 値 の行)に続いて空行を書き込み、その後にレスポンスボディを stdout に直接書き込みます |
| 必要なデプロイ設定 | ファイルは CGI が有効なディレクトリ(慣習的に /cgi-bin/)に存在し、実行ビットが設定されている必要があります。ウェブサーバーユーザーに読み取りおよび実行権限が必要です |
| 代表的なスクリプト言語 | Perl, Python, Bash/shell, Ruby, C (ネイティブバイナリにコンパイル) |
| 典型的なファイルサイズ | テキストスクリプトの場合は 1 KB - 100 KB。コンパイルされたバイナリの場合はそれ以上 |
| 圧縮 | ファイル自体に圧縮はありません。HTTP レスポンスボディは、スクリプトまたはサーバーによって別途 gzip 圧縮される場合があります |
| プラットフォームのサポート | Linux, Unix, macOS, Windows - CGI 対応のウェブサーバーが動作する任意の OS |
| 一般的なウェブサーバー | Apache HTTP Server, Nginx (FastCGI ラッパー経由), lighttpd, Microsoft IIS |
| パフォーマンス特性 | 大規模環境では低速です。リクエストごとにプロセスの生成と破棄が行われるためです。高トラフィックのデプロイメントでは FastCGI、WSGI、ASGI に取って代わられています |
| セキュリティ上の考慮事項 | スクリプトのソースはディスク上で読み取り可能です。厳格なファイル権限で保護し、指定された /cgi-bin/ パス以外の直接 URL で CGI ディレクトリを公開しないようにしてください |
| リリース日 | 1993 (NCSA HTTPd); formalized as CGI/1.1 in RFC 3875 (2004) |
| 最新バージョン | CGI/1.1 (RFC 3875, October 2004) |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | www.rfc-editor.org |
CGI の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。CGI ファイルについて最初の質問をしてみましょう。