Home > 書籍執筆のご案内 > ホームページ裏ワザ大全

ホームページ裏ワザ大全 - CGI/Perl TIPS & TRICKS - のご案内

ホームページ裏ワザ大全

「ホームページ裏ワザ大全 - CGI/Perl TIPS & TRICKS -」 KENT 著
B5変形 240ページ 定価 2200円 (税別)
インプレス ISBN4-8443-1625-7

はじめに

◎INTRODUCTION CGIへの招待
01 CGIとは
02 Perlとは
03 簡単なCGIを組んでみよう!
04 CGIを設置してみよう!
  ●TIPS01 HTTPヘッダについて
  ●TIPS02 Perlのパスについて
  ●TIPS03 ファイルの読み込みと書き込みについて
  ●TIPS04 絶対パスと相対パスについて
  ●TIPS05 データの受け取り方について
  ●TIPS06 環境変数について
 05 FTPソフトを使いこなそう
FTPソフトの入手と基本的な設定
CGIをアップロードしてみよう
 06 プロバイダーとCGI
自分のプロバイダーを調べる
   CGIに最適な環境を探そう
   プロバイダー別CGI環境紹介

◎TIPS & TRICKS編 CGI/Perlでコミュニケーションをパワーアップ
本書で紹介するCGIスクリプトについて
■カウンタ編
 01 画像カウンタTIPS
  ●TIPS07 重複カウントを防止するには
 02 画像連結カウンタTIPS
  ●TIPS08 画像連結カウンタの特性
  ●TIPS09 カウンタ画像の変更のしかた
  ●TIPS10 米国ユニシス社GIF画像の特許問題について
  ●TIPS11 同時アクセスによるファイル破損と排他処理
 03 昨日と本日のカウンタの取り方TIPS
 04 テキストカウンタTIPS
  ●TIPS12 SSIについて

■掲示板&チャット編
01 ノーマル掲示板(EZ-BOARD)TIPS
  ●TIPS13 投稿フォームの入力必須項目の増やし方
  ●TIPS14 掲示板を改造してみよう(1)
  ●TIPS15 掲示板を改造してみよう(2)
  ●TIPS16 掲示板を改造してみよう(3)
  ●TIPS17 掲示板を改造してみよう(4)
  ●TIPS18 パスワードの暗号化について
  ●TIPS19 クッキー機能について
  ●TIPS20 漢字コードの変換について
  ●TIPS21 文字化けについて
  ●TIPS22 記録ファイルのダウンロード拒否のしかた(セキュリティー対策)
  ●TIPS23 投稿記事のセキュリティー(HTMLタグの無効化)
  ●TIPS24 アクセス拒否のしかたについて
  ●TIPS25 投稿時のリンク元のチェック(セキュリティー対策)
 02 画像アップロード型掲示板TIPS
 03 マルチスレッド掲示板TIPS
  ●TIPS26 マルチスレッド掲示板の運営と管理について
 04 iモード掲示板TIPS
 05 ノーマルチャットTIPS
 06 ロボットチャットTIPS
  ●TIPS27 ロボットチャットの自動応答の仕組み

■メールフォーム編
01 メールフォーム(PostMail)TIPS
  ●TIPS28 メールフォームの改造例(複数のあて先に送信)

■アクセスログ解析編
01 アクセスログ解析(AccessReport)TIPS
  ●TIPS29 アクセス解析に曜日別を追加する
  ●TIPS30 IPアドレスとホスト名について

■アンケート投票編
 01 アンケート投票(Message Enquete)TIPS
  ●TIPS31 ソート機能について

■検索エンジン編
 01 検索エンジン(Net Cruiser v2)TIPS
  ●TIPS32 検索エンジンの運営について

◎APPENDIX
 付属CD-ROMについて
 用語解説
 トラブル解決事典
 KENT WEBの紹介
 KENT WEBのCGIを使ってみよう

■コラム
 掲示板の運営について
 掲示板の記録ファイルとサーバー容量
 メールフォームは、すべての人が使えるCGIで
 sendmailの利用にあたって

訂正のご報告

  1. 書籍内容および付録のCGIプログラムに以下の修正内容があります。以下のとおり訂正させていただきますようお願いいたします。
  2. CGIプログラムに関しましては、ご自分での修正が難しいようでしたら、CD-ROMからコピーしたままの修正対象のCGIスクリプトを、専用フォーム よりお送りください。修正版と差し替えてさせていただきます。
  • iモード掲示板 (i-PAD v1)

    (1) 投稿フォームにて取消ボタンが操作できない不具合。

    ■変更前(316行目付近)
    <input type=submit value="送信"><input type=submit value="取消"></form>
    
    ■変更後
    <input type=submit value="送信"><input type=reset value="取消"></form>
    

    (2) iモードからの絵文字入力がパソコン側に反映されないことのある不具合。

    ■変更前 (124行目付近)
    # 絵文字番号
    @image = (63647 .. 63812);
    
    ■変更後
    # 絵文字番号
    @image = (63647 .. 63740, 63808 .. 63817, 63824 .. 63827,
    		63829 .. 63831, 63835 .. 63838, 63858 .. 63870, 63872 .. 63920);
    
    ※これに伴い、iモード用絵文字画像の差替えが必要です。以下からダウンロードしてください。
    → LHA形式 でダウンロード
    → ZIP形式 でダウンロード
    ■変更前(575行目付近)
    # コード判別(半角カナ対策)
    if (!$imode) {
    	$code = $in{'code'};
    	$code = &jcode'getcode(*code);
    	if ($code ne "sjis") {
    		&jcode'convert(*i_nam, 'sjis', "$code");
    		&jcode'convert(*i_sub, 'sjis', "$code");
    		&jcode'convert(*i_com, 'sjis', "$code");
    	}
    }
    
    ■変更後
    # 絵文字対策
    if ($imode) {
    	$sj = '[\x80-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
    	$em = '[\xF8\xF9][\x40-\x7E\x80-\xFC]';
    	$i_sub =~ s/\G((?:$sj)*)($em)/$1.'&#'.unpack('n',$2).';'/ego;
    	$i_com =~ s/\G((?:$sj)*)($em)/$1.'&#'.unpack('n',$2).';'/ego;
    # コード判別(半角カナ対策)
    } else {
    	$code = $in{'code'};
    	$code = &jcode'getcode(*code);
    	if ($code ne "sjis") {
    		&jcode'convert(*i_nam, 'sjis', "$code");
    		&jcode'convert(*i_sub, 'sjis', "$code");
    		&jcode'convert(*i_com, 'sjis', "$code");
    	}
    }
    
    ※上記の絵文字コード変換処理は、CGIぽんさんの公開する変換コードより引用させていただきました。この場を借りてお礼申し上げます。
  • 検索エンジン :スクリプトの修正
    ▼ cruiser.cgi 995行目付近(カテゴリ内表示の不具合 → 特に NetScape6 では表示が乱れる)
    ■変更前
    foreach ("AND", "OR") {
    	if ($in{'cond'} eq $_) {
    		print "<option value=\"$_\" selected>$_\n";
    	} else {
    		print "<option value=\"$_\">$_\n";
    	}
    }
    print "<input type=submit value=' 検索 '>\n";
    print "<small>[このカテゴリの中から検索]</small></form><hr>\n";
    
    ■変更後
    foreach ("AND", "OR") {
    	if ($in{'cond'} eq $_) {
    		print "<option value=\"$_\" selected>$_\n";
    	} else {
    		print "<option value=\"$_\">$_\n";
    	}
    }
    print "</select> <input type=submit value=' 検索 '>\n";
    print "<small>[このカテゴリの中から検索]</small></form><hr>\n";
    
  • アクセス解析

    ▼ 書籍内容の訂正 (P172)

    ■変更前
    require './jcode.pl';
    
    ■変更後
    $jcode = './joce.pl';
    

    ▼ report.cgi 90行目付近 (スクリプトのセキュリティ改善)

    ■変更前
    # リンク元を取得
    $ref = $ENV{'QUERY_STRING'};
    $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $ref =~ s/<(([^>]|\n)*)>//g;
    if ($ref !~ /^http\:\/\//) { $ref = ''; }
    else { $ref =~ s/\r|\n//g; }
    
    # リンク元をシフトJIS変換(YAHOOなど検索エンジンからのキーワード処理)
    if ($ref) {
    	require $jcode;
    	&jcode'convert(*ref,'sjis');
    }
    
    ■変更後
    # リンク元を取得
    $ref = $ENV{'QUERY_STRING'};
    $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    if ($ref =~ /^https?\:\/\//) {
    	$ref =~ s/&/&amp;/g;
    	$ref =~ s/"/&quot;/g;
    	$ref =~ s/</&lt;/g;
    	$ref =~ s/>/&gt;/g;
    	$ref =~ s/\r|\n|\0//g;
    
    	# シフトJIS変換(検索エンジンからのキーワード処理)
    	require $jcode;
    	&jcode'convert(*ref,'sjis');
    } else {
    	$ref = '';
    }
    
  • 2ch風掲示板

    ▼ mtbbs.cgi 233行目付近 (トップ画面の記事表示件数が10件固定となる → $t_maxの設定が反映されない)

    ■変更前
    if (11 < $res) {
    	print "[<a href=\"$script?mode=view&no=$no&list=all\">全件表\示</a>]\n";
    }
    print "<h3 style=\"font-size:18px; color:$t_color\">$sub</h3>\n<DL>\n";
    $k=0;
    while (<T>) {
    	$k++;
    	if ($k > 1 && $res > 11) { $res--; next; }
    	local($no,$name,$email,$com,$date) = split(/<>/);
    	$name = "<font color=\"$mycolor\">$name</font>";
    	if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }
    	if ($autolink) { $com = &auto_link($com, $num); }
    	print "<DT>[<b>$no</b>] <b>$name</b> - $date\n";
    	print "<DD>$com<br><br>\n";
    }
    
    ■変更後
    if ($t_max+1 < $res) {
    	print "[<a href=\"$script?mode=view&no=$no&list=all\">全件表\示</a>]\n";
    }
    print "<h3 style=\"font-size:18px; color:$t_color\">$sub</h3>\n<DL>\n";
    $k=0;
    while (<T>) {
    	$k++;
    	if ($k > 1 && $res > $t_max+1) { $res--; next; }
    	local($no,$name,$email,$com,$date) = split(/<>/);
    	$name = "<font color=\"$mycolor\">$name</font>";
    	if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }
    	if ($autolink) { $com = &auto_link($com, $num); }
    	print "<DT>[<b>$no</b>] <b>$name</b> - $date\n";
    	print "<DD>$com<br><br>\n";
    }