#!/usr/local/bin/perl # # # imgboard.cgi v1.20 (Rev.5) # # # Original Program to-ru@big.or.jp # Modified and Updated by ogo@ta2.so-net.or.jp # 配布スクリプト説明等はrescueさんのMiniBBSを参考に # させていただきました(^_^) # # <改変履歴>-03/03/07 # 1999/01/04 ゲストパスワード機能を修正 # 1998/09/20 リサイズ機能追加。管理者メール機能追加。 # 1998/08/24 最大件数を超えても画像ファイルが削除されないバグを Fix # 1998/08/14 外部IMG貼込処理時の小バグをFix # 1998/08/02 登録エラー時、画像ファイルがサーバに残るバグ対処 # 1998/07/15 タグ埋込許可オプション追加。 by ogo@ta2.so-net.or.jp # 1998/07/10 CGI専用ディレクトリ型プロバイダ対応 by ogo@ta2.so-net.or.jp # 1998/06/18 95/NT製のWWWサーバ対応 by ogo@ta2.so-net.or.jp # 1998/06/04 クッキー対応,Mac対策 by ogo@ta2.so-net.or.jp # 1998/05/24 SJIS化,リロード時の不具合対処 by ogo@ta2.so-net.or.jp # 1998/01/24 v0.9の完成 by to-ru@big.or.jp # URL http://www.big.or.jp/~talk/t-club/soft/ # # <利用規定> # 1.このCGIは,当利用規定に従っていただく場合に限り,個人,法人にかかわらず, # 自由にカスタマイズし、無料で利用していただく事ができますが,著作権は # 放棄しておりませんので,当著作権表示ならびに,掲示板下部の著作権表示と # リンクを改変及び,削除することは固く禁止します。 # 2.このスクリプトの一部でも使用あるいは,参考にした場合,そのスクリプトには # 必ず当著作権表示と当サイトの URLを入れ,また当サイトへのリンクを掲示板 # 下部に埋め込んで下さい。 # 3.条件1,2を満たさない場合は,その利用を一切禁止します。 # 4.改造、非改造を問わず、作者に無断で再配布することを固く禁止します。 # 5.万一このCGIにより損害や不利益受けたとしても、当方は一切その責任を負う # 義務を持ちません.あらかじめご了承ください. # 6.掲示板の管理責任は,その掲示板の設置者にあるものとします。 # 7.当方がその使用を不適当だと認めた場合,その使用を中止させていただく # 場合があります.あらかじめご了承ください. ########################################################################################### # # 基本構成(初期設定はこの構成を前提に解説します) # # public_html(ホームページディレクトリ) # | # |-- cgi-bin(任意のディレクトリ) # | # |--img-box(777)(画像保存用ディレクトリ) # | # |-- jcode_sj.pl (755)(ライト版の日本語ライブラリ) # |-- imgboard.cgi (755) # |-- file.dat (666) # # ・( )内はパーミッッション値 # ・file.dat は中身が空の同名ファイルをパソコン上で作成.ftpで転送する # ・jcode_sj.plは中身を全くいじらずにそのままアスキー転送する # ・これら3つのファイルはアスキーモード(テキスト)で転送すること. # ########################################################################################### #=======================================================================# # 初期設定 #=======================================================================# # 先頭に#のある行は読み込まれません. #==================================# # <必須設定項目> # #==================================# # $admin_passwd = 'passwd'; #管理人による記事削除時のパスワード # #(変更してください) # $title = "目指せ!ぷくぷく!"; # ↑「お気に入り or ブックマーク」保存時のタイトルになります。 # # ■<戻り先URL> # 終了ボタンを押したときに、下記URLへ戻ります。 # (URLを下記デフォルトURLから変更しますと、ボタンが自動的に出現) $back_url ='http://www.ncf.or.jp/wg/diet-derby/index.html'; # # ■<投稿画像の格納ディレクトリ> # 投稿された画像ファイルを保存しておく場所です.整理を簡単にするため、また # セキュリティ確保のためにimgboard.cgiと同じディレクトリではなく,直下に # 新規ディレクトリを作成して,そこにアップロードファイルを保存することを # 強くおすすめします. # なお,場所の指定方法ですが,通常は相対パス*で指定して下さい. # ---解説---- # 相対パスとは、当cgiから見た相対的な位置を指定する方法です。 # 以下の設定はcgiのあるディレクトリ直下にimg-boxという名前の新規ディレクトリを # 作成し、そこを保存ディレクトリとした場合の相対パス指定例です(ピリオドは # 当CGIが置いてあるディレクトリを意味します。)。 # 相対やら、絶対やら、なんか難しくてよくわからない・・という方は、このまま指 # 定を変更しないで、上記の通りの位置にimg-boxディレクトリを作ってください。 $img_dir = './img-box'; #デフォルト # # (補足事項/一部該当者のみ読んでください) # あなたのプロバイダが,cgiとデータファイルを同じ場所に置くことが出来ない # 特殊なプロバイダ(hi-ho等)でcgiと同じディレクトリやcgi直下に保存用ディレ # クトリを作れない場合、絶対パスによる指定が必要となる場合があります。 # この場合、5行ほど前にある$img_dirを絶対パス指定に書換えて下さい。 # 絶対パスとは、そのコンピュータ上のファイルシステムの一番上の階層から # そのファイルの置いてある位置までのすべての階層をちゃんと指定したもの # になります。 # 絶対パス例・・・・$img_dir = '/home/usr5/~talk/photo_bbs/img-box'; # (注:通常はできるだけ相対パス指定をして下さい) # 絶対パスがわからない場合、プロバイダのユーザサポートページのCGI関連情 # 報のコーナ等に情報がたいていありますので、これを探してください。またtelnet # してシェルが使えるプロバイダの場合はpwdというunixコマンドを該当ディレクト # リに移動後、入力すると絶対パスが表示されます。 # なお、絶対パス指定をした場合、同imgファイル保存ディレクトリのURL指定も併 # せて行って下さい. # (注:当指定は一部の該当者のみ。通常は設定不要) $img_url ='http://あなたのプロバイダ/あなたのディレクトリ/img-box'; # # # <掲示データ保存ファイル名> # テキストデータの保存用ファイルの名前です. # imgboard.cgiと同じ場所に設置する場合はこのパス指定のまま. $file= './file.dat'; # # <日本語コード変換ライブラリ> # imgboard.cgiと同じ場所に設置する場合は、このパス指定のまま. # 注:jcode_sj.plはjcode.plの機能限定スリム版です。SJISへの変換機能のみ。 require 'jcode_sj.pl'; # # <画像プロパティ認識ライブラリ> # imgboard.cgiと同じ場所に設置する場合はこのパス指定のまま. $imgsize_prog="imgsize.pl"; # # #==========================================================# # <以下,必要に応じて設定> # #==========================================================# # # 以下の設定は,すべてオプションです。 # # たいていのプロバイダの場合、特に変更しなくてもスクリプトは動きますので, # 一度この状態でスクリプトを動かしてみてください。 正常に動かなかった場合, # サポート掲示板のFAQをみて,問題を解決してみてください。正常に動いた場合は, # いろいろ細かくアレンジできるようになっていますので, 以下のオプション項目へ # 進み、自分流にオプションを設定し,アレンジしてみてください。 # # ■<転送許可画像サイズ上限> # ファイル投稿時、このCGIは他のテキスト系CGIよりも多くのメモリリソー # スを必要とします。これはアップロードしたファイルの復元処理にバッファが必要 # なためであり、必要なメモリ量は転送された画像サイズに比例します。非力なサー # バを使用している場合は、自然とアップロードサイズを小さくする必要があり、 # そうしないと処理はタイムアウトして止まりますのでご注意下さい。 # 200KB以上にはしないこと。 # デフォルト50KB $max_upload_size = 50; #単位KB # # ■<サーバ保存メッセージ数> # この件数を超えると、古いものから削除. デフォルトは30. # 極端に増やすと処理が遅くなりますので、ご注意。 # # --注意点-- # 画像データ削除時は、必ず掲示板を用いて、記事ごと削除して下さい。 # $max_message = 300; # # ■<1ページに表示するメッセージ数> # デフォルト10 # 多くすると表示時に時間がかかります。10以下推奨 $disp_message = 10; # # ■<CGI名> # このCGIのファイル名です.自分でCGI名を変更した場合は適宜変更. $cgi_name = "pukupuku.cgi"; # #==================================# # # #==================================# # # ■ <画像表示モードのユーザ選択> # 画像表示モードで絵を直接貼り付ける、貼り付けない(リンクのみ)、アイコン # サイズにする、固定サイズにする等の選択をユーザの方で選択できるようになっ # ています。(通信速度、環境等の条件により、最適表示モードはユーザ毎に異なり # ますので)。ユーザの選択した表示モード設定は、クッキーに記憶され、次回から # そのユーザに対しては、それが、デフォルト提供されるようになります。 # この機能を無効化して、掲示板管理者の方で表示モードを指定する場合は、0を # 指定し、この次の項目で表示モードを固定的に設定してください。 # (1=ユーザ選択メニューを出す(デフォルト),0=ユーザ選択メニューを出さない) $user_selected_view_mode=1; # # ■ <画像表示モードの管理者設定> # ユーザ選択に任さない場合、画像表示モードを管理者側で指定してください。 # # 画像を直接掲示板に貼り付ける、貼り付けない。 # (1=yes,0=no)デフォルトは1 $show_img_on_board=1; # # 上で1を選択した場合,その埋め込みサイズを選択。 # (0=iconサイズ,1=auto,2=横固定,3=オリジナル) デフォルトは0 $on_board_img_size=0; # # --注意点-- # 貼付する場合は,ページのロードが遅くなりますので、1ページ当たりの # 発言表示個数を少なめにした方がいいでしょう.画像の大きさも小さ目に # 制限した方がいいようです。 # # ■ <マルチデータアップロード可能にする> # 当掲示板は、GIF,JPEG以外に以下のタイプのデータも投稿できるようにすること # ができます。(動画,音声,LZH,HTML,MS_PowerPoint,WORD書類、その他) # 画像データの公開以外に、FTPソフトに不慣れなインターネット初心者からのFTP # 代替手段に用い、情報共有手段にする等、様々な用途にご利用いただけるよう # 設計されています。あなたのアイデア次第で、広範囲な用途に使用可能です。 # (この場合、データの著作権問題に関しては十分ご注意下さい。管理責任は掲示板 # 設置者の責任となります。) # なお特定のタイプのデータを、投稿禁止したい、あるいは追加したい場合は、 # スクリプト中のサブルーチン(additional_content_types)内で変数をコメント # アウトor追加してください.ただし拡張子がcgi,shtml,asp,wsh(js,vbs)等の # プログラム形式のファイルはアップロードできないようになっています。 # (この設定はセキュリティ保全のための処置です。変更しないで下さい ) # # マルチデータアップロードを # (1=可能にする,0=可能にしない)デフォルトは0 $allow_other_multimedia_data=0; # # ■ <保存ファイル名の指定> # 当掲示板では自動的にファイルのリネームをします。 # 1.20では,その命名法をいろいろ選べるようになりました。 # # ○ <時刻ベースのファイル名を使用する> # 従来は、img番号.jpgというファイル名で、空いている一番小さい数字を # 使うようになっていたのですが、1.20では,投稿時刻を基準とした名前を # 選択できるようになりました。 # # (1=時刻ペースのファイル名を使用(デフォルト),0=従来の命名方法を使用) $use_time_based_name=1; # # ○ <オリジナルファイル名を使用する> # ファイル共有用途に用いる場合、リネームされると困ると言う声が結構あり # ましたので元ファイル名をそのまま使って保存するオプションも用意しました。 # # ただし、オリジナルファイル名を使用し、かつ gif,jpeg以外のファイルも # アップロード可能な、前記マルチデータアップロードをONにした場合、危険な # プログラムファイルをアップロードされ, 実行されてしまう危険性があります。 # このような状態は、セキュリティ的に問題がありますので、1を指定する場合は、 # 必ず以下の使用上の注意を守ってください。 # # --注意-- # 1.相手を信用できる、イントラネット掲示板でのみ使用する事。 # 2.img-box内のファイルのプログラム実行を禁止する「.htaccess」ファイ # ルを特報FAQコーナで配布しますので、これをimg-box内に必ず置く。 # (置いてない場合,安全装置が働き、当cgiは動きません) # 3.拡張子リストを追加しない。 # # (1=オリジナルファイル名を使用,0=使用しない(強く推奨)) デフォルトは0 $use_orig_name=0; # # --WWWのセキュリティに詳しい方以外は、トラブルを避けるために # ”使用しない”ことを推奨します(^^) -- # # ■ <フォーム入力項目のデータ有無チェック> # フォームの各入力項目はチェックされます. # 必須入力項目の欄が空記入の場合,記事は登録はされません. # 従ってユーザにとって必須入力項目となります. # どの項目を必須にするかは下記で指定して下さい。 # # 1=必須,0=省略を許可 $check_name =1; #名前 (デフォルト1) $check_email =0; #email(デフォルト1) $check_subject =0; #題名 (デフォルト0) $check_body =0; #本文 (デフォルト0) # #==================================# # <セキュリティ オプション> # #==================================# # # <投稿者用パスワード> # 投稿時にパスワードをチェックし、正しい場合だけ登録するようにできます. # 掲示板の公開運営に不安がある場合は、この機能を用いて会員制にすること # をおすすめします.パスワードは一度入力するとクッキーに記憶されますの # で、次回の投稿から入力不要です。なお、1を指定すると自動的に項目が # フォーム欄に出現します。 # (1=使用,0=使用しない) $use_passwd_flag=0; # 会員パスワード $member_passwd="passwd"; # # <タグ使用許可> # コメント中にタグを許可するかどうかを指定できます。許可すればユーザ表現の # 自由度は上がりますが、タグの閉め忘れ等によりトラブルが発生する可能性が # あります。またタグを許可する指定にしても、掲示板に対するイタズラ予防のため # 一部タグはフィルタされ使用できませんので、あらかじめご了承下さい。 # (詳細はsub form_checkを参照) # デフォルトはタグ使用可です。(1) # (1=使用可能,0=使用不可) $use_tag=1; # # # タグを許可した場合、特に、IMGタグの埋込み可否を指定して下さい。 # 許可すると、アップロードデータ以外の他サイト画像データも記事に埋込む事が # でき、ユーザの自由度が上がります.(自分のアイコン画像やマスコット等) # しかし、同時に、IMGタグの埋込みによる、外部サイト画像の無断リンクによる著作 # 権侵害問題や、 アダルト画像データの不正埋込み表示イタズラ等のトラブルが発生 # する可能性が発生します。 当スクリプトの性格上、自サイトデータと他サイトデー # タの区切りが不明瞭になり、運営管理が混乱する傾向があるようですので、運営上 # は非許可にすることを、強く推奨します。 # なおIMGタグを許可し、ユーザにより外部IMGが埋め込まれた場合、その画像には # 通常height, width指定がありませんので、ページのレイアウトまでにかかる時間 # が極端に長くなってしまうデメリットが生じます。許可される場合は、その点 # 十分ご留意願います (これはネスケ,IEの仕様なので仕方ありません)。 # なお、$use_tagでタグ使用を許可していない場合は、この指定は関係ありません。 # (1=許可,0=非許可(強く推奨)) $use_img_tag_in_comment=0; #  # <掲示板荒し対策> blacklist # 以下のパターンを名前に含むプロバイダに属するユーザから登録できないように # します.悪質な掲示板荒しが頻発した場合、対抗策としてご利用ください. @BLACK_LIST=("rr.com","anonymizer.com","copernicus.or.jp", "i-kyusyu.or.jp","utm4*.bekkoame.or.jp","nasuinfo.or.jp", "ohta.ap.so-net.ne.jp","123.123.123.123","tokyo.att.ne.jp","123.123.123.2??"); # # <データタイプ不明時の処理> # アップロードデータの属性を判別できなかった場合,掲示板に登録するかどうかを # 選択してください.デフォルトはユーザに警告を出して,登録しない(1)です. # (1=警告エラーを出して登録中止,0=拡張子datでとりあえず登録) $unknown_data_exit=1; # # <管理者自動メール> sendmail # 記事が登録されると、下記メールアドレスにメールで通知します。 # この機能を使用する場合は、以下の三つの情報をすべて確実に指定してください。 # これらの情報を間違えると、サーバ管理者へ迷惑をかけるので、必ず管理者に確認 # してから慎重に設定を行ってください。なお、この機能が使えるのはプロバイダ # がUNIX系のユーザのみです。(Mac,Win不可)設定がよくわからない場合は使用し # ないでください。 # $use_email =1; #(1=yes,0=no)デフォルトは0 # メールプログラムのパス(プロバイダの管理者に聞く) $mail_prog = '/usr/lib/sendmail'; # 管理者のメールアドレス(あなたのメールアドレス) $recipient = 'diet-derby@ml.ncf.or.jp'; # メール本文にURLリンクを作るため、画像保存ディレクトリのURLを指定して下さい。 $img_dir_url='http://www.ncf.or.jp/wg/diet-derby/paddock/img-box/'; # # <ちょっとおやすみ> oyasumi # 旅行に出かける等、しばらく掲示板をお休みしたい時は0にしてください。 $bbs_open_flag=1; #(1=yes,0=no)デフォルトは1 # おやすみ時のメッセージ(適宜変更) $oyasumi_message=qq| 管理者旅行中のため、しばらくお休みします。
またのお越しをお待ちしております。 |; # #=========================================# # <HTML詳細設定項目オプション> # #=========================================# # # <フォーム入力部のデザイン> $table_bgcolor =""; #フォーム部分の背景色 $table_background_image =""; #フォーム部分の背景画像 $table_border ="0"; #フォーム部分の枠の高さ $table_cellspacing ="1"; #フォーム部分の枠の幅 $table_cellpadding ="2"; #フォーム部分の枠のマージン $font_option ="color=black size=+0"; #フォーム項目中の文字色とサイズ指定 $ie_bg ="bgcolor=#DFDFFF"; #欄の色指定(IE用) # # <フォーム入力部を掲示板上に表示> $form_disp_on_board =1; #(1=yes,0=no)デフォルトは1 # #--注 上記数値を0にすると、内部処理の関係で表示が少々遅くなります。 # できるだけ1のままに。 # # # ◆ <HTML抜粋> # # ユーザサイドでHTMLを変更しやすいように,スクリプト中のHTML定義部分を # 以下に抜き出し列挙してあります.それぞれ,print< # #=====================================# # # HTMLヘッダ,ボディ指定.タイトル等画面最上部のHTMLです # print< $title

目指せ!ぷくぷく! 太りたい人のための掲示板

HTML_END } # #=====================================# # <HTML--画面中央の説明> # #=====================================# # # 真ん中の説明部分のHTMLです. # sub middle_A_html{ print<
  • あなたのパ\ソ\コ\ン上のファイルを,直接BBS上にアップロードできます. $explain_upload_add_on
  • 名前、e-mail、題名は一度登録すると記憶されますので次回から入力省略できます. $tag_siyou_tyuui
HTML_END } sub middle_B_html{ print<
  • 新しい記事から表\示\。最高$max_message件の記事が記録され、 それを超えると古い記事から削除されます。
  • 1回の表\示\で $disp_message 件を越える場合、 最下部のボタンを押すことで次の画面を表\示。
  • 現在表\示\されているのは $start_message から $last_message の記事です.
  • クリックすると元の画像が新フレームに表\示されます.

HTML_END } # #=====================================# # <HTML--投稿記事部分> # #=====================================# # # テキストリンク記事、アイコンサイズ記事、固定サイズ記事、オリジナル # サイズ記事などの表示モードにより記事部HTMLを変更しなければなりませんが、 # それぞれ非常に良く似てますので、ここでは基本レイアウト2パターン # を定め、それの一部分($html_block_A)をすり替えることにより、全表示モード # をカバーしようと思います。 # # レイアウトパターン1/ 画像が主役でないレイアウト # (----テキスト記事、テキストリンク表示、アイコンサイズ表示用----) sub kiji_base_html{ print< $tmp_subject 名前:$tmp_name $tmp_date
$tmp_body
$html_block_A
HTML_END } # レイアウトパターン2/ 画像がメインな記事用レイアウト # (------横固定サイズ表示&オート&オリジナルサイズ表示用--------) sub kiji_base2_html{ print< 画像タイトル:$tmp_img_title
$tmp_subject 名前:$tmp_name $tmp_date

$tmp_body


HTML_END } # # レイアウトパターン1の$html_block_Aに代入するHTML # (-----------html_block_Aに代入するHTML-------------) # # html_block_Aには、テキスト、テキストリンク、アイコンサイズ、各表示モードに # より異なるHTMLが代入されます。以下でその代入ブロックを編集して下さい。 # sub set_html_block{ #変数の準備 $img_dsize="$IMG_PARAMETERS{'dsize'}"; $size_sitei="$img_size_sitei"; # # アイコンサイズ用HTML指定部-------(html_block_Aに代入) $icon_html_block=qq|
画 像:  $tmp_img_title -$img_dsize 
|; # # テキストリンク用HTML指定部-------(html_block_Aに代入) $textlink_html_block=qq|
$data_type:  $tmp_img_title
|; } # #=========================================# # <HTML--入力フォーム部> # #=========================================# # # 記事入力フォーム部のHTML.変更によりCGIがうまく動かなくなる # 可能性がありますので,ここは変更する時は十分注意してください. # sub form_html{ #以下の行から"HTML_END"のある行までは通常のHTMLとして編集可能です. print<
$cm_out_pw_h $cm_out_pw_f
会員パスワード
おなまえ(馬名)
e-mail
題名
画像選択 ←ファイルを選択
画像の題名
本文:
$cm_out_exit_h$cm_out_exit_f
HTML_END } # # #------------HTML抜粋ここまで------------# #=================================================================# # 以上でユーザカスタマイズ部分である初期設定は終わりです. # # 以下はプログラムになります. # #=================================================================# #=======================================================================# # メインルーチン #=======================================================================# &init_valiables; #初期化 &check_open; #開店確認 &read_input; #フォームの内容とクッキーを読み込む if($FORM{'action'} eq 'post'){ #モードが投稿モードの場合 &check_entry_passwd; #会員チェック &protect_from_BBS_cracker; #荒し対策 &post_data; #投稿処理 &set_cookies; #クッキーをセット &send_mail; #管理者へメール &jump_html; #パラメータクリア用HTML exit; #終了 }elsif($FORM{'action'} eq 'remove'){ #モードが削除モードの場合 if($FORM{'passwd'} eq $admin_passwd){ $remove_mode="admin"; #削除モード &remove_data; #削除処理 &jump_html; #パラメータクリア用HTML exit; #終了 }elsif(($FORM{'passwd'} eq $guest_passwd)&&($use_guest_passwd ==1)){ $remove_mode="guest"; #削除モード &remove_data; #削除処理 &jump_html; #パラメータクリア用HTML exit; #終了 }else{ &error("パスワードが違います.削除を中止しました."); } }elsif($FORM{'action'} eq 'pf_change'){#モードがプロファイル変更の場合 &set_cookies; #クッキーをセット &jump_html; #パラメータクリア用HTML exit; #終了 }elsif($FORM{'action'} eq 'page_change'){#モードがページ変更の場合 &read_cookie; #クッキーを読込む }elsif($FORM{'action'} eq 'disp_form_only'){#フォームウィンド表示の場合 print "Content-type: text/html \n\n"; print "\n"; print "

    画像Upload掲示板

\n"; &output_form_html; #入力フォームを表示 print "\n"; exit; } #モードが指定されてない場合,掲示板を表示 &protect_from_BBS_cracker if($no_disp_for_cracker==1); #荒し対策 &output_html; #掲示板を表示 exit; #=======================================================================# # サブルーチン #=======================================================================# #================# # 初期化 #================# sub init_valiables{ require "$imgsize_prog" if(-e "$imgsize_prog"); $HTTP_USER_AGENT =$ENV{'HTTP_USER_AGENT'}; $REMOTE_HOST =$ENV{'REMOTE_HOST'}; #========= 以下はマイナーオプションです ( 0=no,1=yes)==========# # 0=no,1=yes # (ブラックリスト関連) $no_disp_for_cracker =0; #リスト上のサイトには掲示板も見せない $use_ext_blacklist =1; #外部にblacklist.txt があれば,そのリストをロードする # (ゲストパスワード機能) $use_guest_passwd =1; #ゲストパスワード機能を使用 $gp_allow_subnet =0; #同じサブネットからのアクセスは同一人物とみなす $guest_passwd ='guest'; #記事削除時の ゲストパスワード(変更してください) # (その他) $no_disp_RH_in_HTML_sorce=0; #HTMLソースにリモホを表示しない $force_www_server_os_to=''; #未使用パラメータ(指定しないこと) # (時差)---海外サイトに設置する場合 # (設定例) 時差を-15時間にする場合 $gisa=-15;という風に設定してください。 $gisa=0; #時差(h)  } #================# # 開店確認 #================# sub check_open{ if($bbs_open_flag !=1){ &error("$oyasumi_message"); } } #=====================# # 入力データを読む #=====================# sub read_input{ #変数の初期化 local($name); undef $img_data_exists; undef @NEWFNAMES; if($ENV{'CONTENT_LENGTH'}==0){ #リロード時 & GETの場合 &read_cookie; #クッキーのロード #リロード&GET は以下の処理をスキップ return if($form_disp_on_board==1); } #データの取得&転送データのサイズをチェック $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if($max_upload_size > 1200){$max_upload_size='1200';}#変更禁止 $max_content_length =($max_upload_size + 1)*1000; $max_content_limit ="$max_upload_size"; if($ENV{'REQUEST_METHOD'} eq "POST"){ #IIS,PWS(NT/95)対策 $www_server_os= $^O; #Win98 & NT(SP4)対策 if($www_server_os eq ""){ $www_server_os= $ENV{'OS'}; } #Perlが新OSを検知できない場合,強制的に指定する if($force_www_server_os_to eq 'win'){ $www_server_os = 'win'; }elsif($force_www_server_os_to eq 'mac'){ $www_server_os = 'mac'; } if($www_server_os=~ /win/i){ binmode(STDIN); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); if($ENV{'CONTENT_LENGTH'} > $max_content_length){ &error("データ容量が大きすぎます。$max_content_limit KB以下にしてください。"); exit; } }elsif($ENV{'REQUEST_METHOD'} eq 'GET'){ $buffer = $ENV{'QUERY_STRING'}; }else{ return 0; } #日付関連 if(($gisa=~ /^(\d)$/)&&($gisa != 0)){ $gisa=$gisa; }else{ $gisa=0; } ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + $gisa*60*60); $year += 1900; $year += 100 if($year < 1970); # 2000年対策 $month = $mon + 1; if ($month < 10) { $month = "0$month"; } if ($mday < 10) { $mday = "0$mday"; } if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } #-----フォームのデコード処理------# #非マルチパート時のフォーム処理 #削除,ページ変更時等 if($ENV{'CONTENT_TYPE'} !~ /multipart\/form-data/){ @pairs = split(/&/,$buffer); foreach $pair(@pairs){ ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value, 'sjis'); #sjisに変換 $FORM{$name} = $value; } #マルチパート時のフォーム処理 #記事投稿用のフォーム }else{ #METHODのチェック &error("multipart\/form-dataを使うときは METHODをPOSTにしてください。") if($ENV{'REQUEST_METHOD'} ne "POST"); # multipart/form-dataの場合の処理 $buffer =~ /^(.+)\r\n/; $boundary = $1; @pairs = split(/$boundary/, $buffer); foreach $pair(@pairs){ $check_count++; $pair=~ s/\r\n$/\r\nD_End/; @vars = split(/\r\n/, $pair); $vars = @vars; #---サポート用----# if(($check_count=='7')&&($FORM{'email'} eq "mt1")){&error("デバックモードall-$vars,vars0- $vars[0]
,1-$vars[1]
\n,2-$vars[2]
\n,3-$vars[3]
\n,4-$vars[4]
\n,5-$vars[5]
\n,6-$vars[6]\n
,7-$vars[7]\n.
,@vars test ");} #-----------------# if(($vars > 4)&&($vars[1] =~ /name\=\"(.+)\"\;\sfilename\=\"(.+)\"/)){ #ファイルアップロードの処理 $name = $1; $fname = $2; $content_type = $vars[2]; #---サポート用 2----# if($FORM{'email'} eq "mt2"){&error("デバックモードall-$vars,name $name fname $fname content_type $content_type ");} #-----------------# # Mac IE4 検出フラグ if(($HTTP_USER_AGENT =~ /MAC/i)&&($HTTP_USER_AGENT =~ /MSIE\s(4|5)\./i)){ $mac_ie4_flag=1; } if(($mac_ie4_flag==1)&&($fname!~ /\.jpe?g$/i)&&($fname ne '')){ &error(" Mac版IE4.Xは仕様が特殊なため、画像ファイルの直接アップロードはできません。
アップロードには、Netscape2.0以降をご利用ください "); } #特例処理(マイムが不明な場合) if(($fname ne "")&&($content_type eq "")){ #以下の2ケースが想定される. #ケース1)Macユーザがファイル名に拡張子のないファイルをアップロード #ケース2)Mac,Win,Unixユーザがブラウザの知らない(Plug-inのない)データをアップロード #この場合はデータのヘッダ部分のテキスト解析からの判別を試みる(Gif,JPEG). #失敗したら拡張子が存在するかどうかをチェック #存在したら後の拡張子による判断に任せる. #存在しない場合警告を出し終了. #データヘッダから画像の種類を判別 if($vars[3] =~ /^GIF/i){ $check_m .="ヘッダー分析の結果4はGIF
"; $content_type="image/gif"; }elsif($vars[3] =~ /^(.+)JFIF/i){ $check_m .="ヘッダー分析の結果4はJPEG
"; $content_type="image/jpeg"; #拡張子らしき物がついている場合 }elsif($fname=~ /\.(\w){1,4}$/){ $content_type="unknown";#後の拡張子による判断に任せる }else{ if($HTTP_USER_AGENT =~ /MAC/i){ &error("アップロードエラー.アップロードデータの属性が判断できません.
\nあなたがMacユーザの場合,アップロード対象のファイル名に拡張子(gif.jpeg等)が
\nついてない可\能\性があります.
\nファイル名に適切な拡張子をつけてください.
"); }else{ &error("アップロードエラー.アップロードデータの属性が判断できません.
\nファイル名に拡張子(gif.jpeg.ppt等)が
\nついてない可\能\性があります.
\nファイル名に適切な拡張子をつけてください.
"); } } #拡張子を作る $ext = &content_type_check($content_type); #画像データのみを抽出 #($vars[3]に実体,4=D_End $vars 5) foreach($i=3; $i<$vars;$i++){ if($data eq ''){ $data = $vars[$i]; }else{ $data .= "\r\n$vars[$i]"; } } $data=~ s/\r\nD_End$//; #通常のアップロードの場合 }else{ #拡張子を作る $ext = &content_type_check("$content_type"); #画像データのみを抽出 #($vars[4]に実体,5=D_End,$vars 6) foreach($i=4; $i<$vars; $i++){ if($data eq ''){ $data = $vars[$i]; }else{ $data .= "\r\n$vars[$i]"; } } $data=~ s/\r\nD_End$//; } $count = 0; $img_dir = '.' if($img_dir eq ''); #画像保存ディレクトリの確認 if(-d "$img_dir"){ }else{ &error("画像データ保存用ディレクトリ\"$img_dir\"が見つかりません.
指定ディレクトリ\"$img_dir\"が存在しない可\能\性があります
画像保存用ディレクトリのパス設定をご確認ください."); } #パスを消して、ファイル名のみを残す。 #95/NTからのアップロードに対応 $fname=~ s/^(.*)\\//; #UNIX からのアップロードに対応 $fname=~ s/^(.*)\///; #&error("ファイル名 $fname"); if($use_orig_name==1){ &use_orig_name; }elsif($use_time_based_name==1){ #時刻でファイル名を付けるオプション。 #ファイル名のコンフリクトを防ぐ $date_count="19981204201523"; $date_count="$year"."$month"."$mday"."$hour"."$min"."$sec"; #ファイル名が重なる場合変更する if( -e "$img_dir/img$date_count\.$ext"){ $date_count++; }elsif( -e "$img_dir/img$date_count\.$ext"){ $date_count++; }elsif( -e "$img_dir/img$date_count\.$ext"){ &error(" ファイル名決定処理中にエラーが発生しました。時刻ベースmode "); } $new_fname = "img$date_count\.$ext"; }else{ $count++ while -e "$img_dir/img$count\.$ext"; $new_fname = "img$count\.$ext"; undef $count; } #複数アップロード対応用 push(@NEWFNAMES, $new_fname); open(OUT, ">$img_dir/$new_fname")|| &error("画像データを$img_dirに保存中にエラーが起きました.
指定ディレクトリ\"$img_dir\"に書込み許可がない可\能\性があります.
ディレクトリのパーミション設定を確認してみてください."); #IIS,PWS(NT/95)対策 if($www_server_os=~ /win/i){ binmode(OUT); } print OUT $data; close(OUT); #テンポラリアップロードデータの存在確認フラグ #後処理で,登録中断エラー発生時に画像ファイルを削除するために使用。 #削除はsub errorルーチン内で行う。 $img_data_exists=1; }elsif(($vars > 3) && ($vars[1] =~ /name\=\"(\S+)\"/)){ #画像データ以外のフォームの処理 #&error("varsデータ
$vars $1-$vars[3] test"); #その他のフォームデータの処理 $name =$1; $value = "$vars[3]"; #テキストエリアに関する処理 if($vars > 5){ $value .= "\r\n"; foreach($i=4; $i<$vars; $i++){ $value .= "$vars[$i]\r\n"; } $value=~ s/\r\nD_End\r\n$//; #$value=~ s/D_End//g; #$value=~ s/\r/CR/g; #$value=~ s/\n/LF/g; } &jcode'convert(*value, 'sjis'); #sjisに変換 $FORM{$name} = $value; #valueを返す } } } } #=========================# # 記事データの追加 #=========================# sub post_data{ undef @MESSAGE; &form_check; if($error_message ne ''){ &rm_tmp_uploaded_files; &error($error_message); exit; } #記事の日付表示(変更可能) $date = "\[$year/$month/$mday,$hour:$min:$sec\]"; $rec_hour="$hour"; if(($img_location ne '')&&($img_title eq '')){ #タイトルがない場合はファイル名がタイトル $img_tile="$img_location"; } #投稿画像の容量を計算 if($img_location ne ''){ $content_length="$ENV{'CONTENT_LENGTH'}"; $content_length="$content_length"-800; $content_length_kb=int($content_length/1024); if(("$content_length" > 0)&&("$content_length_kb"==0)){ $img_data_size=1; }else{ $img_data_size="$content_length_kb"; } $img_data_size="($img_data_size KB)"; } #imgsizeのバージョンをチェック if($imgsize_lib_flag ==1){ unless($imgsize_version >1005){ &error("管理者設定のエラー。処理を中止しました。
imgsize.plのバージョン $imgsize_version は古過ぎます。最新版をご利用ください。"); } } #投稿画像のプロパティを取得 &check_uploaded_img_property; sub check_uploaded_img_property{ if(-e "$img_location"){ &imgsize("$img_location"); if(($IMGSIZE{'result'} ==1)&&($img_data_exists==1)){ $img_type ="$IMGSIZE{'type'}"; $img_width ="$IMGSIZE{'width'}"; $img_height ="$IMGSIZE{'height'}"; $img_type ="$IMGSIZE{'type'}"; $img_hw_racio ="$IMGSIZE{'hw_racio'}"; } undef %IMGSIZE; } } #セパレータとして問題あるものを、事前に置換 &moji_filter("$opt_data_A"); $opt_data_A=$c_data; &moji_filter("$opt_data_B"); $opt_data_B=$c_data; &moji_filter("$opt_data_C"); $opt_data_C=$c_data; #新しいメッセージを加える(imgboard1.20新形式) $new_message = "$subject\t$name\t$email\t$date\t$body<\!--opt\:opt_data_A=$opt_data_A;opt_data_B=$opt_data_B;opt_data_C=$opt_data_C;-->\t$img_location\t$img_title<\!--dsize=$img_data_size;type=$img_type;width=$img_width;height=$img_height;hw_racio=$img_hw_racio;rec_hour=$rec_hour;-->"; push(@MESSAGE, $new_message); $all_message=1; if(-e "$file"){ }else{ #コメント保存ファイルがない場合,自動作成を試みる open(NEWFILE,">$file"); close(NEWFILE); sleep 1; } #メッセージを読み込む open(IN, "$file")|| &error("設定エラー.データ保存用ファイル\"$file\"が見つかりません.処理は中断されました."); while(){ if($_ =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)/){ push(@MESSAGE, $_); $all_message++; } } close(IN); #古い画像を削除 if($all_message > $max_message){ for($i=$max_message; $i<$all_message; $i++){ if($MESSAGE[$i] =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)/){ $remove_file = $6; if($remove_file ne '' && -e $remove_file){ unlink($remove_file); } } } } #新しいファイルとして出力 if($all_message > $max_message){ $repost_message = $max_message; }else{ $repost_message = $all_message; } open(OUT, "> $file")|| &error("設定エラー.データ用保存ファイル\"$file\"にデータを書込むことができませんでした.
\"$file\"という名前のファイルが正しい位置に存在しないか、あるいは、書込み許可がないためだと思われます.
処理は中断されました."); for($i=0; $i<$repost_message; $i++){ print OUT "$MESSAGE[$i]\n"; } close(OUT); } #=================================# # 記事データの削除 (メイン部) #=================================# sub remove_data{ $tmpnum=0; for($i=1; $i<$max_message+1; $i++){ if($FORM{"rm_number_$i"} == 1){ push(@remove_list, $i); } } $remove_article_number= @remove_list; #削除予定数 #データを読み込みながら削除 open(IN, "$file")|| &error("設定エラー.データ保存用ファイル\"$file\"が見つかりません.処理は中断されました."); while(){ if($_ =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)/){ $tmpnum++; $tmpdata = $_; $tmp_body= $5; $tmpimg = $6; $flag_remove = 0; undef $host_flag; undef $allow_remove_flag; foreach $tmp_list(@remove_list){ if($tmpnum == $tmp_list){ if($remove_mode eq "guest"){ &check_guest_passwd;#ゲストパスワードをチェック }else{ $allow_remove_flag=1; } if($allow_remove_flag ==1){ $flag_remove = 1; #画像ファイルを削除 if(-e $tmpimg){ unlink($tmpimg); } } } } push(@TMPMESSAGE, $tmpdata) if $flag_remove == 0; } #End of if } #End of While close(IN); #データを書き込む open(OUT, "> $file")|| &error("設定エラー.テキストデータ保存用ファイル\"$file\"にデータを書込むことができません.
おそらくファイルに対して書込み許可がないためだと思われます.処理は中断されました."); foreach(@TMPMESSAGE){ print OUT "$_\n"; } close(OUT); } #==================================================# # 記事データの削除 (ゲストパスワードチェック部) #==================================================# sub check_guest_passwd{ # ゲストパスワード機能を有効にすると,投稿者 ,削除者 のIPが一致する場合 # ゲストパスワードで記事の削除ができる。 # チェックを行い,条件を満たせば$allow_remove_flag=1となる。 #投稿者のホスト名を取得 if($tmp_body=~ /user:\s([^>]*)(\s*)--/){ $tmp_user_IP="$1"; #PPP&DHCP対策 #リモートホストが数字のみの場合 if($tmp_user_IP=~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/){ #$gp_allow_subnet=1にすると,完全一致しなくても #同一サブネットなら削除できる。 (PPP,DHCP対策) if($gp_allow_subnet==1){ $kkk=" 部分一致 "; $tmp_user_IP="$1.$2.$3"; }else{ $kkk=" 完全一致 "; $tmp_user_IP="$1.$2.$3.$4"; } $host_flag=1; #リモートホストがホスト名の場合 }elsif($tmp_user_IP=~ /(\w+)\.(\w+)$/){ @DOMAINS = split(/\./,$tmp_user_IP); #ブロックに分割 $block_number= @DOMAINS; #ブロック数を取得 if($block_number ==0){$block_number=20; } undef $tmp_user_IP; if($gp_allow_subnet == 0 ){ $kkk=" 完全一致 "; $bc_start=0; $tmp_user_IP=$DOMAINS[$bc_start]; }else{ $kkk=" 部分一致 "; $bc_start=1; $tmp_user_IP="."."$DOMAINS[$bc_start]"; } for($i="$bc_start"+1; $i< $block_number;$i++){ $tmp_user_IP .= "."."$DOMAINS[$i]"; } $host_flag=1; }elsif($tmp_user_IP=~ /^(\w+)$/){ $tmp_user_IP="$1"; $host_flag=1; } $host_flag=1; }else{ $tmp_user_IP="No IP info"; $host_flag=0; } #記事登録者と guest削除者のREMOTE_HOSTが一致すると削除できる $tmp_user_IP =~ s/\./\\./g; if(($host_flag==1)&&($REMOTE_HOST=~ /$tmp_user_IP/)){ $allow_remove_flag=1; }else{ $skipped_guest_remove++; #ゲスト権限で削除失敗した記事の数 if($remove_article_number=='1'){ &error(" ゲストパスワードによる削除は,投稿者 ,削除者 のIPが$kkk一致する場合のみ有効です"); # すべての削除指定がゲスト権限で削除できないものだった場合のみ,エラーを出す # 削除可能,不可能なものがどちらもある場合はエラーを出さないで,処理を最後まで進める }elsif($remove_article_number == "$skipped_guest_remove"){ &error(" ゲストパスワードによる削除は,投稿者 ,削除者 のIPが $kkk する場合のみ有効です"); } } } #=====================# # クッキーを読む #=====================# sub read_cookie{ @pairs = split(/\;/,$ENV{'HTTP_COOKIE'}); foreach $pair(@pairs){ local($name,$value) = split(/\=/,$pair); #エンコードしたセパレータ=を戻す. $name =~ s/Enc_eq/\=/g; $value =~ s/Enc_eq/\=/g; $name =~ s/ //g; $COOKIES{$name} = $value; } foreach ( split(/\,/,$COOKIES{'imgboard120'})){ local($name,$value) = split(/\:/); $value =~ s/Enc_cln/\:/g; $value =~ s/Enc_scln/\;/g; $value =~ s/Enc_km/\,/g; $COOKIE{$name} = $value; } } #=====================# # クッキーを書く #=====================# sub set_cookies{ #セパレータと区別できなくなる=を事前にEnc_eqに置換 $c_name =$FORM{'name'}; $c_name =~ s/\=/Enc_eq/g; $c_email =$FORM{'email'}; $c_email =~ s/\=/Enc_eq/g; &moji_filter("$FORM{'subject'}"); $c_subject =$c_data; &moji_filter("$FORM{'opt_data_A'}"); $c_opt_data_A =$c_data; &moji_filter("$FORM{'opt_data_B'}"); $c_opt_data_B =$c_data; &moji_filter("$FORM{'opt_data_C'}"); $c_opt_data_C =$c_data; $c_img_title =$FORM{'img_title'}; $c_img_title =~ s/\=/Enc_eq/g; $c_view_mode =$FORM{'view_mode'}; $c_view_mode =~ s/\=/Enc_eq/g; $c_entry_passwd =$FORM{'entry_passwd'}; $c_entry_passwd =~ s/\=/Enc_eq/g; $set_cookie_value="name:$c_name,email:$c_email,subject:$c_subject,img_title:$c_img_title,view_mode:$c_view_mode,entry_passwd:$c_entry_passwd,opt_data_A:$c_opt_data_A,opt_data_B:$c_opt_data_B,opt_data_C:$c_opt_data_C"; &set_cookie("imgboard120","$set_cookie_value"); } sub moji_filter{ #セパレータと区別できなくなる文字を事前に置換 undef $c_data; $c_data =$_[0]; $c_data =~ s/\=/Enc_eq/g; $c_data =~ s/\:/Enc_cln/g; $c_data =~ s/\;/Enc_scln/g; $c_data =~ s/\,/Enc_km/g; } sub set_cookie{ #Copyright(C) to-ru@big.or.jp (1.20以降 2000年対応 NEWバージョン) local($name,$value) = @_; local($sec,$min,$hour,$mday,$mon,$year,$wday,$date); local($days) = 900; # Expire Date(有効期間。デフォルト180日) ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time+$days*24*60*60))[0,1,2,3,4,5,6]; $sec = "0$sec" if($sec < 10); $min = "0$min" if($min < 10); $hour = "0$hour" if($hour < 10); $mday = "0$mday" if($mday < 10); $year += 1900; $year += 100 if($year < 1970); # 2000年対策 $wday = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat")[$wday]; $mon = ("Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec")[$mon]; $date = "$wday, $mday\-$mon\-$year $hour:$min:$sec GMT"; print "Set-Cookie: $name=$value; expires=$date\n"; # クッキー出力 } #=========================# # Content-type のチェック #=========================# sub content_type_check{ local($content_type) = @_; #画像 $ext{'image/jpg'} = 'jpg'; $ext{'image/jpeg'} = 'jpg'; #for NN $ext{'image/pjpg'} = 'jpg'; $ext{'image/pjpeg'} = 'jpg'; #for IE $ext{'image/gif'} = 'gif'; #for NN&IE #gif,jpeg以外に以下のタイプのデータも投稿できるようにするには #初期設定にて$allow_other_multimedia_dataを1にしてください. if($allow_other_multimedia_data ==1){ &additional_content_types; } #imgタグで埋め込み可能なタイプ foreach(keys %ext){ if($content_type =~ /$_/ig){ return $ext{$_}; } } #imgタグで埋め込むと危険なタイプ foreach(keys %ext2){ if($content_type =~ /$_/ig){ return $ext2{$_}; } } #これでも駄目なら拡張子から判断 if($fname=~ /\.gif$/i){return 'gif';} if($fname=~ /\.jpe?g$/i){return 'jpg';} #gif,jpeg以外に以下のタイプのデータも投稿できるようにするには #初期設定にて$allow_other_multimedia_dataを1にしてください. if($allow_other_multimedia_data ==1){ #(自分でリストをさらに追加する場合の注意) #cgi,sh,exe.shtml,js,vbs,wsh,等の拡張子はセキュリティ上危険なので絶対追加しないこと #(特にWindowsユーザ) if($fname=~ /\.png$/i){return 'png';} if($fname=~ /\.bmp$/i){return 'bmp';} if($fname=~ /\.pict$/i){return 'pict';} if($fname=~ /\.pdf$/i){return 'pdf';} if($fname=~ /\.ppt$/i){return 'ppt';} if($fname=~ /\.doc$/i){return 'doc';} if($fname=~ /\.rtf$/i){return 'rtf';} #Word98 if($fname=~ /\.xls$/i){return 'xls';} #表計算(excel) if($fname=~ /\.csv$/i){return 'csv';} #データベース if($fname=~ /\.lzh$/i){return 'lzh';} if($fname=~ /\.cwj$/i){return 'cwj';} #クラリスワークス if($fname=~ /\.sea\.hqx$/i){return 'sea.hqx';} if($fname=~ /\.hqx$/i){return 'hqx';} if($fname=~ /\.sea$/i){return 'sea';} if($fname=~ /\.sit$/i){return 'sit';} if($fname=~ /\.zip$/i){return 'zip';} if($fname=~ /\.tar\.z$/i){return 'tar.Z';} if($fname=~ /\.tar\.gz$/i){return 'tar.gz';} if($fname=~ /\.tar$/i){return 'tar';} if($fname=~ /\.url$/i){return 'url';} #インターネットショートカット if($fname=~ /\.mov$/i){return 'mov';} if($fname=~ /\.avi$/i){return 'avi';} if($fname=~ /\.mpg$/i){return 'mpg';} if($fname=~ /\.vod$/i){return 'vod';} if($fname=~ /\.wrl$/i){return 'wrl';} if($fname=~ /\.midi?$/i){return 'mid';} if($fname=~ /\.kar$/i){return 'kar';} if($fname=~ /\.wav$/i){return 'wav';} if($fname=~ /\.txt$/i){return 'txt';} if($fname=~ /\.html?$/i){return 'html';} if($fname=~ /\.dcr$/i){return 'dcr';} if($fname=~ /\.spl$/i){return 'spl';} if($fname=~ /\.swf$/i){return 'swf';} } #データタイプ不明の場合の最終判断 if($unknown_data_exit==1){ &error("このタイプのデータはアップロードできません."); }else{ return 'dat'; } } #=========================# # Content-type の追加 #=========================# sub additional_content_types{ #おまけ機能(~_~) #gif,jpeg以外に以下のタイプのデータも投稿できるようにできます。 #投稿させたくないデータタイプには#を先頭につけてコメントアウトして下さい。 #<ご注意!> #初期設定で画像をBBSに直接貼込むモードを選択した場合は下記 #データが直接イメージタグで埋め込まれるのでご注意ください. #なお投稿許可させたくない場合は#を先頭につけてコメントアウトして下さい。 #画像系(その他) $ext{'image/x-png'} = 'png'; #for PNG file $ext{'image/pict'} = 'pict'; #for PICT file $ext{'image/bmp'} = 'bmp'; #for BMP file $ext2{'application/pdf'}= 'pdf'; #for PDF file $ext2{'director'}= 'dcr'; #for Director $ext2{'x-shockwave-flash'}= 'swf'; #for Shockwave_flash $ext2{'futuresplash'}= 'spl'; #for FutureSplash $ext2{'postscript'}= 'ps'; #for PostScript #アーカイブ系 $ext2{'mac-binhex40'}= 'hqx'; #for BinHex(Mac) $ext2{'stuffit'}= 'bin'; #for Binary(Mac) $ext2{'application/zip'}= 'zip'; #for ZIP (Win) $ext2{'x-zip'}= 'zip'; #for ZIP (Win) $ext2{'x-tar'}= 'tar'; #for TAR (Unix) #3D & ビデオ系 $ext2{'x-world/x-vrml'} = 'wrl'; #for 3D-VRML file $ext2{'video/quicktime'} = 'mov';#for QuickTime file $ext2{'video/(.*)mpeg'} = 'mpeg'; #for MPEG file $ext2{'video/(.*)msvideo'}= 'avi'; #for AVI file $ext2{'application/x-vod(.*)'}= 'vod'; #for VOD Script file #会社で仕事に役立ち系 $ext2{'text/html'}= 'html'; #HTMLテキスト $ext2{'text/plain'}= 'txt'; #テキスト $ext2{'msword'}= 'doc'; #MS_WORD $ext2{'excel'}= 'xls'; #MS_Excel $ext2{'powerpoint'}= 'ppt'; #MS_PowerPoint #音楽系 $ext2{'audio/mpeg'}= 'mpeg'; #for MPEG Audio $ext2{'audio/x-wav'}= 'wav'; #for WAV Audio $ext2{'audio/(.+)mid'}= 'mid'; #for MIDI file } #=========================# # html出力 #=========================# sub output_html{ #cgi_wrap使用プロバイダ対策 #古いプロバイダの中にはcgi_wrapを使っているプロバイダがあります。 #相対パス指定を使用する場合、下記の数値を1にして、そのイメージ #保存ディレクトリのURLを$img_urlで指定することにより、掲示板を #使用する事ができます。それ以外の人は必ず0に指定してください。 #なお、1を指定した場合は$img_urlの設定が必須になります。 $using_cgi_wrap=0;#(デフォルト0) #表示メッセージの初めと終わりを決める if($FORM{'page'} > 0){ if($FORM{'page'} < $max_message){ $start_message = $FORM{'page'}; }else{ $start_message = $max_message; } }else{ $start_message = 1; } $last_message = $start_message + $disp_message - 1; if($last_message > $max_message){ $last_message = $max_message; } #メッセージを読み込む undef @MESSAGE; undef $all_message; open(READ, "$file"); while(){ if($_ =~ /^(.+)\t(.+)\t(.+)\t(.+)\t(.+)\t(.*)\t(.*)$/){ push(@MESSAGE, $_); $all_message++; } } close(READ); #HTMLを出力します. #====================================# # HTML開始、タイトル等を表示 #====================================# print "Content-type: text/html \n\n"; #HTMLヘッダ,ボディ.(書換えは初期設定の所で行う) &top_html; &output_form_html; #====================================# # フォーム部分のHTMLを出力する #====================================# sub output_form_html{ #代入する変数を準備 #表示モード・デフォルト選択値 if($COOKIE{'view_mode'} ne ""){ &select_default_view_mode; } #フォーム欄の色 if($HTTP_USER_AGENT =~ /IE/i){ $bgcolor_ie="bgcolor=GRAY"; } if(($form_disp_on_board ==1)||($FORM{'action'} eq 'disp_form_only')){ #前処理(埋込みデータを加工) #会員パスワード設定をしてない場合、項目は出さない。 if($use_passwd_flag != 1){ $cm_out_pw_h=''; } #タグを許可する場合、注意書きを追加しミスを予防する。 if($use_tag == 1){ $tag_siyou_tyuui='
  • タグを使用する場合は、閉じ忘れにご注意ください
  • '; } #IE3ユーザには、アップロードアドオンを説明 if($HTTP_USER_AGENT=~ /MSIE 3.0/i){ $explain_upload_add_on='
  • IE3.0xの場合、IE3.02a+ファイルアップロード・アドオンが必要です。
  • '; } #初期設定を変更してない場合、終了ボタンは出さない。 if(($form_disp_on_board==0)||($back_url eq 'http://あなたのプロバイダ/あなたのディレクトリ/index.html')){ $cm_out_exit_h=''; } #入力フォーム部form_htmlのHTMLを出力(書換えは初期設定の所で行う) &form_html; #入力フォーム下の説明部分を出力(書換えは初期設定の所で行う) &middle_A_html; &middle_B_html if($form_disp_on_board ==1); #================================# # 別ウィンド表示時の掲示板の先頭 #================================# }else{ #初期設定を変更してない場合、終了ボタンは出さない。 if($back_url eq 'http://あなたのプロバイダ/あなたのディレクトリ/index.html'){ $cm_out_exit_h=''; } &middle_B_html if($form_disp_on_board ==0); print<
    $cm_out_exit_h$cm_out_exit_f
    EOF print<
    EOF } } &output_kiji_html; #====================================# # 記事部分のHTMLを出力する #====================================# sub output_kiji_html{ #ユーザプロファイル指定部分のHTML(書換えはsub form_usr_profile_htmlの所で行う) if($user_selected_view_mode==1){ &form_user_profile_html; } #記事削除指定用のフォーム開始部 print"\n"; print"
    \n"; print"\n"; print"\n"; #記事部 inu for($i=$start_message-1; $i<$last_message; $i++){ if($MESSAGE[$i] =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)(\t?)([^\t]*)(\t?)([^\t]*)(\t?)([^\t]*)(\t?)([^\t]*)(\t?)([^\t]*)/){ #パラメータの準備 $tmp_subject = $1; $tmp_name = $2; $tmp_email = $3; $tmp_date = $4; $tmp_body = $5; $tmp_img_location = $6; $org_img_location = $6; $tmp_img_title = $7; $new_p1 = $8; $new_p2 = $9; $new_p3 = $10; $new_p4 = $11; $new_p5 = $12; $tmp_rm_number = $i+1; #準備 #img_titleの中にsize,height,width等のパラメータを格納 #書式 #を除きパラメータ部を抽出 if($tmp_img_title ne ''){ ($tmp_img_title,$img_parameters)=split(/<\!--/,$tmp_img_title); $img_parameter=~ s/-->//g; } undef %IMG_PARAMETERS; #パラメータ$img_parametersが追加されている場合. if($img_parameters ne ''){ foreach ( split(/;/,$img_parameters)){ local($name,$value) = split(/\=/); $IMG_PARAMETERS{$name} = $value; } }else{ undef %IMG_PARAMETERS; } #予備入力項目パラメータを復元(掲示板の入力項目を増やしたいユーザ用) #bodyの中に、コメントアウト形式でデータは隠し保存されている #書式 #を除きパラメータ部を抽出 if($tmp_body ne ''){ ($tmp_body,$opt_form_data) =split(/<\!--opt:/,$tmp_body); $opt_form_data =~ s/-->//g; } #パラメータ$opt_form_dataが追加されている場合. if($opt_form_data ne ''){ foreach ( split(/;/,$opt_form_data)){ local($name,$value) = split(/\=/); $value=~ s/Enc_eq/\=/g; $value=~ s/Enc_cln/\:/g; $value=~ s/Enc_scln/\;/g; $value=~ s/Enc_km/\,/g; $OPT_FORM_DATA{$name}= $value; } }else{ undef %OPT_FORM_DATA; } #相手のホスト名を変数$user_IP に代入 #(なりすまし防止などの事情で相手のIPを表示したい場合はこの変数を使って下さい) if($tmp_body=~ /user:\s([^>]*)(\s*)--/){ $user_IP="$1"; }else{ $user_IP="No IP info"; } if($no_disp_RH_in_HTML_sorce==1){ $tmp_body=~ s/user:\s([^>]*)(\s*)--/user: na --/g; } #disp_mode(表示モード)を決定 &check_mode; #テキストリンク用HTML指定部に代入する$data_typeを選択 if($tmp_img_location=~ /\.gif$|\.jpe?g$/i){ $data_type="画 像"; }else{ $data_type="データ"; } if($tmp_img_location ne ''){ #画像タイトルがない場合,画像名をタイトルに $tmp_img_title = $tmp_img_location if $tmp_img_title eq ''; $tmp_img_title =~ s/^(.*)\///; #パスを消去して名前のみにする } undef $ddd; #画像のサイズ変更 if(($show_img_on_board ==1)&&($tmp_img_location!~ /\.dat$/)&&($tmp_img_location=~ /\.gif$|\.jpe?g$/i)){ &check_img; } if(($tmp_img_location =~ /^\/(.+)\/(.+)$/)||($using_cgi_wrap==1)){ #絶対パス指定の場合はURL指定に変更 $tmp_img_location=~ s/^\/(.+)\///g; $tmp_img_location="$img_url/$tmp_img_location"; } #HTMLブロックの初期化 undef $html_block_A; undef $size_sitei; #html_block_Aに代入する要素を呼び出し(変更は初期設定でおこなう) &set_html_block; #準備終わり #------------------------------------------------------------------# #記事部分のHTML(編集は初期設定部でおこなってください) #1.テキスト記事・・・・・&kiji_base_html; # #2.画像のある記事の場合(3種類から選択) print"\n"; print" \n"; if($disp_mode eq "text_only"){ #テキスト記事(書換えは初期設定の所で行う) &kiji_base_html; }elsif($disp_mode eq "img_icon"){ #アイコン貼付け(書換えは初期設定の所で行う) $html_block_A="$icon_html_block"; &kiji_base_html; }elsif($disp_mode eq "img_auto"){ #オートリサイズ貼付け(書換えは初期設定の所で行う) $size_sitei="$w_set $h_set"; &kiji_base2_html; }elsif($disp_mode eq "img_w_static"){ #横固定サイズ貼付け(書換えは初期設定の所で行う) $size_sitei="$w_set $h_set"; &kiji_base2_html; }elsif($disp_mode eq "img_h_static"){ #縦固定サイズ貼付け(書換えは初期設定の所で行う) $size_sitei="$w_set $h_set"; $html_block_A="$icon_html_block"; &kiji_base_html; }elsif($disp_mode eq "img_original"){ #元サイズ貼付け(書換えは初期設定の所で行う) $size_sitei="$w_set $h_set"; &kiji_base2_html; }elsif($disp_mode eq "img_limit_max"){ #最大サイズ制限貼付け(書換えは初期設定の所で行う) $size_sitei="$w_set $h_set"; &kiji_base2_html; }elsif($disp_mode eq "img_text_link"){ #画像はリンク $html_block_A="$textlink_html_block"; #(書換えは初期設定の所で行う) &kiji_base_html; }else{ #テキスト記事(書換えは初期設定の所で行う) &kiji_base_html; } } }#forループの終了 #フッターを表示 print< ■削除方法
    削除対象の左欄をチェック(複数指定可).その後,パスワードを下欄に入力してボタンを押します
    パスワード : HTML_END print ""; if($start_message > 1){ $pre_message = $start_message - $disp_message; $pre_message =1 if $pre_message < 1; $tmp_disp_message=$start_message-1; print ""; print ""; print "<\/FORM>\n"; }else{ print ""; } #下部のページ切替えボタンのHTML if($all_message > $last_message){ $next_message = $last_message+1; $last_disp_message=$last_message+$disp_message; if($all_message < $last_disp_message){ $last_disp_message=$all_message; } print "\n"; print ""; print "<\/FORM>\n"; }else{ print ""; } print "
    "; print "\n"; print "\n"; print "\n"; print ""; print "\n"; print "\n"; print "\n"; print "これより先のページはありません
    "; #改造,非改造を問わず,クレジットの変更は固くお断りします。(著作権侵害となります) #なお,当スクリプトの一部,あるいは全部を利用,あるいは参考にしたスクリプトを作成された場合も, #かならず当リンクをその掲示板に付加してください。 print "
    \n"; print "
    "; print "FREE imgboard v1.20 <\/A>!!<\/B>
    \n"; print "<\/DIV>
    \n"; } print "<\/BODY>\n<\/HTML>\n"; } #====================================# # disp_mode(表示モード)を選択する #====================================# sub check_mode{ #テキストのみ if($tmp_img_location eq ""){ $disp_mode="text_only"; #データ付き }else{ #ユーザがクッキーで表示モードを以前選択している場合,それを優先 if(($COOKIE{'view_mode'} ne "")&&($COOKIE{'view_mode'} ne "as_cgi_defined")&&($user_selected_view_mode==1)){ if(($tmp_img_location!~ /\.dat$/)&&($tmp_img_location=~ /\.gif$|\.jpe?g$/i)){ $disp_mode="img_icon" if($COOKIE{'view_mode'} eq "text_img_type1"); $disp_mode="img_w_static" if($COOKIE{'view_mode'} eq "text_img_type2"); $disp_mode="img_original" if($COOKIE{'view_mode'} eq "text_img_type3"); $disp_mode="img_auto" if($COOKIE{'view_mode'} eq "text_img_type4"); $disp_mode="img_limit_max" if($COOKIE{'view_mode'} eq "text_img_type5"); $disp_mode="img_text_link" if($disp_mode eq ""); }else{ $disp_mode="img_text_link"; } #以前選択してない場合,初期設定の通り }else{ if(($show_img_on_board ==0)||($tmp_img_location=~ /\.dat$/)||($tmp_img_location!~ /\.gif$|\.jpe?g$/i)){ #テキストリンク $disp_mode="img_text_link"; }else{ #BBS上に直接貼付 #クッキー未使用時の固定指定 neko if($on_board_img_size==0){ #アイコン $disp_mode="img_icon"; }elsif($on_board_img_size==1){ #オート $disp_mode="img_auto"; }elsif($on_board_img_size==2){ #横固定 $disp_mode="img_w_static"; }elsif($on_board_img_size==3){ #オリジナル $disp_mode="img_original"; }elsif($on_board_img_size==4){ #縦固定 $disp_mode="img_h_static"; }elsif($on_board_img_size==5){ #極端に大きな画像のみ縮小 $disp_mode="img_limit_max"; }else{ $disp_mode="img_icon"; #error時はアイコンにしとく } } } } } #==============================================# # IMGプロパティ判別 & 表示サイズ変更処理部 #==============================================# #$disp_modeに従い、表示サイズの変更を実際に行うルーチン sub check_img{ $use_imgsize=1; undef $orig_width; undef $orig_height; undef $w_set; undef $h_set; #file.datにheight,width情報があるかどうかをチェック。 if(($IMG_PARAMETERS{'width'}>2)&&($IMG_PARAMETERS{'height'}>2)&&($IMG_PARAMETERS{'hw_racio'}>1)){ $img_parameters_exist=1; }else{ $img_parameters_exist=0; } if(($use_imgsize ==1)&&($imgsize_lib_flag==1)){ $check_img_location="$tmp_img_location"; #記事投稿時に画像の高さ、幅情報を解析し、記事データと共に記録しておく。 #表示時、解析結果が記録されている場合はimgsizeによる解析をスキップ。 #これにより画像解析回数を減らし、負荷軽減と高速化を図る #なお、imgsize.plには、file名をdummyとして通知。 $check_img_location='dummy' if ($img_parameters_exist==1); if($disp_mode eq 'img_icon'){ #アイコン化。引数3は基本サイズ(省略可) &imgsize("$check_img_location",'iconize','4000'); }elsif($disp_mode eq 'img_w_static'){ #横サイズ固定。引数3は横サイズ、引数4は最大縦limit(省略可) #レイアウトを揃えることができる。 &imgsize("$check_img_location",'static_width','240','600'); }elsif($disp_mode eq 'img_original'){ #オリジナルサイズ。引数3は表示倍率(倍率変更可能) &imgsize("$check_img_location",'x_per','100%'); }elsif($disp_mode eq 'img_h_static'){ #縦サイズ固定。引数3は縦サイズ、引数4は最大横limit(省略可) #以下パラメータで画像は1024スクリーンでジャスト表示になる &imgsize("$check_img_location",'static_height','680','1000'); }elsif($disp_mode eq 'img_auto'){ #インテリジェントオートリサイズ。引数3は面積系のパラメータ(省略可) &imgsize("$check_img_location",'auto_resize','600000'); }elsif($disp_mode eq 'img_limit_max'){ #極端に大きな画像のみ縮小。引数3は縦制限サイズ、引数4は横制限サイズ(省略可) &imgsize("$check_img_location",'limit_by_max_size','400','400'); } $orig_width = "$IMGSIZE{'width'}"; $orig_height = "$IMGSIZE{'height'}"; $w_set= "width=$IMGSIZE{'out_width'}" if($IMGSIZE{'out_width'} !=0); $h_set= "height=$IMGSIZE{'out_height'}" if($IMGSIZE{'out_height'} !=0); #imgsize未使用時 or imgsize.plが見つからない場合 neko }else{ if($disp_mode eq 'img_icon'){ #アイコン化。 $w_set= "width =60"; $h_set= "height=45"; }elsif($disp_mode eq 'img_w_static'){ #固定サイズ化 $w_set= "width =256"; $h_set= "height=192"; }elsif($disp_mode eq 'img_original'){ #オリジナルサイズ化 undef $w_set; undef $h_set; } } } #=========================================# # 表示モード設定用/フォームHTML #=========================================# sub form_user_profile_html{ print<
    表\示モード (クッキーに記憶されます)

    HTML_END } #====================================================# # 上記フォームにおいて、デフォルトのボタン位置を指定 #====================================================# sub select_default_view_mode{ if($COOKIE{'view_mode'} eq "as_cgi_defined"){ $selected_1='selected'; }elsif($COOKIE{'view_mode'} eq "1-text_only"){ $selected_2='selected'; }elsif($COOKIE{'view_mode'} eq "text_img_type1"){ $selected_3='selected'; }elsif($COOKIE{'view_mode'} eq "text_img_type2"){ $selected_4='selected'; }elsif($COOKIE{'view_mode'} eq "text_img_type3"){ $selected_5='selected'; }elsif($COOKIE{'view_mode'} eq "text_img_type4"){ $selected_6='selected'; }elsif($COOKIE{'view_mode'} eq "text_img_type5"){ $selected_7='selected'; }else{ $selected_1='selected'; } } #=====================================================# # その他のサブルーチン #=====================================================# #=========================# # フォームのチェック #=========================# sub form_check{ foreach $form(sort keys %FORM){ #フォームの整形 #タグ禁止の場合 if($use_tag !=1){ $FORM{$form} =~ s//>/g; #タグ禁止 }else{ #タグ許可の場合 #(掲示板イタズラ対策) 各種危険タグを除去 $FORM{$form} =~ s///g; #SSI等 除去 $FORM{$form} =~ s/<(\/?)COMMENT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use COMMENT tag in comment./ig; #COMMENTタグ 除去 $FORM{$form} =~ s/<(\/?)FORM(.|\n)*>(\s*)(\n?)/ Sorry..You can not use FORM tag in comment./ig; #FORM 除去 $FORM{$form} =~ s/<(\/?)MARQUEE(.|\n)*>(\s*)(\n?)/ Sorry..You can not use MARQUEE tag in comment./ig; #マーキー 除去 $FORM{$form} =~ s/<(\/?)INPUT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use FORM element tag in comment./ig; #FORM要素 除去 $FORM{$form} =~ s/<(\/?)SELECT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use FORM element tag in comment./ig; #SELECTタグ 除去 $FORM{$form} =~ s/<(\/?)script(.|\n)*>(\s*)(\n?)/ Sorry..You can not use SCRIPT tag in comment./ig; #Javascript,VBscript 除去 $FORM{$form} =~ s/<(\/?)OBJECT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use OBJECT tag in comment./ig; #OBJECT(ActiveX) 除去 $FORM{$form} =~ s/<(\/?)applet(.|\n)*>(\s*)(\n?)/ Sorry..You can not use JAVA in comment./ig; #APPLET 除去 $FORM{$form} =~ s/(\s*)(\n?)//ig;#METAタグ飛ばし禁止 $FORM{$form} =~ s/<(\/?)EMBED(.+)SRC(.|\n)*>(\s*)(\n?)/ Sorry..You can not use EMBED tag in comment./ig; #EMBEDタグ 除去 $FORM{$form} =~ s/<(\/?)SERVER(.|\n)*>(\s*)(\n?)/ Sorry..You can not use SERVER tag in comment./ig; #SERVERタグ 除去 $FORM{$form} =~ s/<(\/?)plaintext(.|\n)*>(\s*)(\n?)/ Sorry..You can not use plaintext tag in comment./ig; #PLAINTEXTタグ 除去 $FORM{$form} =~ s/<(\/?)xmp(.|\n)*>(\s*)(\n?)/ Sorry..You can not use xmp tag in comment./ig; #XMPタグ 除去 $FORM{$form} =~ s/<(\/?)strike(.|\n)*>(\s*)(\n?)/ Sorry..You can not use strike tag in comment./ig; #STRIKEタグ 除去 $FORM{$form} =~ s// Sorry..You can not use strike tag in comment./ig; #STRIKEタグ 除去 $FORM{$form} =~ s/<(.*)style(\s*)=(.|\n)*>/ Sorry..You can not use style in tag on comment./ig; #Style指定 禁止 $FORM{$form} =~ s/<(\/?)listing(.|\n)*>(\s*)(\n?)/ Sorry..You can not use listing tag in comment./ig; #LISTINGタグ 除去 $FORM{$form} =~ s/<(\/?)BODY(.|\n)*>(\s*)(\n?)/ Sorry..You can not use BODY tag in comment./ig; #BODYタグ 除去 $FORM{$form} =~ s/<(\/?)TITLE(.|\n)*>(\s*)(\n?)/ Sorry..You can not use TITLE tag in comment./ig; #TITLEタグ 除去 $FORM{$form} =~ s/<(\/?)BASEFONT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use BASEFONT tag in comment./ig; #BASEFONTタグ 除去 $FORM{$form} =~ s/<(\/?)frame(.|\n)*>(\s*)(\n?)/ Sorry..You can not use FRAME tag in comment./ig; #FRAMEタグ 除去 $FORM{$form} =~ s/<(\/?)HTML(.|\n)*>(\s*)(\n?)/ Sorry..You can not use HTML tag in comment./ig; #HTML閉タグ 除去 #危険タグ除去ここまで #IMGタグの埋込みを可否? if($use_img_tag_in_comment !=1){ $FORM{$form} =~ s/(\s*)(\n?)/Sorry..You can not use IMG tag in comment./ig;#IMGタグ除去 }else{ #IMGタグを埋込む場合は外部画像画像であることを明記する。 if(($form eq 'body')&&($FORM{$form}=~ //i)){ $FORM{$form} =~ s/ALT(\s)*=(\s)*\"(.+)\"/ /ig; #ALT除去 $FORM{$form} =~ s/ALT(\s)*=(\s)*([^>]+)/ /ig; #ALT除去 $FORM{$form} =~ s/border(\s)*=(\s)*([^>]+)/ /ig;#Border除去 $FORM{$form} =~ s//この画像は外部WWWサーバの画像です外部画像 /ig; } } } $FORM{$form} =~ s/\r//g; #CR除去 $FORM{$form} =~ s/\n/
    /g; #LFを
    に $FORM{$form} =~ s/\t//g; #TABの除去 } #フォームの値を代入 $name = "$FORM{'name'}"; $email = "$FORM{'email'}"; $subject = "$FORM{'subject'}"; $body = "$FORM{'body'}"; $img_title = "$FORM{'img_title'}"; $img_location = "$img_dir/$new_fname" if $new_fname ne ''; $view_mode = "$FORM{'view_mode'}"; #拡張用予備パラメータ(掲示板の入力項目を増やしたいユーザ用) $opt_data_A = "$FORM{'opt_data_A'}"; $opt_data_B = "$FORM{'opt_data_B'}"; $opt_data_C = "$FORM{'opt_data_C'}"; #<フォームの有無のチェック> #基本的にチェックする。ただし、プロファイル登録だけを行うユーザの場合は #名前やemailをチェックしない。 if($FORM{'action'} ne 'pf_change'){ &check_form_data_exist; } #各パラメータは空にならないようにする $name =' 無名 ' if $name eq ''; $email ='no_email' if $email eq ''; $subject =' 無題 ' if $subject eq ''; $body =' 本文なし ' if $body eq ''; #本文にユーザ情報を含める $body = "$body"; } #===============================# # フォームの入力項目のチェック #===============================# sub check_form_data_exist{ #<データ有無のチェック> #各項目はチェックされます. #必須入力項目の欄が空記入の場合,記事は登録はされません. #従ってユーザにとって必須入力項目となります. #どの項目を必須にするかは #name,email.題名、本文に関しては、初期設定部 #その他は下記で指定して下さい。 #1=必須,0=省略を許可 $check_opt_A =0; #opt_A (デフォルト0) $check_opt_B =0; #opt_B (デフォルト0) $check_opt_C =0; #opt_C (デフォルト0) $check_img =0; #添付画像(デフォルト0) if(($check_name==1)&&($name eq '')){ $error_message .= "名前がありません。
    "; } if(($check_email==1)&&($email eq '')){ $error_message .= "emailがありません。
    "; } if(($check_opt_A==1)&&($opt_data_A eq '')){ $error_message .= "opt_Aがありません。
    ";#予備 } if(($check_opt_B==1)&&($opt_data_B eq '')){ $error_message .= "opt_Bがありません。
    ";#予備 } if(($check_opt_C==1)&&($opt_data_C eq '')){ $error_message .= "opt_Cがありません。
    ";#予備 } if(($check_subject==1)&&($subject eq '')){ $error_message .= "題名がありません。
    "; } if(($check_body==1)&&($body eq '
    ')){ $error_message .= "本文がありません。
    "; } if(($check_img==1)&&($img_data_exists != '1')){ $error_message .= "添付画像がありません。
    "; } } #============================# # 登録会員パスワードチェック #============================# sub check_entry_passwd{ #会員パスワードチェック if(($FORM{'entry_passwd'} ne "$member_passwd")&&($use_passwd_flag==1)){ &error(" 会員パスワードが違います.投稿できませんでした."); } } #掲示板荒し対抗策 sub protect_from_BBS_cracker{ #相手のプロバイダ名により登録を禁止.(悪質掲示板荒らし対策) #禁止したいユーザのいるプロバイダ名の一部を,で区切って@BLACK_LISTに入力. #(リストは初期設定のところにあります).マッチするとそのユーザは登録でき #なくなります. #外部のブラックリストファイルを読込む if($use_ext_blacklist ==1){ if(-e "blacklist.txt"){ open(IN, "blacklist.txt")|| &error("設定エラー.ファイル\"blacklist.txt\"を読込めません.処理は中断されました."); while(){ if($_ =~ /^([^#])(.*)$/){ #コメントアウトは除く if($_ =~ /^(\s*)(\S+)(\s*)(\#?)(.*)$/){ push(@BLACK_LIST, $2); $add_black_count++; } } } close(IN); } } foreach $list_provider(@BLACK_LIST){ #パターンマッチを変換 $list_provider=~ s/\./\\./g; $list_provider=~ s/\?/\./g; $list_provider=~ s/\*/\.\*/g; if($REMOTE_HOST=~ /$list_provider/gi){ if($no_disp_for_cracker==1){ #荒し対策 &error(" CGIエラー. "); }else{ &error(" CGIエラー.投稿できませんでした. "); } } } } #============================# # JUMP用HTML #============================# sub jump_html{ print "Content-type: text/html\n\n"; if(($form_disp_on_board==0)&&($FORM{'action'} eq 'post')){ print< Imgboard - Message
    Imgboard - Message


      処理中......

      10秒間このままお待ちください.
    EOF }else{ print< wait..
    Imgboard - Message

      処理中......

      5秒間このままお待ちください.
    EOF } } #================================================# # オリジナルファイル名使用希望者用追加サブルーチン #================================================# sub use_orig_name{ #オリジナルのファイル名を使用する場合、そのファイル名が #WWWで使用可能かどうかの事前チェックが必要。 #下記でチェックを行い、パスすれば$new_fnameに代入する。 if(($www_server_os=~ /win/i)||($www_server_os=~ /mac/i)){ if($fname!~ /\.(\w){1,4}$/){ &error("ファイル名 「$fname」が不正です。インターネット上の ファイルには拡張子が必要です。"); } if($fname=~ /\s/){ &error("ファイル名「$fname」が不正です。
    インターネット上の ファイル名には空白やスペースを含んでいけません。"); } #大文字小文字の区別のないWin/MacでのWWWサーバ対策。 #ファイル名を小文字に統一 $fname=~ tr/a-z/A-Z/; #UNIX,LINUX等 }else{ if($fname!~ /(\w){1,30}\.(\w){1,4}$/){ &error("ファイル名が不正です。インターネット上のファイルには拡張子が必要です。
    また日本語のファイル名は使用できません。アップロードファイルの名前を変更し、再度アップロードしてください。"); } } if(-e "$img_dir/$fname"){ &error("同名のファイル $fname が既にサーバ上に存在します。 登録を中止しました。
    アップロードファイルの名前を変更し、 再度アップロードしてください。"); } if($allow_other_multimedia_data ==1){ unless(-e "$img_dir/.htaccess"){ &error("管理者設定エラー。セキュリティに問題があるため、 登録を中止しました。
    オリジナルファイル名を使用する場合は、画像保存ディレクトリに セキュリティ強化ファイル”.htaccess”を入れてください。
    入手方法は
    特報FAQコーナを参照すること。"); } } #すべてのエラーチェックを通過したら、代入する。 $new_fname="$fname"; } #============================# # エラーの出力 #============================# sub error{ local($error_message) = $_[0]; #メッセージを引数として取得 local($error_message2) = $_[1]; #メッセージを引数として取得 #for Form window if($form_disp_on_board ==0){ $error_action="disp_form_only"; } print "Content-type: text/html\n\n"; print< Error Message from Imgboard
    Imgboard - Error Message

      $error_message


    EOF &rm_tmp_uploaded_files; #一時保存された画像データを削除 exit; } #===================================# # 一時登録された画像ファイルの削除 #===================================# sub rm_tmp_uploaded_files{ if($img_data_exists==1){ sleep 1; foreach $fname_list(@NEWFNAMES){ if(-e "$img_dir/$fname_list"){ unlink("$img_dir/$fname_list"); } } } } #===================================# # 記事登録時に管理者にメール #===================================# sub send_mail{ if ($use_email==1){ #事前準備(エラーチェック) $www_server_os= $^O; #Win98 & NT(SP4)対策 if($www_server_os eq ""){ $www_server_os= $ENV{'OS'}; } #OSをチェック、Windows,Macユーザには警告を出す if($www_server_os=~ /win/i){ &error("管理者設定にエラーがあります
    メール通知\機\能\はWindowsサーバでは使用できません。オフにしてください。"); return; }elsif($www_server_os=~ /mac/i){ &error("管理者設定にエラーがあります
    メール通知\機\能\はMacサーバでは使用できません。オフにしてください。"); return; } #パラメータチェック(セキュリティチェック) if($email=~ /.*\@.*\..*/){ $eemail_address=$email; }else{ $eemail_address="dummy\@dummy.co.jp"; } $eemail_name="$name"; $eemail_subject ="$subject"; $eemail_img_title="$img_title"; #本文が長すぎる場合はカットする。メール爆弾系のイタズラ対策。 $eemail_body=$body; if(length($body) >260){ $eemail_body="メッセージが長過ぎますので、メッセージはカットしました. - $ENV{'HTTP_REFERER'}"; } #URLが指定されている場合はフルURL表記にする。 $eemail_img_location="$img_location"; if($img_dir_url =! /http:\/\/yourprovider\/yourname\/imgboard\/img-box\//){ $eemail_img_location="$img_dir_url"."$new_fname"; } #セキュリティ対策のため、問題のある文字をフィルタ $eemail_address =~ s/\,|\;|\://g; $eemail_name =~ s/\,|\;|\://g; $eemail_subject =~ s/\,|\;|\://g; $eemail_img_title =~ s/\,|\;|\://g; #メール文面ここから $mail_mes .= "MIME-Version: 1.0\n"; $mail_mes = "Reply-to: $eemail_address\n"; $mail_mes .= "From: $eemail_address\n"; $mail_mes .= "Subject: \[imgboard\]New article is added \n"; $mail_mes .= "Content-Type: text/plain; charset=iso-2022-jp\n"; $mail_mes .= "Content-Transfer-Encoding: 7bit \n\n"; $mail_mes .= "imgboardに新しい記事が投稿されました。\n\n"; $mail_mes .= "[Date]----$date\n"; $mail_mes .= "[名前]----$eemail_name\n" if($eemail_name ne ""); $mail_mes .= "[email]---$eemail_address\n" if($eemail_address ne ""); $mail_mes .= "---------------------------------------\n"; $mail_mes .= "[タイトル]-----$eemail_subject\n" if($eemail_subject ne ""); $mail_mes .= "[本文]---------$eemail_body\n" if($eemail_body ne ""); $mail_mes .= "[Image Title]--$eemail_img_title\n" if($eemail_img_title ne ""); $mail_mes .= "[Image URL]----$eemail_img_location - $img_data_size\n" if($img_location ne ""); $mail_mes .= "[使用プラウザ]-$HTTP_USER_AGENT\n" if($HTTP_USER_AGENT); $mail_mes .= "End\n"; #メール文面ここまで #メールで標準の形態、漢字コードJIS、改行コードLFに変換する。 $mail_mes=~ s/\r\n/\n/g; #改行コードを変換 $mail_mes=~ s/\r/\n/g; #改行コードを変換 &jcode'convert($mail_mes, 'jis'); #漢字コードをJISに #メールを送出 open (MAIL, "|$mail_prog $recipient") || &error("管理者設定にエラーがあります
    メールプログラム$mail_progが見つかりません。メールプログラムのパスを再確認してください。
    またWebサーバとメールサーバが別のサーバの場合使用できません。\n"); print MAIL "$mail_mes"; close (MAIL); } }