のフリー、シェアCGI・PHPスクリプト・JavaScriptをキーワード、97のカテゴリーから検索できます。スクリプトの登録ご利用は一切無料です。


フリー、シェアCGI・PHPスクリプトをキーワード、96のカテゴリーから検索できます。

 スクリプトをお探しなら当サイトでOK

  •  フリー、シェアのCGI・PHPスクリプトをメインに検索。
  •  ランキングによる評価で人気のスクリプトを紹介。
  •  サンプル(ページ)によるダウンロード前の事前評価。
  •  お気に入りスクリプトへのパーソナルリンクの作成。

 スクリプト登録のメリット

  •  シェアスクリプトでも、掲載は一切無料。
  •  細かなカテゴリー(全97項目)で閲覧者に分かり易く分類。
  •  スクリプトを印象づけるサンプル(ページ)の登録が可能。
  •  ダウンロードランキングの実施による人気度の評価。

当サイトはQ&A掲示板(コミュニティ)の窓口を共有して下さるサイト様を募集しています。

[Q&A掲示板] 共有サイト様募集!

掲示板機能拡張-1


前回作った簡易掲示板ですが、実は致命的なセキュリティホールが存在します。
入力された文字列は何も加工せずに保存していました。
つまり、これは悪意のある文字列が入力されてもそのまま出力されてしまいます。

悪意のある文字列とは、HTMLタグを作った文字列のことであり、ここのJavaScriptなどの言語を組み込まれると
下手するとコンピュータがウィルス感染してしまう恐れがあります。
また、それ以前に、文字列に改行が入っていた場合は、データ保存方法の形式を乱してしまうため
実用的ではありませんでした。

今回は、これを改善するために正規表現を使います。
変更する点は、書き込み関数に一部スクリプトを追加し、そして、タグ削除関数を新たに定義します。

# 書き込み関数
sub In {
   # 入力値チェック

   # エラーメッセージ
   $ERROR = '';

   # 名前チェック
   $ERROR .= '名前が入力されていません!<br>' unless($in{'name'});
   $ERROR .= '名前が長すぎます!<br>' if(length($in{'name'}) > 40);
   # コメントチェック
   $ERROR .= 'コメントが入力されていません!<br>' unless($in{'comment'}); 
   $ERROR .= 'コメントが長すぎます!<br>' if(length($in{'comment'}) > 1000);
   # パスワードチェック
   $ERROR .= 'パスワードには半角英数字以外は使用できません!<br>' if($in{'pass'} =~ /[^0-9a-zA-Z]/);

   # エラー処理
   if($ERROR) {
      print "Content-type: text/html\n\n$ERROR";
      exit;
   }

   # タグ削除
   $in{'name'} = &Del_Tag($in{'name'});
   $in{'comment'} = &Del_Tag($in{'comment'});

    # データ読み込み
    &Get_BBS();

    # ID取得
    open(DATA, "< $DATA_ID");
    eval{ flock(DATA, 1); };
    $id = <DATA>;
    close(DATA);
    open(DATA, "+< $DATA_ID") or open(DATA, ">> $DATA_ID");
    eval { flock(DATA, 2); };
    seek(DATA, 0, 0);
    print DATA ++$id;
    truncate(DATA, tell(DATA));
    close(DATA);

    push(@BBS_DATA, "$id\t$in{'pass'}\t$in{'name'}\t$in{'comment'}");

    # データの書き込み
    &Set_BBS();

    print "Content-type: text/html\n\n";
    print "書き込みが完了しました!\n";
}

# タグ削除関数
sub Del_Tag {
   $_[0] =~ s/&/&/g;
   $_[0] =~ s/\"/"/g;
   $_[0] =~ s/>/>/g;
   $_[0] =~ s/</</g;
   $_[0] =~ s/\n/<br>/g;
   return ($_[0]);
}

正規表現で不正を発見した場合に、エラーメッセージを代入演算子を用いて変数へ追加していきます。
最終的にエラーメッセージが一つでもある場合は、エラーメッセージを表示し、強制的に終了させています。

無事不正なく通過すれば、今度はタグを除去(無効化)します。
このタグ無効化処理は、CGIを作成するために必須であり、
これが欠けると悪意のあるユーザーから攻撃を受ける可能性があります。

しかし、タグを無効化してもタグは単なる文字列と表示されるため、少々見栄えが悪くなります。
下記のように書きますと、タグそのものが消去され表示されなくなります。

sub Del_Tag {
   $_[0] =~ s/<.+?>//g;
   return($_[0]);
}

こちらの方が短く済んで便利ですが、一部欠点があります。
たとえば、"<日本語について>" などと書き込まれた場合、この"日本語について"という文字列も一緒に消えてしまいます。

scriptEYE