レンタル掲示板やレンタルチャットをリンクしたことしか無いと言う方も、CGIを自分で設置しようと思っているかも知れませんが、CGIは非常に危険な技術です。
CGIはHTMLやCSSなどと違って、非常に制作が難しいです。
HTMLは多少のエラーがあっても何とかブラウザがフォローしてくれますし、CSSはエラーがあれば無視するだけの話です。JAVAスクリプトのエラーも多くの場合大した問題にはなりません。
しかし、CGIはそうはいきません。
単純に文法エラーが出るだけならまだいいのですが、エラーが無ければ良いという訳でもありません。
例えば、無限ループを行うスクリプトを起動してしまうと、サーヴァはいつまで経っても処理を終了できません。つまり、その間他の閲覧者のサーヴィスに大きな影響が出る事になります。最悪の場合はサーヴァダウンを引起す事になり兼ねません。
CGIのテストには必ずローカル環境を整備しましょう。
パーミッションのところでも解説しましたが、CGIスクリプトやスクリプトが取扱うリソースについて、パーミッションの設定が甘いと危険です。
例えばノーボディ(第三者)やグループ(同一サーヴァの別会員)の読出しを不必要に認めると、簡単にハッキングされてしまいます。
書込みを認めた場合に至っては、ハッキングどころかクラッキングされることもあります。
悪意あるデータを送られることにより、機密ファイルをハッキングされたり、サーヴァ全体を麻痺させるコマンドが実行されてしまうこともあります。
一番有効なのは有効なデータ形式を絞り込んで、合致しないものは全て不正データと見なして弾く事です。
また、余計な機能のある命令を使わないと言う手もあります。
実際にCGIを作成するにはEUC日本語コードが一番問題が起こりにくいとされています。
しかしながら、携帯電話向けのコンテンツの場合はシフトJISで処理した方が簡単になるので、シフトJISでスクリプトを書く事もあるかも知れません。
シフトJISで作成する場合は、一部の文字で不具合が出ますので、充分注意して下さい。
以下の文字は、文字コードの二バイト目に「\」と同じコードが入っています。
これらの文字が入ると、後続の文字が化けたり、エラーの原因にもなります。対策としては、該当する文字の直後に「\」を入れてやる事です(例:「表示」⇒「表\示」)。
文字コード対策として「jcode.pl」というスクリプトも開発されています。このライブラリを利用することで、EUC日本語コード⇔シフトJISコード間の変換も容易になるため、多くの日本語スクリプトで使われています。
一部のサーヴァには「flock()」等の函数が使えず、そのため代用函数をわざわざ作らなくてはなりません。
ISPのサーヴァを用いる場合には問題になるでしょう。
負荷とは、サーヴァにかかる負担の事です。
ゲームCGIやチャットCGIは、短時間に何度もリクエストされる場合が多い為、サーヴァには大きな負担になります。
このため、これらのCGIを禁じているところさえあります。
その他のジャンルのCGIでも、負荷が掛かり過ぎてしまう事があります。
サーヴァの負荷を減らすには幾つかの方法がありますが、Perlでは以下の方法が有効です。
大掛かりなスクリプトだと、処理前のコンパイルに時間がかかり、それが負荷となります。
そのため、状況次第で使われないことがある処理は別スクリプトに分割し、必要になったときに限り呼出すようにしましょう。
やはりコンパイル時間を減らす為に、同様の処理を見つけたら全て同じ函数で処理できるようにしましょう。要はスクリプトの総容量がなるべく短くになるようにすればいいと言う訳です。
携帯電話は多くの端末がシフトJIS限定なので、EUC日本語コードだと最後に「jcode.pl」で変換してやる必要があります。
そうすると「jcode.pl」のコンパイルが負荷になります(全く利用しない函数の分も負荷になります)。
この負荷を減らすには、始めからシフトJISコードで書けばいい訳です。