靴屋 > コンテンツ > サル解
コンテンツ
スクリプト一式
ホームページ
サルでも解る?!あめぞう型掲示板作成

この記事について

原著は 三河版 の三河人さんによる 「サルでも解る?!あめぞう型掲示板作成」 (初版 2001.07.18 / 最終更新 2006.06.04 / 解説:三河人&その他有志一同)です。

本ページはその構成と内容を引き継ぎ、靴スミが 2026 年時点の環境に合わせて書き起こした 引き継ぎ版です。原文そのものは上のリンクから読めます。素晴らしい記事を残してくださった 三河人さんに深く感謝します。

あわせて、配布元だった ame.x0.com が消滅してスクリプトが入手できなくなっていたため、 Internet Archive から一式をサルベージしてこのページで再配布しています。

目次

■ スクリプト一式のダウンロード

sapo-script.zip

あめぞう型掲示板スクリプト一式(UTF-8版)。 中身:amezo.cgi / dai.cgi / blist.txt / header.html / ng.txt / delpass.txt / .htaccess雛形 / README.txt / CHANGES.txt

個別に見る場合は ファイル一覧 からどうぞ (ブラウザ上ではソースがそのまま表示されます)。設置の手順は README.txt、原本からの変更点は CHANGES.txt にまとめてあります。

配布元だった ame.x0.com は既に消滅していたため、 Internet Archive から回収したスクリプトを土台に、靴スミが UTF-8 で 動くよう整備したものです。回収したオリジナル(Shift_JIS・無改変)original/ に保存してあります (original/sapo-script.zip/ あめぞう(仮)が2000年に一時閉鎖する前の旧版は original/old/ に)。

再配布について

作者のサポート氏は「スクリプトを公開しているのであって配布はしていない。 ただし第三者が使用するにあたって制限は特に付けない」という立場を表明されていました。 本ページのミラーは、原本が失われた後のアーカイブ保全を目的としたもので、 スクリプト中の Copyright 表記は一切改変していません。 権利者の方からご連絡をいただければ速やかに取り下げます。

■ この版について(UTF-8化と改良)

配布しているのは、靴スミが手を入れた UTF-8版 です。 オリジナルは Shift_JIS 専用でしたが、2026年に使うには不便なので、 UTF-8 で動くようにしたうえで、いくつかの改良を加えてあります。 エックスサーバー上のサブディレクトリに設置して、一通りの動作を 確認済みです(2026-08-30 / Perl 5.16)。原本からの変更点は CHANGES.txt に全て書いてあります。 掲示板としてのロジック(スレッド生成、レス、ヘッドライン、連投抑止)には 手を入れていません。

主な内容です。

  • UTF-8化。「\」「~」「①②③」「髙﨑」など Shift_JIS で化けやすい文字が通ります。 日本語処理を jcode.pl からコアモジュールの Encode に置き換えたので、jcode.pl は不要 (新しい Perl で jcode.pl が動かない問題ごと解消)。バイト数前提だった題名の長さ判定や 投稿者名の切り詰めも、文字単位に直しています。
  • 削除機能の作り直し。下の囲みを参照してください。
  • ng.txtdelpass.txt は任意。 NGワードや削除機能を使わないなら、ファイルを置かなくてもエラーになりません。
  • URL自動リンクを https にも対応。原本は http だけでした。
  • global.mem を自動で 600 に。投稿者IPの漏洩を防ぎます。
  • 生成する HTML に charsetviewport を出すので、スマホでも読めます。

amezo.cgi で書き換えるのは Perl のパス$urlbase の2箇所だけです。同梱の header.html は 素の雛形(原本のヘッダはリンク先が全部消えているため新規に用意)、 htaccess/ には charset 指定・global.mem 等の遮断・ キャッシュ対策を入れた .htaccess の雛形が入っています。 手順は README.txt にまとめてあります。

スレッドの削除機能について

削除の合言葉は、スクリプト本体ではなく別ファイル delpass.txt(web非公開)に 置く方式にしました。amezo.cgi は GET でソースが見える作りですが、 合言葉のハッシュは別ファイルにあり .htaccess で遮断されるので漏れません。 ハッシュ方式も、時代遅れの DES をやめて SHA-512 crypt に変えてあります。

delpass.txt が空(初期状態)のあいだは、削除機能は誰も使えません。 使いたい設置者だけが合言葉を設定します(手順は README.txt)。 元の作者のパスワードは削除済みです。

■0. はじめに

時は2000年9月。三河人さんが運営する「三河版」に、こんなスレッドが立ちました。

サルでも解る掲示板作 投稿者:あめざー歴3ヶ月の私 投稿日:09月13日(水)05時01分45秒

こんばんわー三河人さん初めまして。とある方からの紹介で来ました。私はあめざー歴3ヶ月(PC歴6ヶ月)の超素人です。こんな私にもあめぞうタイプの掲示板を作れるようになるでしょうか?CGIのCも解りませんが、なんとか頑張って作りたいと思ってます。

そこから生まれたのが「サル解」でした。当時 CGI を覚えて3ヶ月だったという三河人さんが、 戸惑いながら「いっちょ、やってみますか!」と書き始めた記事が、 その後20年以上にわたって、あめぞう型掲示板を立てたい人の教科書であり続けました。

原文の前置きには、こう書かれています。

「これを見ても全然解らない」「書いてある通りにやってみたけど動かない」と言って、すぐに「解らないから教えて」と聞きに来る方は、早々に設置を諦めてもらう方が良いと思います。ある程度の気力・自分で調べようとする心構えがある方でないと、総合掲示板の設置・運営は無理です。

これは2026年でも変わりません。むしろ、レンタル掲示板やSNSがいくらでもある今、 わざわざ25年前のPerlスクリプトを自分の鯖で動かそうという人は、 その気力がある人しかいないはずです。ようこそ。

■1. 必要なもの

  1. あめぞう型スクリプト一式上のダウンロードからどうぞ
  2. Perl が動くアカウント … CGI が実行できるレンタルサーバ、あるいは自前のサーバ
  3. ファイルを上げる手段 … FTP/SFTP クライアント、または SSH

原文では jcode.pl も必要とされていましたが、この版は日本語処理に Perl 標準の Encode を使うので jcode.pl は要りません(同梱もしていません)。 転送ソフトは、原文では FFFTP が薦められていました。今なら WinSCP や FileZilla、 SSH が使えるならコマンドラインの scp / rsync でも構いません。 アップロードは必ずバイナリモード(または改行変換なし)で行ってください。 Perl スクリプトの改行が CRLF になると動かない鯖があります。

■2. サポートスクリプトの中身を知る

設置の前に、それぞれのファイルが何をしているかを掴んでおくと後がラクです。

amezo.cgi ― 本体

あめぞう型掲示板の心臓部です。これ1本で以下をこなします。

  • 新規スレッドの作成
  • スレッドへのレス投稿
  • index.html の生成(=表示は静的HTML。だから軽い)
  • リロード機能
  • 200レス以上ついたスレッドの「最新レス100表示」

投稿があるたびに板の index.html を書き出してしまうので、 閲覧側は CGI をまったく叩きません。2000年前後の貧弱な鯖で 大量アクセスをさばくための設計です。そのぶん機能は最小限で、 改造の余地は狭くなっています。

dai.cgi ― ヘッドライン

各板の index.html から、<!-- HEAD LINE --><!-- HEAD LINE END --> に挟まれた部分を最大20行だけ読んで並べる、というだけのスクリプトです。 本体側が静的HTMLにマーカーを埋めておくので、ヘッドラインの生成は ファイルの部分読みだけで済みます。

なお、これを設置しなくても掲示板自体は動きます。

blist.txt ― 板の定義

1行1板。カンマ区切りで次の3つを書きます。

[URL上の板名称],[板の背景色],[板の日本語名称]

実際にはこうなります。

main,#ddeedd,広場
geinou,#f2d8df,芸能
sapo,lightyellow,サポート削除依頼
.test,#ffffff,テスト

「URL上の板名称」はログが入るディレクトリ名そのものです。小技が2つあります。

  • 板名の先頭に .(ピリオド)を付けると、ヘッドラインに表示されなくなります。 ちょっとした隠し板が作れます(ただし blist.txt 自体が読めると結局バレます)。
  • 背景色のうしろに !画像ファイルのパス を足すと、板の背景に画像が出ます。 例:#fffff8!icho.gif

header.html ― ヘッダと index.html の雛形

掲示板の上半分(板リンク集と投稿フォーム)を作るHTMLです。 これを各板ディレクトリにコピーしたものが、そのまま最初の index.html になります。 つまり掲示板の見た目を変えたければ、まずここを触るということです。

ng.txt ― NGワード

1行1件、カンマ区切りで [NGワード],[オプション] と書きます。 オプションは 2003.12.01 以降の版で次の3通りです。

オプション意味
n投稿者欄専用。一致するとリロード扱い(=投稿がなかったことになる)
c本文欄専用。一致するとリロード扱い
(空)共通。投稿者欄・メール欄・本文欄の一致した部分だけを削って投稿

例えば ng.txt がこうだった場合、

えろえろ,
モナー,n
  • 投稿者欄が「オマエモナー」→ 投稿そのものが無効
  • 本文が「僕はえろえろ真っ裸だ」→「僕は真っ裸だ」に変換されて投稿される

※さらに古い版ではオプションが -(投稿者欄専用)の1種類だけでした。

■3. どんなサーバに置けるのか(2026年版)

原文ではバーチャルアベニューや isweb(旧freeweb)といった無料鯖が紹介されていましたが、 いずれも今は存在しません。2026年現在の要件は次のとおりです。

  • CGI(Perl)が実行できること … 今どき明示的に対応を謳っている必要があります
  • Perl 5 が入っていること … バージョンによる注意点は■8を参照
  • ファイルのパーミッションを自分で変えられること
  • .htaccess が使えること … ログの直リンク制御や文字コード指定に要ります

国内の共用レンタルサーバ(エックスサーバー、さくらのレンタルサーバ、ロリポップ!など)なら だいたい条件を満たします。VPS や自宅サーバなら言うまでもなく自由です。 靴スミが動かしている掲示板も、エックスサーバー上のサポートスクリプト系です。

Perl のパスは鯖によって違います。大半は /usr/bin/perl/usr/local/bin/perl のどちらかです。SSH が使えるなら which perl で一発で分かります。

■4. ディレクトリ構成とパーミッション

CGI の置き場所に制限がない、ふつうのレンタルサーバの場合はこうなります。 括弧内はパーミッションです。

[public_html]      (755)
    ├ .htaccess     (644)  ← htaccess/cgi-htaccess.txt
    ├ amezo.cgi     (755)
    ├ dai.cgi       (755)
    ├ blist.txt     (644)
    ├ header.html   (644)
    ├ ng.txt        (400)  ※任意(NGワードを使うなら)
    ├ delpass.txt   (400)  ※任意(削除機能を使うなら)
    ├ global.mem    (600)  ※自動生成される
    │
    ├ [main]        (755)
    │   ├ .htaccess    (644)  ← htaccess/board-htaccess.txt
    │   ├ index.html   (644)
    │   └ index2.html  (644)
    │
    ├ [main2]       (755)
    │   ...
    └ [sapo]        (755)

CGI を cgi-bin 配下に置けと言われる鯖なら、 amezo.cgi 以下の一式をまるごと cgi-bin の中に入れ、 板のディレクトリもその下に作ります。板だけを別の場所に置きたい場合は ■5header.html の変更が必要です。

■5. スクリプトの変更と下準備

スクリプト本体でいじるのは 2箇所だけです。あとは板まわりの設定になります。 エディタは、文字コードを UTF-8(BOMなし)のまま、改行を LF のまま保存できるもの (サクラエディタ、秀丸、VS Code など)を使ってください。 手順は同梱の README.txt にも同じものが書いてあります。

(1) amezo.cgi の1行目 ― Perl のパス

#!/usr/bin/perl

設置先の鯖に合わせて書き換えます。/usr/local/bin/perl のこともあります。

(2) amezo.cgi の14行目 ― 掲示板のURL

$urlbase = 'http://ame.x0.com/';

ここを自分の掲示板のURLに変えます。掲示板が https://example.jp/bbs/ なら、

$urlbase = 'https://example.jp/bbs/';

末尾のスラッシュを忘れないでください。ついでに、その下にある $amezo(掲示板の名前)と $admin(管理人名)も好きに変えて構いません。

(3) blist.txt に板を書く

同梱の blist.txt は3板ぶんの雛形です。書式は■2のとおりで、 ここに書いた板名が、そのまま作るディレクトリの名前になります。

(4) header.html を板の構成に合わせる

先頭の板リンクを blist.txt の内容に合わせて書き換えます。 同梱の header.html は素の雛形なので、掲示板の見た目もここで作り込んでください。

板とCGIの位置関係が標準(板の親ディレクトリに amezo.cgi がある)でない場合は、 24行目の投稿フォームの action も、板ディレクトリから見た相対パスに直します。

<form method=post action="../amezo.cgi">

(5) index.html と index2.html を作る

header.html をコピーして、各板ディレクトリの中に index.htmlindex2.html という名前で置きます。中身は変えなくて結構です。

(6) ng.txt と delpass.txt は必要なら

この版では、どちらも置かなくて構いません。 NGワードを使うなら ng.txt を、スレッドの削除機能を使うなら delpass.txt に合言葉のハッシュを入れて置きます (ハッシュの作り方は README.txt に書いてあります)。

■6. 設置する

  1. ■4 のとおりにディレクトリを作る。まずは main ひとつで構いません。
  2. amezo.cgi / dai.cgi / blist.txt / header.html をアップロードする。NGワードや削除機能を使うなら ng.txt / delpass.txt も。
  3. 板のディレクトリの中に index.htmlindex2.html を置く。
  4. htaccess/ の雛形を .htaccess という名前で置く。 cgi-htaccess.txt は CGI と同じディレクトリに、 board-htaccess.txt は各板ディレクトリに。
  5. パーミッションを設定する。ここを忘れると必ず動きません。

SSH が使えるなら、まとめてこれだけです。

chmod 755 amezo.cgi dai.cgi
chmod 644 blist.txt header.html .htaccess
chmod 400 ng.txt delpass.txt          # 置いた場合だけ
chmod 755 main
chmod 644 main/index.html main/index2.html main/.htaccess

■7. そろそろ動くよ?

掲示板のURLにブラウザでアクセスします。https://example.jp/bbs/ に置いたなら、

https://example.jp/bbs/main/

板の一覧と投稿フォームが出てきましたか? 出てこない場合は index.html が置けていないか、URLが違います。

画面が出たら、いちばん下にある「リロード」ボタンだけをポチッと押してください。 背景色が blist.txt で指定した色に変わり、板のタイトルが日本語名に書き換われば成功です。 あとはお好きなだけスレッドを立てて堪能してください。一国の主です。

うまくいかないときの見どころ:

症状だいたいの原因
Internal Server Error (500)1行目のPerlパスが違う/改行がCRLFになっている/amezo.cgiのパーミッションが755でない
画面は出るがリロードで何も変わらない板ディレクトリが755でない/index.htmlが644でない(=CGIが書き込めない)
リンク先が全部404$urlbase の書き間違い。末尾のスラッシュ忘れが多い
投稿すると文字化けするファイルを UTF-8(BOMなし)以外で保存した/転送ソフトが文字コードを変換した。バイナリモードで上げ直す
投稿すると「不正なリクエストです」$urlbase と実際にアクセスしているURLが食い違っている(http と https、ドメイン違いなど)
投稿しても画面が変わらないブラウザのキャッシュ。板ディレクトリに board-htaccess.txt.htaccess として置く

それでは、良い『あめぞうライフ』を!

■8. 2026年に動かすための追記

ここからは原文にはない、靴スミからの補足です。25年前のスクリプトを今の環境に載せると、 いくつか引っかかる点があります。

(a) jcode.pl が新しい Perl で動かない

原本に同梱の jcode.pl は 2.10(1999年)で、641行目と648行目に defined %hash という書き方が残っています。これは Perl 5.16 で非推奨、 Perl 5.22 以降では文法エラーになります。エラーが出たら defined を外すだけで直ります。 (UTF-8版では jcode.pl 自体を使わないので、この問題は起きません)

641:  &init_z2h_euc  unless defined %z2h_euc;   →  unless %z2h_euc;
648:  &init_z2h_sjis unless defined %z2h_sjis;  →  unless %z2h_sjis;

なお amezo.cgidai.cgi 自体は、現代の Perl でも perl -c が素通りします。

(b) global.mem から投稿者のIPが漏れる

この版amezo.cgi が自動で global.mem を 600 にし、 同梱の .htaccess でも遮断しているので対処済みです。以下は仕組みの説明と、原本を使う場合の話です。

原文の 2004.12.28 の追記にもあるとおり、global.mem が web から読める状態だと、 直前にスレッドを立てた人のIPアドレスが誰でも見られます。対処はどちらかです。

  • スレッドを1本立てたあと、手動で global.mem を 600 にする(1回でOK)
  • amezo.cgi の末尾、close(Z); の直後に1行足す(こちらが確実)
    for (keys %iplist){
        print Z "$_ $iplist{$_}\n";
    }
    close(Z);
    chmod 0600,"global.mem";     ←この1行を追加
}

加えて、.htaccess でも塞いでおくと安心です。

<Files "global.mem">
    Require all denied
</Files>
<Files "ng.txt">
    Require all denied
</Files>

(c) HTTPS 化する

今どき http のままだと、ブラウザに警告を出されるうえ投稿内容が平文で流れます。 サーバ側で常時SSLを有効にし、$urlbasehttps:// で書いてください。 既にログを溜めてしまった後なら、生成済みの index.html 内のURLを sed などで一括置換する必要があります。

(d) 文字コードをどうするか

原本(original/ の Shift_JIS 版)は、jcode.pl で入力を Shift_JIS に寄せてから HTML を書き出します。そちらをそのまま動かすなら、生成されるHTMLに <meta charset="Shift_JIS"> 相当が入っているか (=header.html にあるか)を確認してください。 入っていないと、charset を推測しないモダンなブラウザで文字化けします。

このページで配布しているのは UTF-8版 で、そのあたりの面倒はありません。 これから立てるなら、そちらをどうぞ。すでに Shift_JIS で運用している板を移行する場合は、 スクリプトの差し替えに加えて既存ログの一括変換が要ります。 靴スミの掲示板も実際にこれをやりました。

(e) スパム対策

公開したまま放置すると、まず間違いなく自動投稿にやられます。 スクリプトが持っているのは「同一IPから180秒以内の連続スレ立て禁止」と 「板ごとに5秒の連投抑止」と ng.txt だけで、 これは2026年のボットには何の効果もありません

  • ng.txt にURLパターンなどを仕込む(最低限)
  • 投稿フォームに CAPTCHA を挟む(靴スミの掲示板では Cloudflare Turnstile を使っています)
  • Cloudflare などのWAF/レート制限を前段に置く

(f) セキュリティ全般

あめぞう型掲示板の XSS といえば「あめぞうウィルス」です。メール欄に <script> タグを仕込んだ投稿が置かれ、その板を開いた閲覧者のブラウザで スクリプトが走って、閲覧者自身の投稿によってさらに増殖していきました。

サポートスクリプトは 2000年の版から入力の & " < > を エスケープしていて、この穴自体は塞がっています。この版では さらに ' も足して属性の中でも抜け出せないようにし、 URL自動リンクは https?: 限定で rel="noopener noreferrer nofollow" を付与、 folder パラメータのパストラバーサルも禁止しました (詳細は CHANGES.txt [13])。

CSRF も、既存の referer チェックに加えて Origin ヘッダ検証を足し、 他サイトのフォームからの投稿を弾くようにしました (Origin を送らないブラウザでは従来どおり referer に委ねます)。

とはいえ元が 1999〜2003年のスクリプトである以上、過信は禁物です。 公開運用するなら中身を読み、(e) のスパム対策とあわせて、 自分で手を入れられる人が使ってください。

■9. 付録:回収の経緯と amezo.cgi の版ごとの変遷

スクリプトはどうやって回収したか

amezo.cgi は冒頭で REQUEST_METHODGET のとき自分自身を text/plain で吐き出す作りになっており、dai.cgiQUERY_STRING が空でなければ同様にソースを出力します。 おかげで Internet Archive のクローラが、実行結果ではなくソースそのものを 保存していました。ただし dai.cgi のソースは ?get 付きの 2005-02-06 のたった1件しか残っていませんでした。 なお ng.txt は本家がパーミッション 400 で非公開だったため回収できず、 配布物では空にしてあります(この版では無くても動きます)。

amezo.cgi の版ごとの変遷

Wayback に残っていた各版を並べて差分を取ったものです。 自分で改造するときの参考にどうぞ。

主な変更
2000-05-10
Copyright 1999-2000
旧サポートスクリプト。NGワードは ng.txt ではなく、特定の人名がスクリプトに直接書き込まれていた
2001-04-05
Copyright 1999-2001
配布元が www17.big.or.jp/~amezo_/ から ame.x0.com へ移転。ng.txt 方式を導入。削除用パスワードの crypt が MD5 crypt に
2002-10-01 NGオプションが - の1種類から nc の2種類に拡張。題名の長さチェック。日付表示が4桁年に。同一IPから180秒の連続スレ立て抑止(&check)を追加
2004-06-09
Copyright 1999-2003
投稿者名を60文字に制限。多重引用符の圧縮。板ごとの lasttime.txt による5秒の連投抑止を追加
2007-11-11 制御文字の除去。題名から空白・全角空白・_ を除去。NG判定をURLデコード後の本文に対して行うよう修正。これが最終版

謝辞とライセンス

原著者の三河人さんと、当時この記事を作り上げた有志のみなさんに感謝します。 20年以上ネットに置き続けてくださったおかげで、この文章も書けました。

スクリプトの作者はサポート氏(@あめぞう(仮)管理人)です。 使用にあたっての制限は特に設けられていませんが、 「Copyright を改変しないこと」だけは礼儀として守ってください。

<!--
     Script for amezo-like BBS
     Copyright (C) 1999-2003 amezo_
     http://www17.big.or.jp/~amezo_/
     http://ame.x0.com/
-->

独自に改造した場合も、この部分は上書きせず、追記する形にしてください。

このページに関するご意見・ご指摘は 速報@靴屋 までどうぞ。
スクリプト一式は Internet Archive Wayback Machine より 2026-08-30 に回収しました。

Copyright © 2001-2026 Shoemaker Smith