CGI プログラムからの出力結果を見ると、書いている HTML がきわめて怪しいものばかり目につきます。
率直に言って、HTML 仕様書を読んだとは思えないものばかりです。
プログラムを組むときには、まず仕様を確かめましょう。参考書をそのまま丸写ししておいて、本にはこう書いてあったと主張する人は少なくありませんが、そもそも信用の置ける本などというものはたいへん珍しいのです。
HTML の仕様書には、いくつかの版があり、最新でもっとも広範な要素を含むのは、HTML 4.0 Transitional です。フレームを使いたいなら、HTML 4.0 Frameset を使わないといけません。
自分の使っている HTML がどれだかわからなかったら、まず仕様書を見てください。市販の参考書を仕様書と比べて見ると、多くの参考書なるものがどれほどいい加減に書かれているか、よくわかることでしょう。
固定された DTD を使う HTML にとって、文書型宣言こそは基本中の基本です。SGML の応用というよりは骨抜きである HTML では、DTD を各文書に書き込む代わりに、既定の DTD を指定することによって、使用する要素を確保しているのです。その文書型宣言がないのでは、どの要素が使えるのかわからなくなります。
ところが現状では、文書型宣言を書いている HTML の方が珍しいという有様、よくこんなことで通用してきたものです。
まずは、自分がどの HTML を使っているかを把握しましょう。そして、選んだ DTD を宣言しておきます。仕様書を読めばすぐわかりますが、文書型宣言は本来、省略できないものなのです。
多くの場合は、HTML 4.0 Transitional でカバーできることでしょう。これを使うなら、文書型宣言は
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
と書きます。これを Perl で書くならば
print "<!DOCTYPE HTML PUBLIC ¥"-//W3C//DTD HTML 4.0 Transitional//EN¥">¥n";
ですね。
HTML 4.0 Transitional に見当たらない要素があるとすれば、それは特定の User Agent だけが対応している独自拡張ですから、そんなものは閉鎖環境でだけ使うようにしてください。特定の環境でないと使えない要素など、あらゆる環境を乗り越える工夫を続けているインターネットには、全くふさわしくありません。
HTML の解説記事にも酷いものがあり、HTML 要素の開始タグである <HTML> を「HTML 文書の宣言」と書いているものがあります。
どこから得た情報か知りませんが、全くのでたらめで、SGML 宣言文は <! で始めなければなりません。宣言どころか、HTML 要素の開始/終了タグは、省略して構わないのです。
HTML においてどうしても省略できないものは、文書型宣言と TITLE 要素のみです。それ故、最小の HTML 文書はこの2つで成立します。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <TITLE>HTML 文書</TITLE>
という具合です。また、HTML 要素・HEAD 要素・BODY 要素の開始/終了タグは省略できるので、
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <TITLE>ご挨拶</TITLE> <P> はじめまして。 </P>
と書いてもいいわけです。これで Web 書見機の表示がおかしくなるなら、表示させている Web 書見機が異常なのです。
なお、私自身は、そのような例を知りません。
ごく限られた例では、META 要素で no-cache や charset などを指定しています。それなりに努力して考えたのでしょうね。
しかし、META の http-equiv 属性は本来、サーバに与えるべき情報を置く場所として考えられたので、それよりもヘッダに書いておくほうが確実でしょう。
使い方によっては、META に書いておいたほうがいいこともあるかもしれませんので、これはこれで無意味ではありませんが、さてどんなものか…
掲示板に見出し要素(H1-H6)が使えないなどということはないのに、なぜか見出し要素を使わず、活字に太字やらサイズやらを指定して必死に調節している例を見かけます。しかもスタイルシートを知らないというわけでもなさそうで、他のところではわざわざ SPAN を使って CSS1 を入れてあったりします。なんて無意味なんでしょう。
見出しの字の大きさが気に食わないというのであれば、見出し要素をスタイルシートで調節すればいいのです。
HTML は構造化文書を書くためのツールであると心得ておけば、FONT など、意味のない要素は減らす方向に行くはずなんですけどねえ。
古くから使われているプログラムには、こんなコードがあったりします。どうかすると、最新版にもあったりとか。
print "題名 <INPUT type=text name=subject><P>¥n";
HTML+ の昔はいざ知らず、HTML 2.0 以降の P 要素は、段落をつくるための入れ物です。「1行空けるタグ」ではありません。
入れ物ですから、P の開始/終了タグで文章を挟んだ部分が P 要素になります。ただし終了タグは省略できるので
print "<P>題名 <INPUT type=¥"text¥" name=¥"subject¥">¥n";
と書くならば、正しい書き方になります。なお、属性値がアルファベットと数字だけのときは、引用符 "" を省略できることになってはいますが、全ての場合に引用符をつけたほうが確実です。
最近の CGI プログラムには、たいてい HTML のタグを回避する機能が入れてあります。ただ、全部回避するのも不便だというので、特定のものだけ残せるプログラムもあるようです。
では、どの要素を禁止すべきなのか?
掲示板に特定の書き込みを繰り返す、掲示板を踏台にして他所のサーバを攻撃するなど、規模の大きな悪戯にはプログラムを使っていることが多いので、まずプログラムにアクセスできるような要素は禁止すべきです。また、Web 書見機上でプログラムを走らせるようなものも危険です。
ということは、FORM, SCRIPT, OBJECT, APPLET は無条件に禁止すべきでしょう。某大手ベンダの手になる VBS を掲示板に置いて動かすなどされた日には、とんでもないことになります。