INTERNET Watch Title Click

【特集】

ホームページのCGIと2000年問題

 西暦を下2桁で扱った時、「99」年から「00」年に変わった瞬間に、コンピュータが異常動作をするのではないかと言われる2000年問題。この問題はもちろんホームページに設置した掲示板やカウンターなどのCGIでも起こる可能性がある。そこで、この特集では、ホームページのCGIと2000年問題、そしてその対応方法について解説する。また、フリーソフトやシェアウェアなどの形態で配布されているCGIの2000年対応状況も紹介しよう。

 なお、今回は「Perl」で書かれたものに限定して解説する。他の言語ではそれぞれ状況は異なるが、今回解説するポイントを参考にしてほしい。

●正しい2000年問題対応

 Perlを使用してプログラムを作成するとき、時刻を求めるために、

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon = $mon+1;

と組むことが多い。このプログラムを実行すると「$year」には、1999年ならば「99」が代入される。そのため、下2桁を扱っていると思って作られているプログラムも見受けられる。

 しかし、実際には$yearには1900年からカウントした年数が代入されるので、2000年には「00年」ではなく「100年」となる。

 よって、正しく2000年に対応するには、単に1900年を足せば正しい4桁の値となる。

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon = $mon+1;
$year= $year+1900;

 ただし、現在利用しているCGIで考えもせずに、上記の2000年問題対応を行なうと、対応以前のデータと以後のデータが混在しトラブルになることもある。プログラム全体とデータについてよく考えて対応をするか、すべてのデータを一度リセットしよう。

●どのようなことが起こりうるか

 では、2000年に対応していないCGIを利用したとき、どのようなことが起こりうるかを紹介する。

(1)すでに問題が起きているクッキーの有効期限

 掲示板の名前欄の記憶などでクッキーを使用している場合、1ヶ月~2ヶ月のクッキー有効期限を設定していることがある。この場合には、1999年11月や12月に入った頃から問題が発生しているのだ。クッキー有効期限の設定では、過去には年数2桁を使っていたが、現状では年数4桁を使用するようにされている。ここに2000年に対応しないCGIプログラムから「100年」という年数を設定した場合の動作は保証されない。詳しくは、Netscape社の「PERSISTENT CLIENT STATE HTTP COOKIES」を参照してほしい。

Netscape、PERSISTENT CLIENT STATE HTTP COOKIES
http://www.netscape.com/newsref/std/cookie_spec.html

(2)一番多くあるのは年数表示

 掲示板CGIなどで、書き込み時間として「99年」などそのまま年数を使用している場合には、2000年になった時には「100年」の書き込みとして表示されてしまう。とはいえ、表示が「100年」と表示されるだけでも2000年問題だが、年数の表示だけなら大きな問題はないだろう。自動巡回プログラムなどで表示された年号を処理している場合には注意が必要だ。

(3)データベースなどでの問題

 掲示板CGIの多くは追加型書き込みを行なっているので、書き込み年数が「100年」となっても、そのまま新しい書き込みとして表示するようだ。しかし、「書き込み順」や「新しい順」に並べる機能があるものでは、データ管理に問題が発生することがある。

 「年月日時分秒」順の1つのデータとして書き込み時間を表現した場合、1999年12月31日12時34分56秒に書き込んだものは「991231123456」となる。そして2000年01月02日03時04分05秒に書き込んだものは「1000102030405」となる。これを単に数値として比較して並べた場合は、2000年に書き込んだもののほうが大きいので問題にならない。

991231123456 1999年12月31日12時34分56秒
991231235959 1999年12月31日23時59分59秒
1000101000000 2000年01月01日00時00分00秒
1000102030405 2000年01月02日03時04分05秒

 しかし、文字列として頭から比較したり、ファイル名に使いディレクトリのファイル一覧として使用した場合(UNIXコマンドのlsも同じ)は「1」が頭にある2000年に書き込んだものが先になるので、問題となってしまう。

1000101000000 2000年01月01日00時00分00秒
1000102030405 2000年01月02日03時04分05秒
991231123456 1999年12月31日12時34分56秒
991231235959 1999年12月31日23時59分59秒

(4)間違った2000年問題対応

 もう1つ「2000年問題に対応したつもり」という場合がある。1999年が「99」となっているので、それを年数下2桁だと誤解したまま2000年問題対応したときだ。

 「70」以降の数字なら頭に「19」を付け1900年代、「70」以前数字なら頭に「20」を付け2000年代、という対応をした場合、2000年では「100」となるので、「19100」となってしまう。これは、4桁表示のためにただ頭に「19」を付けたときも同様となる。

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon = $mon+1;
if ($year < 70) { $year = "20$year"; } else { $year = "19$year"; }
19991231123456 1999年12月31日12時34分56秒
19991231235959 1999年12月31日23時59分59秒
191000101000000 2000年01月01日00時00分00秒
191000102030405 2000年01月02日03時04分05秒

●フリーソフトやシェアウェアなどで配布されているCGIの2000年対応状況

 CGIをプログラミングできない人にとっては、自分が使用しているCGIが2000年になっても正常に動作するのか気になるものだろう。そこで、フリーソフトやシェアウェアなどの形態で配布されているCGIの2000年対応状況を紹介しよう。なお、コンピュータ、OS、Perlや外部プログラム、ネットワークなどが2000年対応していない場合は、これとは別の問題がおこりうるので、それについては別に確認しておこう。

 この中には、時刻を取得しているが年数を使用していないので問題が発生しないというものもある。こうしたプログラムで、年数も表示させるなどの改造を行なう場合には、自分で2000年対応しておこう。

【1】掲示板

ネットサーフレスキュー[Web裏技]
http://www.rescue.ne.jp/cgi-rescue/cgi?minibbs1
http://www.rescue.ne.jp/cgi-rescue/cgi?minibbs2
簡易BBS(minibbs1)は現在、最新版のv10.31および普及版のv9.07とv8.93がある。ネットサーフレスキューのアナウンスによると、v7.93以前、v8.8以前、v8.92以前、v9.06以前のバージョンに問題があり、それより新しいものおよび最新版のv10.31では対応している。また、簡易BBSの別バージョンである簡易BBS2(minibbs2)には、現在v2.02、v1.15i、v1.15jsがある。ネットサーフレスキューのアナウンスによると、v2.00以前、v1.14i以前、v1.14js以前のバージョンに問題があり、それより新しいものでは対応している。

カスタム掲示板 - TryTheHomePage
http://www2.inforyoma.or.jp/~terra/cgi/custom/index.htm
カスタム掲示板は、現在v98.1が公開されている。このバージョンは年数の取得後に1900を足しているので、2000年になっても問題ない。

KENT WEB
http://www.kent-web.com/bbs/
(旧
http://www.lemon.ne.jp/~kent/
ASKA BBS v1.2、Fantsy Board v1.13、COM BOARD v4.0、LIGHT BOARD v5.52、G-LIGHT v4.51、プチ☆ボード v4.31、YY-BOARD v2.74、SUN BOARD v2.3、SPHINX BOARD v2.41、Web Forum v2.2とシェアウェアのMBS Pro v4.3の11種類の掲示板が公開されている。いずれも年数の取得後に1900を足しているので、2000年になっても問題ない。

Matt's Script Archive
http://www.worldwidemart.com/scripts/
現在、GUESTBOOK v2.3.1 、WWWBOARD v2.0 ALPHA 2が公開されている。GUESTBOOKはunixの「dateコマンド」によって年数を4桁で取得しているので実際に動作させても問題はない。WWWBOARDはPerl言語によって時刻を取得しているが、2000年対応していないため、2000年の書き込みの表示が「100年」となる。ただし、書き込み時系列には影響はない。


【2】カウンター

ネットサーフレスキュー[Web裏技]
http://www.rescue.ne.jp/cgi-rescue/cgi?imgcke
15種類のカウンターが用意されている。ネットサーフレスキューの2000年対応アナウンスでは、再訪問チェック付き画像合成型アクセスカウンタ(imgcke)のみが掲載されているが、その他のカウンターはほとんどが年数を使用していないので問題はない。また、クッキーを利用するものなど年数を使用するものについては、年数の取得後に1900を足しているので、問題は発生しない。

Matt's Script Archive
http://www.worldwidemart.com/scripts/
「COUNTER」はv1.1.1、「TEXTCOUNTER」はv1.2.1が公開されている。「COUNTER」はv1.1.1は使用上問題がないが2000年にアクセスされたログが「100年」として記録される。「TEXTCOUNTER」では年数の取得後、頭に「19」を付けているため、2000年になると「19100年」となってしまう。


【3】Webチャット

ゆいちゃっと
http://www.cup.com/yui/
ゆいちゃっとは、Pro1.0、Secure、Cute、NT、AT、Lite、Multiはpref.cgiで、Mini、Magicなどは単独で時刻の取得をしているが、どれも年数を利用していないので、2000年になっても問題は発生しない。また、ゆいちゃっとのアナウンスによるとクッキーの有効期限の取得に関して2000年になっても問題が起きないように対応したという。

ネットサーフレスキュー[Web裏技]
http://www.rescue.ne.jp/
ウェブチャットv1.22(WebCHAT)、ウェブチャット・ライトv1.02(WebCHAT Light)、簡易CHAT v5.2(MiniCHAT)、インターチャット(InterCHAT)、2ショットチャット(2shot)v4.0、v3.3が公開されている。ネットサーフレスキューの2000年対応アナウンスでは、ウェブチャット(WebCHAT)v12.2以後、ウェブチャット・ライト(WebCHAT Light)は、v1.02以降が2000年に対応していると掲載されている。その他のWebチャットについては、インターチャット(InterCHAT)のクッキー有効期限に問題が出るが、ほかは問題がない。

カスタムチャット
http://www2.inforyoma.or.jp/~terra/cgi/custom/customchat.htm
カスタム掲示板は、現在v98.7が公開されている。このバージョンでは、年数の取得をしているが内部で利用していないので、問題は発生しない。

KENT WEB
http://www.kent-web.com/
http://www.kent-web.com/chat/
Windy v1.0、COMCHAT-EX v3.54、PONNY CHAT v3.0、YY-CHAT v1.7、Midnight Fox v1.31の5種類のチャットが公開されている。いずれも年数の取得後、年数を使用しないか、または1900を足しているので、2000年になっても問題ない。


【4】サイト内検索

Matt's Script Archive
http://www.worldwidemart.com/scripts/
Simple Search v1.0が公開されている。時刻の取得をしていないので、問題は発生しない。

ネットサーフレスキュー[Web裏技]
http://www.rescue.ne.jp/cgi-rescue/cgi?jsearch
「Matt's Script Archive」の検索CGI「Simple Search v1.0」を日本語対応したもの。元のバージョン同様、問題は発生しない。

Simple Search for Japanese
http://www.hartc.com/search/searchinst.html
「Matt's Script Archive」の検索CGI「Simple Search v1.0」を日本語対応したもの。元のバージョン同様、問題は発生しない。

wwwsrch.cgi
http://wakusei.cplaza.ne.jp/twn/wwwsrch.htm
現在、v3.05が公開されている。検索ログに年数を書き込むが、年数の取得後に1900を足しているので、2000年になっても問題は発生しない。

KISS-Search
http://www2.osk.3web.ne.jp/~nkon/
現在β3が公開されている。年数の取得後に1900を足しているので、2000年になっても問題は発生しない。


【5】アンケート

ネットサーフレスキュー[Web裏技]
http://www.rescue.ne.jp/
http://www.rescue.ne.jp/cgi-rescue/cgi?weban(WebAN)
http://www.rescue.ne.jp/cgi-rescue/cgi?webvote(WebVOTE)
現在、「アンケートを採る(WebAN)」v3.2と、「投票フォーム(WebVOTE)」v3.4が公開されている。どちらも2000年に対応しておらず、集計結果の表示で、2000年には「100年」という表示となる。

CJ Club
http://www2u.biglobe.ne.jp/~ryu_1/cj_c/
http://www2u.biglobe.ne.jp/~ryu_1/cj_c/cgi_s/p_vote.htm(PluralVote)
http://www2u.biglobe.ne.jp/~ryu_1/cj_c/cgi_s/mvote.htm(MultiVote)
現在、フリーソフトのPluralVote v3.2と、多項目の質問ができるシェアウェア版のMultiVote v1.5がある。どちらも、年数の取得後に1900を足しているので、2000年になっても問題は発生しない。

Tacky's Room
http://www.eva.hi-ho.ne.jp/takeuchi/
http://www.eva.hi-ho.ne.jp/takeuchi/cgi_tackyvote.htm(Tackyvote)
現在、Tackyvote v0.99がダウンロードできる。年数の取得後に1900を足しているので、2000年になっても問題は発生しない。

MyTools.NET
http://www.mytools.net/
http://www.mytools.net/cgitools/vote7.html(T-Vote 7)
現在、最新版としてはT-Vote v7.01がダウンロードできる。年数の取得後、1900を足しているので2000年になっても問題は発生しない。

WEBアンケート
http://www2q.biglobe.ne.jp/~terra/cgi/voting.htm
現在、voting v1.1が公開されている。時刻の取得をしていないので、問題は発生しない。


【6】フォームメール

ネットサーフレスキュー[Web裏技]
http://www.rescue.ne.jp/
http://www.rescue.ne.jp/cgi-rescue/cgi?form2mail(フォームメール)
フォームメール v1.12が公開されている。年数は取得しているが、使用していない。

North Net Initiative
http://www2.snowman.ne.jp/~nnet/
「フリーCGIダウンロード」コーナーで「全てのフォームに対応したデコードCGI(deco.cgi v3.0)」がダウンロードできる。時刻の取得をしていないので、問題は発生しない。

Matt's Script Archive
http://www.worldwidemart.com/scripts/
現在、FormMail v1.6が 公開されている。フォームなどに時刻を表示するが、年数の取得後に1900を足しているので、2000年になっても問題は発生しない。


【7】日記帳

ネットサーフレスキュー[Web裏技]
http://www.rescue.ne.jp/cgi-rescue/cgi?webdiary
万年カレンダー式の電子掲示板「電子日記帳(WebDIARY)v1.04」がダウンロードできる。年数の取得後、1900を足して2000年対応していること以外にも、2000年以降の成人の日(1月第2月曜日)、体育の日(10月第2月曜日)の計算にも対応している。

123CGI
http://www.c-5.ne.jp/~hamachan/cgihtm/relay.htm
参加者がリレー小説や日記を書くための「relay.cgi v1.0r3」を公開している。年数の取得後に1900を足しているので、2000年になっても問題は発生しない。

EASY CGI
http://www.net-easy.com/bbs/ezjoho.html
現在、パスワード付きの掲示板「EASY 情報掲示板 v1.1」をダウンロードできる。年数を意図的に2桁で使用しているため、2000年には「00年」と表示し、情報は追加型のため順番がずれることはない。

Try The HomePage
http://www2q.biglobe.ne.jp/~terra/cgi/diary.htm
Web日記帳(WebDiary)v1.1、カレンダー付き予定表(diarybbs)v1.1 などがダウンロードできる。いずれも内部では年数をそのまま利用しているが、表示するときに、「19」を頭につけるので、2000年には「19100年」と表示されてしまう。

Perl Script Laboratory
http://www.jah.ne.jp/~akira67/perl/pscripta.shtml
現在、カレンダー式日記システム「Auto Diary v0.31」が公開されている。年数の取得後に1900を足しているので、2000年になっても問題は発生しない。

(1999/12/20)

[Reported by ymasa@wizvax.net]


INTERNET Watchホームページ


ウォッチ編集部INTERNET Watch担当internet-watch-info@impress.co.jp