#!/usr/local/bin/perl #=======================================================================# # 初期設定 #=======================================================================# # 先頭に#のある行は読み込まれません. #==================================# # <必須設定項目> # #==================================# # $admin_passwd = 'hondabeat'; # 管理人による記事削除時のパスワード # # (変更してください) # $title = "100,000km達成車サロン [Be-cup.Drive][100,000kmFinisher's Club]"; # ↑「お気に入り or ブックマーク」保存時のタイトルになります。 # # ■<終了時戻り先URL> # # 掲示板の「終了ボタン」を押したときに、下記URLへ戻ります。 # (URLを下記デフォルトURLから変更しますと、ページにボタンが自動的に出現) $back_url ='http://www.be-cup.com/'; # # # ■<投稿画像の格納ディレクトリ> # # 投稿された画像ファイルを保存しておく場所です.整理を簡単にするため、また # セキュリティ確保のために、imgboard.cgiと同じディレクトリではなく,直下に # 新規ディレクトリを作成し,そこにアップロードファイルを保存することを強く # おすすめします. # なお,場所の指定方法ですが,通常は相対パス*で指定して下さい. # ---解説---- # 相対パスとは、imgboard.cgi(以下cgiと呼ぶ)から見た相対的な位置を指定する方法 # です。以下の設定はcgiのあるディレクトリ直下にimg-boxという名前の新規ディレ # クトリを作成し、そこを保存ディレクトリとした場合の相対パス指定例です(ピリ # オドはcgiが置いてあるディレクトリを意味します。)。 # 相対やら、絶対やら、なんか難しくてよくわからない・・という方は、このまま指 # 定を変更しないで、指示通りの位置にimg-boxディレクトリを作ってください。 $img_dir = './img'; # デフォルト位置 # # (補足事項/一部該当者のみ読んでください) # あなたのプロバイダが、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://www.be-cup.com/homepage/100000/owner/img'; # # # # iモードからアクセスがあると、下記ファイル名のCGIを探し、存在した場合のみ、 # 下記CGIへユーザをナビゲートするページを出します。 # iモードユーザを自動転送する(1=yes,0=no) $imode_redirect=0; # 探すCGI名 $imode_cgi_name= './imgboard_im.cgi'; # # <掲示データ保存ファイル名> # # テキストデータの保存用ファイルの名前です. # imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま. $file= './free.dat'; # # <日本語コード変換ライブラリ> # # imgboard.cgiと同じ場所に入れる場合は、このパス指定のまま. # 注:jcode_sj.plはjcode.plの機能限定スリム版です。SJISへの変換機能のみ。 $jcode_name= 'jcode_sj.pl'; # # <画像プロパティ認識ライブラリ> # # imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま. $imgsize_prog="imgsize.pl"; # # #=====================================================================# # <以下,必要に応じて設定> # # # 以下の設定は,すべてオプションです。 # # 大抵のプロバイダの場合、特に変更しなくてもスクリプトは動きますので, # 一度この状態でスクリプトを動かしてみてください。正常に動かなかった場合, # サポート掲示板のFAQをみて,問題を解決してみてください。正常に動いた場合は, # いろいろ細かくアレンジできるようになっていますので, 以下のオプション項目へ # 進み、自分流にオプションを設定し,アレンジしてみてください。 #=======================================================================# #================================# # <掲示板機能 基本オプション> # #================================# # # ■<転送許可画像サイズ上限> # # ファイル投稿時、このCGIは他のテキスト系CGIよりも多くのメモリリソース # を必要とします。これはアップロードしたファイルの復元処理にバッファが必要な # ためであり、必要なメモリ量は転送された画像サイズに比例します。非力なサーバ # を使用している場合は、自然とアップロードサイズを小さくする必要があり、そう # しないと処理はタイムアウトして止まりますのでご注意下さい。 # 200KB以上にはしないこと。 # デフォルト100KB $max_upload_size = 50; # 単位KB # # ■<サーバ保存メッセージ数> # # この件数を超えると、古いものから削除されます.記事と画像は同時に消えます。 # デフォルトは40.極端に増やすとHP容量を圧迫しますので、ご注意ください。 # # --注意点-- # 画像データ削除時は、掲示板を用いて削除して下さい。 # $max_message = 5000; # # ■<1ページに表示するメッセージ数> # # デフォルト7 # 1ページに表示するメッセージの数です。IE4の場合、数を多くすると、 # 表示時に少し時間がかかりますので、10以下を推奨します $disp_message = 15; # #==================================# # # #==================================# # # ■ <画像表示モードのユーザ選択> # # imgboardでは、画像の表示モードをユーザ側が自由に選択できるようになってい # ます。つまり、絵を直接貼り付ける、貼り付けない(リンクのみ)、アイコンサイ # ズにする、固定サイズにする等の「表示モード」の選択を、アクセスするユーザ自 # 身が自由選択できます。(通信速度、環境等の条件により、最適表示モードはユーザ # 毎に異なるので)。一度選択した表示モード設定は、クッキーに記憶され、次回アク # セスから、それが相手のデフォルトとして選択されるようになります。 # # この機能を無効化して、掲示板管理者の方で表示モードを固定したい場合は、0を # 指定します。 # (1=ユーザ選択メニューを出す(強く推奨),0=ユーザ選択メニューを出さない) $user_selected_view_mode=0; # # ■ <画像表示モードの管理者設定> # # ユーザ選択に任さないで、表示モードを管理者側で固定する場合、 # その画像表示モードを以下の部分で指定してください。 # # 画像を直接掲示板に貼り付ける、貼り付けない。 # (1=yes,0=no)デフォルトは1 $show_img_on_board=1; # # 上で1を選択した場合,その埋め込みサイズを選択。 # (0=iconサイズ,1=auto,2=横固定,3=原寸サイズ,5=極端に大きな画像のみ縮小) $on_board_img_size=0; # デフォルトは0 # # --注意点-- # 埋め込みする場合は,ページのロードが遅くなりますので、1ページ当たりの発言 # 表示個数を少なめにした方がいいでしょう.画像の大きさも小さ目に制限した方が # いいようです。 # # ■ R5 NEW # IEの場合、上記選択から計算で求められる画像指定サイズをそのまま適用すると、 # 元画像との縮尺とIEのレンダラ(画面描画プログラム)の相性により画質が極端に # 悪くなる場合があります。それを防ぐため、imgsize側に指定値を補正するフィル # タをR5で追加しました。以下のパラメータを0以外にすると、画質を損ないにくい # サイズへ補正をしてから、リサイズします。当処理により表示画質がかなり向上し # ますが、初期指定値から再補正されるため、「横サイズ固定」等はキレイに揃わな # くなります。ご注意ください。 # 2=画質最優先し、imgsizeが、かなり補正することを許可する。 # 1=画質優先し、imgsizeが、少しだけ補正することを許可する(推奨) # 0=指定サイズの正確さを重視して、一切補正はしない $CIMGSIZE{'smooze_mode'}=1; # # ■ <マルチデータアップロード可能にする> # 当掲示板は、GIF,JPEG以外に様々なタイプのデータも投稿できるようにすること # ができます。(動画,音声,LZH,HTML,MS_PowerPoint,WORD書類、その他) # 画像データの公開といった使い道以外に、例えばFTPソフトに不慣れなインター # ネット初心者からのFTP代替手段に用いて情報共有手段にする等、広範な用途にお # 使いいただけるよう、あらかじめ設計されています。したがってあなたのアイデア # 次第で広範な用途に使用可能ですが、この場合、データの著作権問題に関しては # 十分ご注意下さい。管理責任は100%掲示板設置者の責任とさせていだだきます。 # なお、セキュリティ保全のため、アップロードできるデータはあらかじめリストアッ # プされたものに限られています。特定のタイプのデータを、投稿禁止したい、あるい # は追加したい場合は、スクリプト中のサブルーチン(additional_content_types)内で # 変数をコメントアウトor追加してください.(詳細はサポート掲示板を参照) # ただしcgi,shtml,asp,wsh(js,vbs)等のプログラム形式のファイルの拡張子は # 追加できないようになっています。 # (この設定はセキュリティ上、必要な処置です。変更しないで下さい ) # # マルチデータアップロードを # (1=可能にする,0=可能にしない)デフォルトは0 $allow_other_multimedia_data=0; # # ■ <保存ファイル名の指定> # # 当掲示板ではセキュリティ保全のため、自動的にファイルのリネームをします。 # ファイル名の重複を防ぐために、1.20以降では,時刻ペースの命名法をするように # なりました。 # # ○ <元のファイル名を使用する> # ファイル共有用途に用いる場合、imgXXXX.XXXと勝手にリネームされると面倒で # 困る等の要望が多かったので、アップロード前のパソコン上でのファイル名を # そのまま使って保存することができる機能がimgboardにはありましたが、 # 1.22 Rev.4以降、imgboardからは、この機能は削りました。同機能をご利用され # たい場合は、姉妹スクリプト「e_FTPboard」をご利用ください。e_FTPboardでは # デフォルトでオリジナルファイル名で保存でき、かつ、セキュリティ問題に関し # ても大幅強化されております。 # # ■ <フォーム入力項目のデータ有無チェック> # # フォームの各入力項目の記入について、必須にするかどうかを指定できます。 # 必須にした入力項目が空の場合、記事は登録はされません。 # # 1=必須,0=省略を許可 $CHECK{'name'} =1; # 名前 (デフォルト1) $CHECK{'email'} =0; # email(デフォルト1) $CHECK{'subject'} =1; # 題名 (デフォルト0) $CHECK{'body'} =1; # 本文 (デフォルト0) $CHECK{'img'} =0; # 添付画像(デフォルト0) $CHECK{'rm_key'} =0; # 削除キー(デフォルト0)# ←現在未使用 # # 以下は入力項目を増やす機能(imgboardでは6つまで入力項目を増やせます)を使っ # て、項目を増やした場合用 (増やしていないユーザは設定しても関係ありません)。 # $CHECK{'opt_A'} =0; # 追加項目opt_A (デフォルト0) $CHECK{'opt_B'} =0; # 追加項目opt_B (デフォルト0) $CHECK{'opt_C'} =0; # 追加項目opt_C (デフォルト0) $CHECK{'opt_D'} =0; # 追加項目opt_D (デフォルト0) $CHECK{'opt_E'} =0; # 追加項目opt_E (デフォルト0) $CHECK{'opt_F'} =0; # 追加項目opt_F (デフォルト0) # # ■ <時差> # # 海外サイトに設置した場合、投稿時刻が現地時刻になってしまいます。 # これを日本時刻に修正する場合には、以下の項目で時差を設定してください。 # (設定例) 時差を15時間にする場合 $gisa=15;という風に設定してください。 # $gisa=9; # 時差(h) # # ■ <自動URLリンク> # # 記事中にURL,メールアドレス等が含まれる場合、自動的にリンクにします。 # (1=自動リンク(推奨),0=自動リンクしない) $auto_url_link=1; # #==================================# # <セキュリティ オプション> # #==================================# # # <投稿者用パスワード> # # 投稿時にパスワードをチェックし、正しい場合だけ登録するようにできます. # 掲示板の完全公開運営に不安がある場合は、この機能を用いて会員制にする # ことをおすすめします.パスワードは一度入力するとクッキーに記憶されま # すので、次回投稿から入力は不要です。なお、1を指定すると自動的に項目が # フォーム欄に出現します。 # (1=使用,0=使用しない) $use_passwd_flag=0; # 会員パスワード $member_passwd="passwd"; # # <タグ使用許可> # # コメント中にタグを許可するかどうかを指定できます。許可すればユーザ表現の # 自由度は上がりますが、タグの閉め忘れ等によりトラブルが発生する可能性が # あります。なお、タグを許可する指定にしても、掲示板に対するイタズラ予防のため # ActiveX,Javascript等や、危険性のあるタグ、いたずらによく使われるタグ # (約22種類)は自動フィルタされ、無効化されますので、あらかじめご了承くださ # い。(詳細は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; # # <各種掲示板荒し対策> # # レベル1)ホスト名による制限 (BLACK_LIST) # # 以下のパターンを名前に含むプロバイダに属するユーザから登録できないように # します.悪質な掲示板荒しが頻発する場合、その対抗策としてご利用ください. # *はワイルドカードです。0文字以上の任意パターンにマッチします。 # ?は一文字分の任意の文字にマッチします (詳細はサポート掲示板にて) # @BLACK_LIST=("rr.com","anonymizer.com","utm4*.bekkoame.or.jp","nasuinfo.or.jp", "123.123.123.123","123.123.123.2??", "ichikawa*.teleway.ne.jp","zip.com.au","ns?.asaka.ne.jp","osp*.ask.ne.jp", "p*.haci.ap.so-net.ne.jp", "fukuoka*.try-net.or.jp","ashk0*.ppp.infoweb.ne.jp","dhcp*.ztv.ne.jp", "zaq.ne.jp","wave.home.net","fk.enjoy.ne.jp","202.231.144.1??", "agcs.com","utsunomiya-ppp-*.interq.or.jp"); # # イタズラをするユーザの中には、たまに自分のホスト名情報を出さない設定にして # いる人がいます。これらホスト名を出さないユーザからの投稿を禁止するかどうか # を以下で決めて下さい。(1=禁止する,0=禁止しない(推奨)) $no_upload_by_no_RH_user=0; # # レベル2)投稿者名による制限 (BLACK_USER)(1.22 Rev4以降) # # 特定の文字を含むユーザ名を記入した投稿者からの投稿を失敗させます。ホスト名 # によるフィルタが役にたたない場合、補助手段としてご利用ください。 # (1=制限する,0=制限しない(推奨)) $no_upload_by_black_user=0; # マッチした場合のエラーメッセージ(変更可) $error_message_to_black_user="CGI error code 2135 BLU"; # @BLACK_USER=(" 信者 "," 凶 "," ユダヤ "," 使徒 "," 破壊者 "," 悪の "); # # レベル3)禁止単語による制限 (BLACK_WORD)(1.22 Rev4以降) # # 特定の単語を本文に含む記事の投稿を失敗させます。前述の手段を用いても"荒し" # や "宣伝広告の嵐" がどうしても収まらない場合、あるいは、ホスト名を頻繁に変 # えるユーザからしつこいイタズラを受けている場合に、最終手段として使ってみて # ください。 # (1=制限する,0=制限しない(推奨)) $no_upload_by_black_word=0; # # マッチした場合のエラーメッセージ(変更可) # (排除されたことが相手にわからないように、できるだけ、 # 無意味なものにしてください) $error_message_to_black_word="CGI error code 2244 NBW"; # @BLACK_WORD=(" Ω "," しねしね "," うんこ "," 死ね "," 制裁 ", " ユダヤ "," あほあほ "," ばかばか "," sex "," やめろ "," 潰 "," 奴 ", " ごみ以下 "," 呆れ "," 無修正画像 ", " すべて無修正 "," 厨房 ", " 雑魚 "," 罵 "," 童貞 "," 傍観者 "," fuck ", " porn "," ウンコ ", " 偽善者 "," わらい "," 捏造 "," adult "," teen "," stripper ", " fetish "," pics " ," 下記URLで只今無料配布中 ", " 素人娘 "," ビデオを大放出 "); # # <連続投稿回数制限> (1.22 Rev4 NEW!) # # ユーザからの連続投稿回数を、掲示板側で制限できるようになりました。 # (1=制限する(デフォルト),0=制限しない) $limit_upload_times_flag=0; # # 上で"1"にした場合、どれだけのサンプリング期間の間に最大何回までアップ # ロード許可するかを決めてください。(オーバすると投稿エラーになります) # # サンプリング期間 (day,1hour,10min,2min,1minを選択可。デフォルトは2min) $upload_limit_type="2min"; # 回数。デフォルトは5回 $upload_limit_times="5"; # # <管理者自動メール> sendmail # # 新規記事が登録されると、下記メールアドレスにメールで通知します。 # この機能を使用する場合は、以下の三つの情報をすべて確実に指定してください。 # これらの情報を間違えると、サーバ管理者へ迷惑をかけるので、必ず管理者に確認 # してから慎重に設定を行ってください。なお、この機能が使えるのはプロバイダ # がUNIX系のユーザのみです。(Mac,Win不可)設定がよくわからない場合は使用し # ないでください。 # $use_email =1; # (1=yes,0=no)デフォルトは0 # # メールプログラムのパス(プロバイダの管理者に聞く) $mail_prog = '/usr/lib/sendmail'; # # 管理者のメールアドレス(あなたのメールアドレス) $recipient = 'arao@be-cup.com'; # # メール本文に画像のURLリンクを作るため、画像保存ディレクトリのURLを指定して下さい。 $img_dir_url='http:/www.be-cup.com/homepage/keiji/img-box/'; # # <ちょっとおやすみ> oyasumi # # 旅行に出かける等、しばらく掲示板をお休みしたい時は0にしてください。 $bbs_open_flag=1; #(1=yes,0=no)デフォルトは1 # おやすみ時のメッセージ(適宜変更) # $oyasumi_message=qq| 管理者旅行中のため、しばらくお休みします。
またのお越しをお待ちしております。 |; # # #=========================================# # <HTML詳細設定項目オプション> # #=========================================# # #==========================# # フォーム入力部のデザイン #==========================# # # <フォーム入力部を掲示板上に表示> $form_disp_on_board =1; # (1=yes,0=no)デフォルトは1 # #--注 上記数値を0にすると、内部処理の関係で表示が少々遅くなります。 # できるだけ1のままに。 # # < TABLE(表)の形状 > # $table_bgcolor =""; # フォーム部分の背景色 $table_background_image=""; # フォーム部分の背景画像 $table_border ="0"; # フォーム部分の枠の高さ $table_cellspacing ="1"; # フォーム部分の枠の幅 $table_cellpadding ="0"; # フォーム部分の枠のマージン # # < フォーム内のフォント色とサイズ > # $font_option ="color=#000080 size=+0";# 下記以外の部分 $font_option2 ="color=#9E8857 size=+0";# "画像選択"と"題名" # # < 必要/省略可の自動表示のフォント色とサイズ > # # "フォーム入力項目のデータ有無チェック"での設定に従い、 # 必要/省略可の自動表示を、フォーム欄の脇に自動表示することができます # $auto_disp_omit_frag ="1"; # 自動表示する(yes=1,no=0) $f_param ="color=#555555 size=-1"; # フォント色とサイズ # # < フォーム欄の背景色 > # $ie_bg ="bgcolor=#3CB371"; # 欄の基本背景色(IE用) $ie_bg2 ="bgcolor=DEB887"; # "画像選択" 欄 $ie_bg3 ="bgcolor=DEB887"; # "画像の題名"欄 # # # ◆ <HTML抜粋> # # ユーザサイドでHTMLを変更しやすいように,スクリプト中のHTML定義部分を # 以下に抜き出し列挙してあります.それぞれ,print< # #=====================================# # # HTMLヘッダ,ボディ指定.タイトル等画面最上部のHTMLです # # print< $title
100,000kmフィニッシャーズクラブ
 
管理人:カッター




100,000km到達車サロン
HTML_END } # #=====================================# # <HTML--画面中央の説明> # #=====================================# # # 真ん中の説明部分のHTMLです. # sub middle_A_html{ if($allow_other_multimedia_data==1){ $html_mA01="ファイル"; }else{ $html_mA01="画像"; } print<
HTML_END } sub middle_B_html{ print<
  • 1回の表\示\で $disp_message 件を越える場合、 最下部のボタンを押すことで次の画面を表\示できます
  • $start_message から $last_message の記事が表\示\されています

HTML_END } # #=====================================# # <HTML--投稿記事部分> # #=====================================# # # imgboardではユーザが「表示モード」を選択できるようになっています。 # そのため、テキストリンク、アイコンサイズ、固定サイズ、原寸などの # それぞれの「表示モード」により個別の記事部レイアウトを変更しなけ # ればなりませんが、それぞれ非常に良く似てますので、ここでは基本レイ # アウト2パターン(画像が小さい場合の基本レイアウト/画像が大きい場合 # の基本レイアウト)を定め、それの一部分($html_block_A)をすり替える # ことにより、全「表示モード」をカバーするものとします。レイアウトを # 自分で変更したい場合は以上の点を理解した上で、編集してください。 # # 1.レイアウトパターン1/ 画像が小さい記事系のレイアウト # (----テキスト記事、テキストリンク表示、アイコンサイズ表示用----) # # (注)レイアウト中の $html_block_Aには後述のブロックが代入されます。 # sub kiji_base_html{ print< $tmp_subject 名前:$mail_a_start $tmp_name $mail_a_end $tmp_date $auto_user_IP
$tmp_body
$html_block_A
HTML_END } # # テキスト、テキストリンク、アイコンサイズ、各表示モードに # より以下のHTMLが上記レイアウトのhtml_block_Aに代入されます。 # 以下でその代入ブロックを編集できます。 # sub set_html_block{ # 変数の準備 $img_dsize="$IMG_PARAMETERS{'dsize'}"; # # 1.1テキスト/テキストリンクモード時用の $html_block_A $textlink_html_block=qq|
$data_type: $tmp_img_title -$img_dsize
|; # 1.2アイコンサイズモード時用の $html_block_A $icon_html_block=qq|
画 像: $tmp_img_title -$img_dsize
|; } # # 2.レイアウトパターン2/ 画像がメインな記事系レイアウト # (------横固定サイズ表示&オート&オリジナルサイズ表示用--------) sub kiji_base2_html{ print< 画像タイトル:$tmp_img_title -$img_dsize
$tmp_subject 名前:$mail_a_start $tmp_name $mail_a_end$mail_block $tmp_date
$auto_user_IP
$tmp_body


HTML_END } # #=========================================# # <HTML--入力フォーム部> # #=========================================# # # 記事入力フォーム部のHTML.入力項目を増やしたり、減らしたりしたい # 場合はここを変更してください。だだし、変更によりCGIがうまく動かな # くなる可能性がありますので,ここは変更する時は十分注意してください. # なお、URL等の項目を追加したいなど、よくある希望に対しては、外部設定 # ファイルというカスタマイズした設定ファイルを使うことにより、より容易 # に実現できますので、自分でカスタマイズするよりも、それを使った方が楽 # でしょう。なお、同ファイルはサポートサイトの方で配布しています。 # sub form_html{ &auto_omit_disp; #以下の行から"HTML_END"のある行までは通常のHTMLとして編集可能です. print<
    $cm_out_pw_h $cm_out_pw_f $cm_out_img_h $cm_out_img_f HTML_END if($use_guest_passwd=='-1'){ print< HTML_END } print<
    会員パスワード:
    名前: $DISP_OMIT{'name'}
    メール: $DISP_OMIT{'email'}
    題名: $DISP_OMIT{'subject'}
    本文: $DISP_OMIT{'body'}
    画像選択 ←ファイルを選択 $DISP_OMIT{'img'}
      画像の題名 *省略可
    削除キー $DISP_OMIT{'rm_key'} 自分で記事を削除時に使用。数字で4ケタ以内
     
    $cm_out_exit_h$cm_out_exit_f
HTML_END } # #================================# # <HTML--下部> # #================================# # # フリーのCGIサイト等で掲示板下部へのバナー広告を義務付けられている # 場合は、ここにHTMLソースを書いてください。挿入ポイントは削除ボタン # の直上になります。なお、バナーには必ずHeight,Widthを追加指定してく # ださい # $html_for_bottom_banner=qq| |; # # # #------------HTML抜粋ここまで------------# # cfg_end #=================================================================# # 以上でユーザカスタマイズ部分である初期設定は終わりです. # # 以下はプログラムになります. # #=================================================================# #=======================================================================# # メインルーチン #=======================================================================# &init_valiables; # 初期化 &check_open; # 開店確認 &read_input; # フォームの内容とクッキーを読み込む if($FORM{'action'} eq 'post'){ # モードが投稿モードの場合 &check_browser_type; # ブラウザチェック &check_entry_passwd; # 会員チェック &protect_from_BBS_cracker; # 荒し対策 &read_cookie; # クッキーを読込む &limit_upload_times; # 連続投稿回数チェック &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; # 削除処理 $disp_user_ip=1; # &jump_html; # パラメータクリア用HTML exit; # 終了 }elsif(($FORM{'passwd'} eq $guest_passwd)&&($use_guest_passwd ==1)){ $remove_mode="guest"; # 削除モード &remove_data; # 削除処理 &jump_html; # パラメータクリア用HTML exit; # 終了 }elsif($use_guest_passwd =='-1'){ $remove_mode="rm_key"; # 削除モード &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"; &top_html; &output_form_html; # 入力フォームを表示 print "\n"; exit; } # モードが指定されてない場合,掲示板を表示 &protect_from_BBS_cracker if($no_disp_for_cracker==1); # 荒し対策 &output_html; # 掲示板を表示 exit; #=======================================================================# # サブルーチン #=======================================================================# #================# # 初期化 #================# sub init_valiables{ $ext_config_ver ="100"; $script_end_flag ="99"; $disp_user_ip ="0"; # 管理者パスを入力するとIPが表示される。 $HTTP_USER_AGENT =$ENV{'HTTP_USER_AGENT'}; $REMOTE_HOST =$ENV{'REMOTE_HOST'}; $SERVER_NAME =$ENV{'SERVER_NAME'}; if(int($])<5){ &error(" 設定エラー。スクリプトの1行目でパスの指定されたPerlのバージョン $] は古すぎます。imgboard1.22R5以降ではjcode.plのバージョンの関係でPerl5以上が必要です。Perl5以上のパスを探してそれに変更するか、Perl4でも動くR5\(for Perl4\)とjcode_sj.plを特報倶楽部にて入手してください。 "); } &check_RH; # Apache1.3.x対策 &check_ISP; # プロバイダをチェックして、アドバイスを出す &check_imode; # iモードからのアクセスなら指定URLへ飛ばす eval "&check_script_end;"; # ダウンロードミスによる尻切れスクリプトを検出 $cgi_name=&get_script_name; #========= 以下はマイナーオプションです ( 0=no,1=yes)==========# # ブラックリスト関連 $no_disp_for_cracker =0; # リスト上のサイトには掲示板を見せることも禁止する。 $use_ext_blacklist =1; # 外部にblacklist.txt,blkuser.txt,blkword.txt # があれば,そのリストをロードする # ゲストパスワード機能 # 投稿者自身が記事を削除できる機能です。詳細はサポート掲示板を参照してください。 # $use_guest_passwd =1; # ゲストパスワード機能を使用 # (-1,0使用しない、1ゲストパスワードを使用する) $guest_passwd ='guest'; # 記事削除時の ゲストパスワード(変更してください) # IPが完全一致しなくても、同じサブネットからのアクセスは同一人物とみなし、削除を許可する $gp_allow_subnet =1; # その他 $no_disp_RH_in_HTML_sorce=0; # HTMLソースにリモホを表示しない # -1=常時表示,0=HTMLソースのみ,1=非表示 $auto_ip_if_danger_datatype=1; # 危険なデータタイプの時は、投稿者のIPを自動表示する $use_ip_privacy_filter=1; # プライバシー保護のためIPアドレスの一部を伏せ字に $allow_mac_msie_bin_upload_f='0'; # IE4.XデータをMacbinaryのまま保存(def=0) $force_www_server_os_to=''; # 未使用パラメータ(指定しないこと) # 外部の設定ファイルのロード(1.21以降) # カスタマイズしたHTMLや設定したパラメータ等を外部からロードします。 # バージョンアップによる引越しやカスタマイズが楽になります。 # なお、開発元でimgboardの設定やHTMLをアレンジをした外部設定ファイルの # 配布も予定していますので、改造が面倒・・・という方は、これをご利用して # 頂くと手間が省けて良いでしょう。 # (一例)メルアド省略&URL項目付きVerに変更できる外部設定ファイル $load_ext_config =0; # 外部設定ファイルを使う(1=yes,0=no) $ext_config_name ="set_icon01.cgi";# 設定ファイル名(拡張子は必ず cgiに) # 外部設定ファイルに書いたパラメータは上書きされます。 #------------------ 以下はプログラム ----------------------------- undef $call_from_imgboard_flag; $call_from_imgboard_flag=1; require "$imgsize_prog" if(-e "$imgsize_prog"); if(($load_ext_config == 1)&&(-e "$ext_config_name")){ require "$ext_config_name"; } if(($jcode_name ne '')&&(-e "$jcode_name")){ require "$jcode_name"; eval &jcode'init('tokuho_check'); # 成功 if($@ eq ""){ $jcode_sj_version =&jcode'init('tokuho_check'); if($jcode_sj_version < 2000052301 ){ &error(" 管理者設定のエラー。処理を中止しました。
jcode_sj.plのバージョン $jcode_sj_version は古過ぎます。 最新版をご利用ください。"); } }else{ # 失敗 &error(" 管理者設定のエラー。処理を中止しました。
jcode_sj.plは古過ぎるか、あるいはマッチしていないタイプの物です。 最新版をご利用ください。"); } }else{ } if($script_end_flag == '99'){ &error(" CGI設定エラー スクリプトの尻切れを検出!
imgboardは、スクリプト末尾を見つけることが できませんでした。ダウンロード、FTPアップロード時の時間切れ等により、スクリプトの後半が 尻切れ状態になっている恐れがあります。スクリプトのサイズを再確認し,問題があれば、やり直してみてください "); } } #================# # 開店確認 #================# sub check_open{ if($bbs_open_flag !=1){ &error("$oyasumi_message"); } } #=====================# # 入力データを読む #=====================# sub read_input{ # 変数の初期化 local($name); undef $img_data_exists; undef @NEWFNAMES; undef $jcode_eval_check_flag; $mac_ie4_flag='0'; 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'}; } # AnHTTPd/Omni/IIS 対策 if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb|Omni|IIS\//i){ $www_server_os= 'win'; } # Win Apache 対策 if($ENV{'WINDIR'} ne ""){ $www_server_os= 'win'; } # Perlが新OSを検知できない場合,強制的に指定する if($force_www_server_os_to =~ /win/i){ $www_server_os = 'win'; }elsif($force_www_server_os_to =~ /mac/i){ $www_server_os = 'mac'; } if($www_server_os=~ /win/i){ binmode(STDIN); } if($ENV{'CONTENT_LENGTH'} > 10000000){ # Unixは正常。Win は下記メッセージを出さずに終了するようだ &error(" データ容量が大きすぎます。$max_content_limit KB以下にしてください。p "); exit; } # 2000/02/02 変更 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); if($ENV{'CONTENT_LENGTH'} > $max_content_length){ &error(" データ容量が大きすぎます。$max_content_limit KB以下にしてください。r "); 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) = localtime(time + $gisa*60*60); $year += 1900; # 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"; } $unq_id="$year"."$month"."$mday"."$hour"."$min"."$sec"; # -----フォームのデコード処理------# # 非マルチパート時のフォーム処理 # 削除,ページ変更時等 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','','z'); # 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.
,Perl ver $]
@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|6)\./i)){ $mac_ie4_flag='1'; } # 特例処理(マイムが不明な場合) if(($fname ne "")&&($content_type eq "")){ # 以下の3ケースが想定される. # ケース1)Macユーザがファイル名に拡張子のないファイルをアップロード # ケース2)Mac,Win,Unixユーザがブラウザの知らない(Plug-inのない)データをアップロード # この場合はデータのヘッダ部分のテキスト解析からの自動判別を試みる(Gif,JPEG). # 失敗したら拡張子が存在するかどうかをチェック # 存在したら後の拡張子による判断に任せる. # 存在しない場合警告を出し終了. # データヘッダから画像の種類を自動判別 if($vars[3] =~ /^GIF8/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{ # Mac版MSIE4.x対策ここから if(($mac_ie4_flag == '1')&&($content_type =~ /application\/x-macbinary/i)){ # Mac IE4.xの場合はブラウザから通知されるcontent_typeを信用できない。 # GIFもJPEGも128バイトヘッダの付いたマックバイナリ形式にエンコードされてしまう。 # 従ってデータ全体からヘッダを検索しデータの中身の判別を行う必要がある if($fname=~ /\.gif$/i){ # 拡張子がgifならGIF(判別スキップ) $gif_checked_f=1; }elsif($vars[4] =~ /GIF8/i){ # 拡張子がない場合はヘッダを検索 $gif_checked_f=1; } if($gif_checked_f == 1){ $check_m .="ヘッダー分析の結果4はGIF
"; $content_type="image/gif"; }elsif($vars[4] =~ /^(.+)JFIF/i){ $check_m .="ヘッダー分析の結果4はJPEG
"; $content_type="image/jpeg"; }elsif($fname=~ /\.lzh$/i){ $content_type="compressed/lha"; # # 拡張子らしき物がついている場合 # }elsif($fname=~ /\.(\w){1,4}$/){ # $content_type="unknown";# 後の拡張子による判断に任せる }else{ &error(" Mac版IE4.X以降は仕様が特殊なため、GIF・JPEG以外のアップロードはできません。
その他の形式のファイルのアップロードには、Netscape2.0以降をご利用ください
"); } } # マイムタイプより、拡張子を作る $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$//; } # Mac版 MSIE4.x用フィルタ実行部 # $allow_mac_msie_bin_upload_f='0'; if($mac_ie4_flag == '1'){ if(($content_type=~ /application\/x-macbinary/i)&&($allow_other_multimedia_data == 1)&&($allow_mac_msie_bin_upload_f ==1)){ $ext ='macbin.bin'; }elsif($ext=~ /gif$/i){ if($data!~ /^GIF8/){ ($gomi,$data,$gomi2)=split(/GIF8/,$data); $data ="GIF8"."$data"; } }elsif($ext =~ /jpe?g/i){ if($data=~ /^\xff\xd8/){ # Office98 for Mac修正プログラムをインストールしIE4.xのバグが # フィックスされた人にはなにもしないでOK }else{ $HEADER_BYTES = 128; $macbin_dsize=length($data); if($macbin_dsize > 128){ $data = substr($data, $HEADER_BYTES); if($data!~ /^\xff\xd8/){ # ヘッダが切っても出てこない場合、警告を出し登録中止 &error(" MacIE4.Xはアップロードに不適です。Netscape2.0以降をご利用ください "); } }else{ &error(" MacIE4.Xはアップロードに不適です。Netscape2.0以降をご利用ください "); } } }elsif(($ext=~ /lzh$/i)&&($allow_other_multimedia_data == 1)){ $HEADER_BYTES = 128; $macbin_dsize=length($data); if($macbin_dsize > 128){ $data = substr($data, $HEADER_BYTES); }else{ &error(" MacIE4.Xはアップロードに不適です。Netscape2.0以降をご利用ください "); } }else{ &error(" Macの場合、IE4.Xでアップロードできるのは画像ファイル(GIF・JPEG)のみです。
それ以外の形式のアップロードは、Netscape2.0以降をご利用ください "); } } # Mac版MSIE4.x フィルタここまで $img_dir = '.' if($img_dir eq ''); # 画像保存ディレクトリの確認 if($img_dir=~ /^http\:\/\//i){ &error(" img_dirの指定が間違えています。
ディレクトリとURLは別の概念です。ディレクトリ指定が、httpで始まることはありません。
設定を変更してください。"); } if(-d "$img_dir"){ }else{ &error(" 画像データ保存用ディレクトリ\"$img_dir\"が見つかりません.
指定ディレクトリ\"$img_dir\"が存在しない可\能\性があります
画像保存用ディレクトリのパス設定をご確認ください."); } # パスを消して、ファイル名のみを残す。 #95/NTからのアップロードに対応 $fname=~ s/^(.*)\\//; # UNIX からのアップロードに対応 $fname=~ s/^(.*)\///; #&error("ファイル名 $fname"); $use_orig_name=0; # オリジナルファイル名保存機能削除 # 今後は e_FTPboardでのみサポート if($use_orig_name==1){ # &use_orig_name; }else{ # 時刻でファイル名を付けるオプション。 # ファイル名のコンフリクトを防ぐ $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 = "be-cup$date_count\.$ext"; } # 複数アップロード対応用 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; } # sjisに変換 (imgboard1.22 Rev.3) # jcode_sj.pl関連の設定ミスをトラップして検出 # (一度成功すればスキップして高速化) if($jcode_eval_check_flag != '1'){ eval "&jcode'convert(*value, 'sjis','','z');"; if($@ eq ""){ $jcode_eval_check_flag=1; # 成功 }else{ # 失敗 &error(" CGI設定エラー 何らかの理由で日本語ライブラリ「 $jcode_name 」の読み込みに失敗しました。
jcode_sj.pl等の名前が正しく指定されていないか、あるいは指定パス「 $jcode_name 」に該当ファイルが存在しないか、あるいはパーミッションが正しくないものと思われます "); } }else{ &jcode'convert(*value, 'sjis','','z'); } $FORM{$name} = $value; # valueを返す } } } } #=========================# # 記事データの追加 #=========================# sub post_data{ undef @HEAD_MESSAGE; undef @MESSAGE; local($old_seq_no,$new_seq_no,$tmp_mes_line,$mes_counter); if($ENV{'REQUEST_METHOD'} ne 'POST'){ &error(" セキュリティ警告
GETによる記事投稿は受け付けません "); } &form_check; if($error_message ne ''){ &rm_tmp_uploaded_files; &set_cookies; # クッキーをセット(120Rev5以降) &error($error_message); exit; } # 記事の日付表示(変更可能) $date_data = "\[$year/$month/$mday,$hour:$min:$sec\]"; if(($img_location ne '')&&($img_title eq '')){ # タイトルがない場合はファイル名がタイトル $img_title="$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 >=20000509){ &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; } } # セパレータとして問題あるものを、事前に置換 $subject=&Enc_EQ("$subject"); undef $tmp_data; foreach $p_key(keys %FORM){ if($p_key=~ /opt\_data/){ $tmp_data=&Enc_EQ($FORM{$p_key}); $opt_data.="$p_key"."\="."$tmp_data"."\;"; undef $tmp_data; } } # 新しいメッセージを加える(imgboard1.20新形式) # $new_message = "$subject\t$name\t$email\t$date_data\t$body<\!--opt\:$opt_data-->\t$img_location\t$img_title<\!--dsize=$img_data_size;type=$img_type;width=$img_width;height=$img_height;hw_racio=$img_hw_racio;-->"; $all_message=0; if(-e "$file"){ }else{ # コメント保存ファイルがない場合,自動作成を試みる open(NEWFILE,">$file")||&error(" 設定エラー.データ保存用ファイル\"$file\"が見つかりません.自動作成を試みましたができませんでした。処理は中断されました."); close(NEWFILE); sleep 1; } # 準備完了 # メッセージを読み込む open(IN, "$file")|| &error(" 設定エラー.データ保存用ファイル\"$file\"が見つかりません.処理は中断されました."); while(){ # HEADER保存 (将来への拡張もここで対応) if($_ =~ /^\#?\,param_/i){ # (#でコメントアウトしたものを含む) if($_ =~ /^\,param_seq_no(\s*)=(\s*)(\d+)(\s*)/i){ # 連番を取得する $old_seq_no="$3"; }else{ push(@HEAD_MESSAGE, $_); } } # 記事をバッファに入れる if($_ =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)/){ $tmp_mes_line="$_"; chop($tmp_mes_line); push(@MESSAGE, $tmp_mes_line); $all_message++; } } close(IN); # 連番処理 if($old_seq_no eq ""){# ない場合は作る $old_seq_no='0'; } $new_seq_no=$old_seq_no+1; # 新しいメッセージを作る(imgboard1.22新形式) $new_message = "$subject\t$name\t$email\t$date_data\t$body<\!--opt\:$opt_data-->\t$img_location\t$img_title<\!--dsize=$img_data_size;type=$img_type;width=$img_width;height=$img_height;hw_racio=$img_hw_racio;-->\t$new_seq_no\t$FORM{'blood'}\t$rm_key\t$unq_id\t"; unshift(@MESSAGE, $new_message); $all_message++; # 古い画像を削除 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")|| &check_file_open_error; # HEAD部分 print OUT "\,param_seq_no=$new_seq_no\n"; foreach(@HEAD_MESSAGE){ print OUT "$_"; } # 記事部分 for($i=0; $i<$repost_message; $i++){ print OUT "$MESSAGE[$i]\n"; } close(OUT); } sub check_file_open_error{ unless(-e "$file"){ &error(" 設定エラー.データ用保存ファイル\"$file\"にデータを書込むことができませんでした.
\"$file\"という名前のファイルが正しい位置に見つからないためです。パスの設定を再確認してみてください。投稿処理は中断されました."); } unless(-w "$file"){ &error(" 設定エラー.データ用保存ファイル\"$file\"にデータを書込むことができませんでした.
$fileに対する書込み許可がないためだと思われます.パーミションの設定を再確認してみてください。投稿処理は中断されました."); } &error(" 設定エラー.データ用保存ファイル\"$file\"にデータを書込むことができませんでした.
設定を再確認してみてください。投稿処理は中断されました."); } #=================================# # 記事データの削除 (メイン部) #=================================# sub remove_data{ $tmpnum=0; undef @HEAD_MESSAGE; 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($_ =~ /^\#?\,param_/i){ # HEADERを保存する(#でコメントアウトしたものを含む) push(@HEAD_MESSAGE, $_); next; } 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;# ゲストパスワードをチェック }elsif($remove_mode eq "rm_key"){ # 削除キーをチェック &check_rm_key("$tmp_rm_key"); }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(@HEAD_MESSAGE){ # HEAD部分 print OUT "$_"; } foreach(@TMPMESSAGE){ print OUT "$_"; } 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 check_rm_key{ # 削除キー機能を有効にすると,削除キーが一致する場合、記事の削除ができる。 # ゲストパスワードとの同時使用はできない。削除キーが設定されてない場合は、 # 記事の削除ができる。チェックを行い,条件を満たせば$allow_remove_flag=1となる。 local($ttmp_rm_key) = @_; # 記事中に埋め込まれた削除キー local($tmp_form_rm_key); # フォームで入力された削除キー(後で暗号化する) if(($ttmp_rm_key eq "")||($ttmp_rm_key eq "no_key")){ # 削除キーのない古い記事の場合、削除を不許可 # 削除キーの入力されてない記事の場合、削除を不許可 $skipped_rm_key_remove++; # 削除失敗した記事の数 if($remove_article_number=='1'){ &error(" パスワードが違います.削除を中止しました "); }elsif($remove_article_number == "$skipped_rm_key_remove"){ &error(" パスワードが違います.削除を中止しました "); } return; }else{ # 削除キーが入力されている場合 if($FORM{'passwd'} eq ""){ &error(" 削除キーが入力されていません。削除できませんでした。
この記事には投稿者により、削除キーが設定されています。記事投稿時に用いた削除キーを入力してください。なお、削除キーを忘失した場合は、掲示板管理者に頼んで削除してもらってください "); }elsif($FORM{'passwd'} eq "$ttmp_rm_key"){ $allow_remove_flag=1; }else{ &error(" 入力された削除キー「$FORM{'passwd'}」が違います。削除できませんでした。
この記事には投稿者により、削除キーが設定されています。記事投稿時に用いた削除キーを入力してください。なお、削除キーを忘失した場合は、掲示板管理者に頼んで削除してもらってください "); } } } #=====================# # クッキーを読む #=====================# 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{'be-cup121'})){ local($name,$value) = split(/\:/); $value=&Dec_EQ($value); $COOKIE{$name} = $value; } } #========================# # クッキーを書く(R5Ver) #========================# sub set_cookies{ undef $set_value; # セパレータと区別できなくなる=を事前にEnc_eqに置換 $FORM{'utc'}=$new_utc_set; # 連続投稿カウンタ &CEnc_EQ('subject'); &CEnc_EQ('name'); &CEnc_EQ('email'); &CEnc_EQ('view_mode'); &CEnc_EQ('opt_data_A'); &CEnc_EQ('opt_data_B'); &CEnc_EQ('opt_data_C'); &CEnc_EQ('opt_data_D'); &CEnc_EQ('opt_data_E'); &CEnc_EQ('opt_data_F'); &CEnc_EQ('img_title'); &CEnc_EQ('view_mode'); &CEnc_EQ('utc'); &CEnc_EQ('entry_passwd'); foreach $p_key(keys %T_COOKIE){ # パスワード系は暗号化 if($p_key=~ /\_passwd/){ # $T_COOKIE{$p_key}=&make_pass("$T_COOKIE{$p_key}"); } $set_value.="$p_key"."\:"."$T_COOKIE{$p_key}"."\,"; } $set_value.="end\:end"; &set_cookie("be-cup121","$set_value"); } # 繰り返し sub CEnc_EQ{ local($p_name)=$_[0]; $T_COOKIE{$p_name} =$FORM{$p_name}; $T_COOKIE{$p_name}=&Enc_EQ($T_COOKIE{$p_name}); return("$T_COOKIE{$p_name}"); } sub Enc_EQ{ # セパレータと区別できなくなる文字を事前に置換 local($tmp_data)=@_; $tmp_data =~ s/\=/Enc_eq/g; $tmp_data =~ s/\:/Enc_cln/g; $tmp_data =~ s/\;/Enc_scln/g; $tmp_data =~ s/\,/Enc_km/g; return($tmp_data); } sub Dec_EQ{ # セパレータと区別できなくなる文字を復元 local($tmp_data)=@_; $tmp_data =~ s/Enc_eq/\=/g; $tmp_data =~ s/Enc_cln/\:/g; $tmp_data =~ s/Enc_scln/\;/g; $tmp_data =~ s/Enc_km/\,/g; return($tmp_data); } 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; # 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,asp,pl,sh,exe.shtml,js,jse,vbs,vbe,hta,wsh,xlm等の拡張子はセキ # ュリティ上危険なので絶対追加しないこと(特に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=~ /\.rar$/i){return 'rar';} # RARファイル if($fname=~ /\.arj$/i){return 'arj';} # ARJファイル if($fname=~ /\.cab$/i){return 'cab';} # CABファイル if($fname=~ /\.pm5$/i){return 'pm5';} # PageMaker5ファイル if($fname=~ /\.pm6$/i){return 'pm6';} # PageMaker6ファイル if($fname=~ /\.qxd$/i){return 'qxd';} # QuarkXpressファイル if($fname=~ /\.ram$/i){return 'ram';} # Real Audioファイル if($fname=~ /\.dxf$/i){return 'dxf';} # AutoCAD 3Dファイル if($fname=~ /\.art$/i){return 'art';} # ART ファイル # その他細かい物は削除。今後は e_FTPboardをご利用ください。 if($www_server_os!~ /win/i){ # 以下のファイルはイントラネット専用です。 # WWWサーバがWindowでかつ外部公開サーバの時は # 下記の二つのファイルのコメントアウトを絶対に外さないこと # if($fname=~ /\.exe$/i){return 'exe';} # 実行ファイル # if($fname=~ /\.dll$/i){return 'dll';} # DLLファイル if($fname=~ /\.ini$/i){return 'ini';} # iniファイル } 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($fname=~ /\.pac$/i){return 'pac';} #Post Pet } $unknown_data_exit=1; # データタイプ不明の場合の最終判断 if($unknown_data_exit==1){ &error(" このタイプのデータはアップロードできません."); }else{ return 'dat'; } } #=========================# # Content-type の追加 #=========================# sub additional_content_types{ # おまけ機能(~_~) # gif,jpeg以外に以下のタイプのデータも投稿できるようにできます。 # 投稿させたくないデータタイプには#を先頭につけてコメントアウトして下さい。 # <ご注意!> # なお投稿許可させたくない場合は#を先頭につけてコメントアウトして下さい。 # 画像系(その他) $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{'compressed/lha'}= 'lzh'; # for LZH (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{'video/(.*)-asf'}= 'asf'; # for NetShow file $ext2{'video/avi'}= 'avi'; # for AVI file $ext2{'application/x-vod(.*)'}= 'vod'; # for VOD Script file $ext2{'video/x-ms-wvx'}= 'wvx'; # Windows Media オーディオ/ビデオ ショートカット $ext2{'video/x-ms-wmv'}= 'wmv'; # Windows Media オーディオ/ビデオ ファイル # 会社で仕事に役立ち系 $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{'message/rfc822'}= 'eml'; # Outlook Express メイル # 音楽系 $ext2{'audio/mpeg'}= 'mp3'; # for MPEG Audio $ext2{'audio/x-mpegurl'}= 'm3u'; # for MPEG Audio $ext2{'audio/x-wav'}= 'wav'; # for WAV Audio $ext2{'audio/(.+)mid'}= 'mid'; # for MIDI file $ext2{'audio/(.+)aiff'}= 'aiff'; # for AIFF file $ext2{'audio/basic'}= 'au'; # for Sun Audio $ext2{'audio/(.+)realaudio'}= 'ram'; # for Real Audio $ext2{'audio/x-ms-wax'}= 'wxa'; # WindowsMedia Audioショートカット $ext2{'audio/x-ms-wma'}= 'wma'; # WindowsMedia Audioファイル } #=========================# # 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')||($FORM{'action'} eq 'disp_rep_form')){ # 前処理(埋込みデータを加工) # 会員パスワード設定をしてない場合、項目は出さない。 if($use_passwd_flag != 1){ $cm_out_pw_h=''; } if($auto_url_link==1){ $auto_url_message="
  • 記事中のURL、メアド等は自動でリンク化されます\n"; } # タグを許可する場合、注意書きを追加しミスを予防する。 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{'action'} eq 'disp_rep_form'){ $cm_out_img_h=''; } # 初期設定を変更してない場合、終了ボタンは出さない。 if(($form_disp_on_board==0)||($back_url eq 'http://あなたのプロバイダ/あなたのディレクトリ/index.html')){ $cm_out_exit_h=''; } # 入力フォーム部form_htmlのHTMLを出力(書換えは初期設定の所で行う) &form_html; if($FORM{'action'} eq 'disp_rep_form'){ print<
    • 名前、e-mail、題名は一度登録すると記憶されますので次回から入力省略できます $tag_siyou_tyuui
    HTML_END }else{ # 入力フォーム下の説明部分を出力(書換えは初期設定の所で行う) &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]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)/){ # パラメータの準備 undef $child_kiji_flag; # 子記事確認用フラグ undef $old_kiji_flag; # 旧形式確認用フラグ undef $tmp_seq_no; undef $tmp_blood_name; undef $tmp_rm_key; undef $tmp_unq_id; $tmp_subject = $1; $tmp_name = $2; $tmp_email = $3; $tmp_date = $4; $tmp_body = $5; $tmp_img_location = $6; $tmp_img_title = $7; $tmp_seq_no = $8; # 連番 $tmp_blood_name = $9; # 親の血統ID(子供のみ持つ) $tmp_rm_key = $10; # 削除キー $tmp_unq_id = $11; # 固有ID(時刻ベース) $new_p1 = $12; $new_p2 = $13; $new_p3 = $14; $new_p4 = $15; $tmp_rm_number = $i+1; # 準備 if($tmp_unq_id eq ""){ $old_kiji_flag="1"; # 旧形式確認用フラグ } if($tmp_blood_name ne ""){ $child_kiji_flag="1"; # 子記事確認用フラグ }else{ $parent_counter++ } $tmp_subject=&Dec_EQ("$tmp_subject"); # img_titleの中にsize,height,width等のパラメータを格納 # 書式 # を除きパラメータ部を抽出 if($tmp_img_title ne ''){ ($tmp_img_title,$img_parameters)=split(/<\!--/,$tmp_img_title); $img_parameters=~ 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=&Dec_EQ("$value"); $OPT_FORM_DATA{$name}= $value; } }else{ undef %OPT_FORM_DATA; } # 相手のホスト名を変数$user_IP に代入 # (なりすまし防止などの事情で相手のIPを表示したい場合はこの変数を使って下さい) if($tmp_body=~ /user:\s([^>]*)(\s*)--/){ $user_IP="$1"; # $user_IP情報をプライバシー保護のため、一部マスクして隠す if($use_ip_privacy_filter==1){ &user_IP_privacy_filter; } }else{ $user_IP="No IP info"; } if($no_disp_RH_in_HTML_sorce==1){ $tmp_body=~ s/user:\s([^>]*)(\s*)--/user: na --/g; }else{ $tmp_body=~ s/user:\s([^>]*)(\s*)--/user: $user_IP--/g; } # disp_mode(表示モード)を決定 undef $disp_mode; &check_mode; # テキストリンク用HTML指定部に代入する$data_typeを選択 $disp_ip_flag=0; if($tmp_img_location ne ""){ if($tmp_img_location=~ /\.gif$|\.jpe?g$/i){ $data_type=" 画 像 "; }elsif($tmp_img_location=~ /\.ram?$|\.aiff?$|\.aifc$|\.snd$|\.au$|\.rmm?$|\.mp3?$|\.midi?$|\.wav$/i){ $data_type=" 音 声 "; }elsif($tmp_img_location=~ /\.te?xt$|\.html?$/i){ $data_type=" テキスト "; }elsif($tmp_img_location=~ /\.pac$/i){ $data_type=" おやつ "; }else{ $disp_ip_flag=1; $data_type=" データ "; } } #危険度の高いデータの場合はIPを自動表示する undef $auto_user_IP; if(($auto_ip_if_danger_datatype==1)&&($disp_ip_flag ==1)){ $auto_user_IP="("."$user_IP".")"; }elsif($no_disp_RH_in_HTML_sorce=='-1'){ $auto_user_IP="("."$user_IP".")"; }else{ $auto_user_IP=""; } if($tmp_img_location ne ''){ # 画像タイトルがない場合,画像名をタイトルに $tmp_img_title = $tmp_img_location if $tmp_img_title eq ''; $tmp_img_title =~ s/^(.*)\///; # パスを消去して名前のみにする } undef $ddd; #デバッグ用パラメータ # 画像のサイズ変更 if(($tmp_img_location!~ /\.dat$/)&&($tmp_img_location=~ /\.gif$|\.jpe?g$/i)){ &check_img; } #=============================================================# # CGI別ディレクトリサイト、cgiwrapサイト対策(imgboard1.22 Rev.3) #=============================================================# # 互換性のため if($SERVER_NAME eq ""){ $SERVER_NAME =$ENV{'SERVER_NAME'}; } if($SERVER_NAME=~ /\.www5(.?)\.biglobe/){ $using_cgi_wrap=1; } if($SERVER_NAME=~ /\.arena\.ne\.jp/){ $using_cgi_wrap=1; } if($SERVER_NAME=~ /\.interq\.or\.jp/){ $using_cgi_wrap=1; } if(($tmp_img_location =~ /^\/(.+)\/(.+)$/)||($using_cgi_wrap==1)){ # 絶対パス指定の場合はURL指定に変更 if($using_cgi_wrap==1){ $tmp_img_location=~ s/^(.+)\///g; }else{ $tmp_img_location=~ s/^\/(.+)\///g; } $tmp_img_location="$img_url/$tmp_img_location"; } # 自動URLリンクをする if($auto_url_link==1){ $tmp_body=&set_auto_url_link($tmp_body); } # メールアドレスがある場合のみリンクにする if($tmp_email ne " no_email"){ $mail_a_start =""; $mail_a_end =""; }else{ $mail_a_start =""; $mail_a_end =""; } # HTMLブロックの初期化 undef $html_block_A; undef $size_sitei; undef $disp_seq_no; if($tmp_seq_no ne ""){ $disp_seq_no="No\."."$tmp_seq_no"; } # 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ループの終了 # フッターを表示 # 下部にバナー広告を義務付けられている場合は、設定部の$html_for_bottom_bannerにHTMLソースを書いてください $dd_guest_passwd="$guest_passwd"; print< ☆記事の削除について
     記事の削除は管理人専用です
    HTML_END if($use_guest_passwd =='1'){ print<arao\@be-cup.comまで
    HTML_END }elsif($use_guest_passwd =='-1'){ $dd_guest_passwd=""; print< HTML_END } 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 "<\/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','300','640'); }elsif($disp_mode eq 'img_original'){ # オリジナルサイズ。引数3は表示倍率(倍率変更可能) &imgsize("$check_img_location",'x_per','100%'); }elsif($disp_mode eq 'img_h_static'){ # 縦サイズ固定。引数3は縦サイズ、引数4は最大横limit(省略可) # 以下パラメータで画像は1024x768画面でジャスト表示になる &imgsize("$check_img_location",'static_height','680','1000'); }elsif($disp_mode eq 'img_auto'){ # インテリジェントオートリサイズ。引数3は面積系のパラメータ(省略可) &imgsize("$check_img_location",'auto_resize','1000000'); }elsif($disp_mode eq 'img_limit_max'){ # 極端に大きな画像のみ縮小。引数3は縦制限サイズ、引数4は横制限サイズ(省略可) &imgsize("$check_img_location",'limit_by_max_size','480','480'); } $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{ if($CIMGSIZE{'smooze_mode'} > 0){ $yoko_sub_setumei=" をほぼ "; } 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; # タグ禁止 # Style指定 禁止 $FORM{$form} =~ s/style(\s*)=(.|\n)*/ Sorry..You can not use style in comment./ig; }else{ # タグ許可の場合 # (掲示板イタズラ対策) 各種危険タグを除去 if(($FORM{$form}=~ //)){ # タグがあった場合のみチェックする(高速化) $FORM{$form} =~ s///g; # SSI等 除去 $FORM{$form} =~ s//ig Sorry..You can not load IMG tag CGI in comment./ig; # IMGタグ CGI 除去 $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/<(\/?)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閉タグ 除去 $FORM{$form} =~ s/(\/?)COMMENT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use COMMENT tag in comment./ig; # COMMENTタグ 除去 } # タグがあってもなくても調べる unless(($form eq "body")||($form eq "subject")||($form eq "view_mode")||($form eq "name")){ $FORM{$form} =~ s/style(\s*)=(.|\n)*/ Sorry..You can not use style in tag on comment./ig; # Style指定 禁止 $FORM{$form} =~ s/(.|\n)*onLoad(\s*)\=/ig Sorry..You can not use char onLoad in comment./ig; # onLoad 除去 $FORM{$form} =~ s/(.|\n)*onClick(\s*)\=/ig Sorry..You can not use char onClick in comment./ig; # onClick 除去 } #危険タグ除去ここまで # 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'}"; $rm_key = "$FORM{'rm_key'}"; $img_title = "$FORM{'img_title'}"; $img_location = "$img_dir/$new_fname" if $new_fname ne ''; $view_mode = "$FORM{'view_mode'}"; #<フォームの有無のチェック> # 基本的にチェックする。ただし、プロファイル登録だけを行う # ユーザの場合は名前や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 ''; $rm_key ='no_key' if $rm_key eq ''; # 追加項目に未記入の場合のデフォルト値は以下の書き方を参考にしてください # $FORM{'opt_data_A'} =' 無題 ' if $FORM{'opt_data_A'} eq ''; # 本文にユーザ情報を含める $body = "$body"; # いたずら防止 (99/12/01 追加分) $email =~ s/"/"/g; $email =~ s/style(\s*)=(.|\n)*//ig; undef $p_key; foreach $p_key(keys %FORM){ if($p_key=~ /opt\_data/){ $FORM{$p_key}=~ s/style(\s*)=(.|\n)*//ig; $FORM{$p_key}=~ s/"/"/g; } } } #===============================# # フォームの入力項目のチェック #===============================# # sub check_form_data_exist{ if(($CHECK{'name'}==1)&&($name eq '')){ $error_message .= "名前がありません。
    "; } if(($CHECK{'email'}==1)&&($email eq '')){ $error_message .= "emailがありません。現在の設定ではemailは必須項目となっています。
    "; } 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 .= "添付画像がありません。
    "; } if(($CHECK{'rm_key'}==1)&&($rm_key eq '')){ $error_message .= "削除キーがありません。
    "; } # 追加項目に未記入の場合の警告メッセージは、以下の「opt_X」等の部分を適宜 # 書き換えてください if(($CHECK{'opt_A'}==1)&&($FORM{'opt_data_A'} eq '')){ $error_message .= "opt_A がありません。
    ";# 予備 } if(($CHECK{'opt_B'}==1)&&($FORM{'opt_data_B'} eq '')){ $error_message .= "opt_B がありません。
    ";# 予備 } if(($CHECK{'opt_C'}==1)&&($FORM{'opt_data_C'} eq '')){ $error_message .= "opt_C がありません。
    ";# 予備 } if(($CHECK{'opt_D'}==1)&&($FORM{'opt_data_D'} eq '')){ $error_message .= "opt_D がありません。
    ";# 予備 } if(($CHECK{'opt_E'}==1)&&($FORM{'opt_data_E'} eq '')){ $error_message .= "opt_E がありません。
    ";# 予備 } if(($CHECK{'opt_F'}==1)&&($FORM{'opt_data_F'} eq '')){ $error_message .= "opt_F がありません。
    ";# 予備 } } #==========================================# # フォームの入力項目の省略可・必須を自動表示 #==========================================# sub auto_omit_disp{ # パラメータデフォルトを指定 if($auto_disp_omit_frag ne '1'){ $auto_disp_omit_frag=0; } local($html_h)="*必要"; # 必須の場合 local($html_s)="*省略可"; # 省略可能な場合 if($auto_disp_omit_frag eq "1"){ foreach (keys %CHECK){ if($CHECK{$_}==1){ $DISP_OMIT{$_} .="$html_h"; }else{ $DISP_OMIT{$_} .="$html_s"; } } } } # # #============================# # 登録会員パスワードチェック #============================# sub check_entry_passwd{ # 会員パスワードチェック if(($FORM{'entry_passwd'} ne "$member_passwd")&&($use_passwd_flag==1)){ &error(" 会員パスワードが違います.投稿できませんでした."); } } #=======================================# # 掲示板荒し対策2(1.22Rev4 機能強化版) #=======================================# sub protect_from_BBS_cracker{ # # 相手のプロバイダ名により登録を禁止.(悪質掲示板荒らし対策) # 禁止したいユーザのいるプロバイダ名の一部を,で区切って""で囲み、 # @BLACK_LISTに入力.(リストは初期設定のところにあります).マッ # チするとそのユーザは登録できなくなります. # # 大幅機能追加(1.22 Rev4) # 名前、禁止単語による制限機能を追加しました。ホスト名を頻繁に変更する # 相手等、高度な「荒し技」を持つ相手からのイタズラが続く場合に、これを # 使ってください。 リストは初期設定のところにあります。 undef $bad_user_flag; local($error_mes_bl); local($error_mes_type); local($w_pattern); # デフォルトのダミーエラーメッセージ $error_mes_bl="CGI error 223458 BLT Default"; #外部のブラックリストファイル(ホスト名)を読込む if($use_ext_blacklist ==1){ $add_black_count=&load_ext_list('blacklist.txt','BLACK_LIST'); } #外部のブラックリストファイル(禁投稿者名)を読込む $no_upload_by_black_user=0 if($no_upload_by_black_user != 1); if(($use_ext_blacklist ==1)&&($no_upload_by_black_user==1)){ $add_black_user_count=&load_ext_list('blkuser.txt','BLACK_USER'); } #外部のブラックリストファイル(禁単語)を読込む $no_upload_by_black_word=0 if($no_upload_by_black_word!=1); if(($use_ext_blacklist ==1)&&($no_upload_by_black_word==1)){ $add_black_word_count=&load_ext_list('blkword.txt','BLACK_WORD'); } foreach (@BLACK_LIST){ # 正規表現をPerlパターンマッチへ変換 $w_pattern=&change_pattern_match($_); if($REMOTE_HOST=~ /$w_pattern/i){ if($no_disp_for_cracker==1){ # 荒し対策 &error(" CGIエラー. "); }else{ &error(" CGIエラー.投稿できませんでした. "); } } } # 投稿時以外(view時など)は、ホスト名以外のフィルタはスキップして負荷軽減(ここから) if($FORM{'action'} eq 'post'){ # 既に検出している場合はスキップして高速化 if(($bad_user_flag!=1)&&($no_upload_by_black_user==1)){ foreach (@BLACK_USER){ # 正規表現をPerlパターンマッチへ変換 $w_pattern=&change_pattern_match($_); if($w_pattern ne ""){ #記事の上部の項目(name,email,subject)はチェックする local(@HEADER_ITEM)=('name','email','subject'); foreach $form(@HEADER_ITEM){ if($FORM{"$form"}=~ /$w_pattern/i){ $error_mes_type="black_user"; $bad_user_flag=1; last;# 検出したら抜ける } } } } } # 既に検出している場合はスキップして高速化 if(($bad_user_flag!=1)&&($no_upload_by_black_word==1)){ foreach (@BLACK_WORD){ # 正規表現をPerlパターンマッチへ変換 $w_pattern=&change_pattern_match($_); if($w_pattern ne ""){ $blkw_count++; #記事すべての項目をチェックする local(@ALL_ITEM)=('body','name','subject','email','img_title','opt_dataA'); foreach $form(@ALL_ITEM){ if($FORM{"$form"}=~ /$w_pattern/i){ $error_mes_type="black_word"; $bad_user_flag=1; last;# 検出したら抜ける } } } } } # 問題点を検出した場合の処理 if($bad_user_flag==1){ # ダミーのエラーメッセージを出す if($error_mes_type eq "black_word"){ # 設定で指定している場合はそれを使う。ないならデフォルト if($error_message_to_black_word ne ""){ $error_mes_bl="$error_message_to_black_word"; } }elsif($error_mes_type eq "black_user"){ # 設定で指定している場合はそれを使う。ないならデフォルト if($error_message_to_black_user ne ""){ $error_mes_bl="$error_message_to_black_user"; } } &error("$error_mes_bl $blkw_count"); } } # 投稿時以外(view時など)は、ホスト名以外のフィルタはスキップ(ここまで) } # 外部リストをロードする部品 sub load_ext_list{ local($list_fname) = $_[0]; # リストの名前 local($array_name) = $_[1]; # 配列の名前 local($add_count) = 0; # リストから追加された項目数 if(-e "$list_fname"){ open(IN, "$list_fname")|| &error("設定エラー.ファイル\"$list_fname\"を読込めません.処理は中断されました."); while(){ if($_ =~ /^([^#])(.*)$/){ #コメントアウトは除く if($_ =~ /^(\s*)(\S+)(\s*)(\#?)(.*)$/){ # Perl4でも動く書き方にする(長くなるけど) if($array_name eq 'BLACK_LIST'){ push(@BLACK_LIST, $2); }elsif($array_name eq 'BLACK_WORD'){ push(@BLACK_WORD, $2); }elsif($array_name eq 'BLACK_USER'){ push(@BLACK_USER, $2); } $add_count++; } } } close(IN); } return($add_count); # リストから追加された項目数 } sub change_pattern_match{ # 正規表現をPerlパターンマッチへ変換 local($d_pattern) = $_[0]; $d_pattern=~ s/\s|\r|\n|\;|\)//g; # 念のため $d_pattern=~ s/\./\\./g; $d_pattern=~ s/\?/\./g; $d_pattern=~ s/\*/\.\*/g; $d_pattern=~ s/P_TAIL$/\$/i; $d_pattern=~ s/P_END$/\$/i; $d_pattern=~ s/^P_HEAD/\^/i; $d_pattern=~ s/P_SPACE/\\s/i; return($d_pattern) } #========================# # IP情報を一部伏せ字にする #========================# # $user_IP情報をプライバシー保護のため、一部伏せ字にするフィルタ sub user_IP_privacy_filter{ local($local_ip,$other_ip,$company_name,$org_local_ip,$org_other_ip); # リモートホストがIPアドレスの場合 if($user_IP=~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/){ $user_IP="$1.$2.$3.\*"; # リモートホストが論理ホスト名の場合 }elsif($user_IP=~ /(\w+)\.(\w+)$/){ if($user_IP=~ /^([^\.]+)\.(.*)$/){ $local_ip="$1"; $other_ip="$2"; $org_local_ip="$1"; $org_other_ip="$1"; # 最もローカル側のipの頭を1文字隠す。あと数字は意味ないので隠す。 $local_ip=substr($local_ip,1); $local_ip="\?"."$local_ip"; $local_ip=~ tr/0-9/\?/; # 会社から掲示板にアクセスしていることがバレるといやな人は多いと # 思われるので、会社場合は社名を削る。しかし、あんまり削ると # イタズラ予防効果がなくなるので、お尻を1文字だけ削ることにする if($other_ip=~ /^(.*)(\.?)([^\.]+)\.(co)\.(jp)$/){ $company_name="$3"; # $company_name=substr($company_name,1); chop($company_name); $other_ip="$1$2$company_name\?.$4.$5"; } # 政府機関は頭を2文字、お尻を1文字削る if($other_ip=~ /^(.*)(\.?)([^\.]+)\.(go)\.(jp)$/){ $company_name="$3"; $company_name=substr($company_name,2); chop($company_name); $other_ip="$1$2\?\?$company_name\?.$4.$5"; } # プロバイダは、もともと匿名性が高いので、最初の1文字削りと # 数字消しで充分かな・・・ということで、サードドメインには何もしない $user_IP="$local_ip"."\."."$other_ip"; # 大学は、悪い人?がよくJUMPに使い、悪用されることが多いので、 # そのまま削らない・・・(^_^) if($other_ip=~ /ac\.jp$/){ $user_IP="$org_local_ip"."\."."$org_other_ip"; } } } } #============================# # JUMP用HTML #============================# sub jump_html{ print "Content-type: text/html\n\n"; if(($form_disp_on_board==0)&&($FORM{'action'} eq 'post')){ print< プレオ掲示板
    プレオ掲示板


      処理中......

      10秒間このままお待ちください.
    EOF }else{ $cgi_add_url=""; if($remove_mode eq "admin"){ if($disp_user_ip==1){ $cgi_add_url="\?dip=4"; } } print< wait..

    100,000km到達車サロン

     ただいま書き込み処理中・・・・

     しばらくお待ちください

    EOF } } #================================================# # オリジナルファイル名使用希望者用追加サブルーチン #================================================# sub use_orig_name{ &error("オリジナルファイル名で保存する機能はimgboardから削除されました。
    同機能は、今後は e_FTPboardでサポートします "); } #============================# # エラーの出力 #============================# sub error{ local($error_message) = $_[0]; # メッセージを引数として取得 local($error_message2) = $_[1]; # メッセージを引数として取得 #for Form window if(($form_disp_on_board ==0)&&($FORM{'action'} ne 'remove' )){ $error_action="disp_form_only"; } print "Content-type: text/html\n\n"; print< エラー プレオ掲示板
    エラー プレオ掲示板

      $error_message

      $error_message2

      EOF print<
    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 check_browser_type{ if($HTTP_USER_AGENT=~ /icab/i){ &error(" エラー このブラウザでは記事の投稿はできません "); } } #=====================# # iモードチェック(R5) #=====================# # sub check_imode{ if(($HTTP_USER_AGENT=~ /docomo/i)&&($imode_redirect==1)){ if(-e "$imode_cgi_name"){ &error(" iモード用ユーザページをどうぞご利用ください "); } } } # #====================# # プロバイダチェック #====================# sub check_ISP{ if($SERVER_NAME=~ /bekkoame\./){ &error(" CGI設定エラー。imgboardがサポート外サイトを検出しました。
    「$SERVER_NAME」は、CGIに関して特殊な制約があるため、残念ながらimgboardを利用することができません。他のプロバイダをご利用ください "); } if(($SERVER_NAME=~ /hi\-ho\.ne\.jp/)||($SERVER_NAME=~ /\.nifty\.com/)){ # img_url設定が必要なサイトで設定が未設定の場合は警告を出す if($img_url eq 'http://あなたのプロバイダ/あなたのディレクトリ/img-box'){ &error(" CGI設定にエラーがあります。
    あなたが設置しようとしているプロバイダ 「 $SERVER_NAME 」では特殊な設定が必要になります。新FAQ掲示板を参照して、これを設定してください "); } } if($SERVER_NAME=~ /www5.\.biglobe/){ # img_url設定が必要なサイトで設定が未設定の場合は警告を出す if($img_url eq 'http://あなたのプロバイダ/あなたのディレクトリ/img-box'){ &error(" CGI設定にエラーがあります。
    あなたが設置しようとしているプロバイダ 「 $SERVER_NAME 」では$img_urlの設定が必要になります。これを設定してください。 なお、設定方法がわからない場合はサポート掲示板の過去ログを参照してください "); } } } #====================# # Apache1.3.x対策 #====================# sub check_RH{ if(($REMOTE_HOST eq "")||($REMOTE_HOST =~ /^null$/i)){ $REMOTE_HOST = "$ENV{'REMOTE_ADDR'}"; } # 1.22 Rev4 イタズラ投稿防止策 # リモートホストがない場合は登録させない。メッセージはダミー if(($REMOTE_HOST eq "")&&($no_upload_by_no_RH_user=='1')){ &error("CGIエラー No REMOTE_HOST
    現在、リモートホスト情報がない場合は、投稿できない設定になっています。 "); } } #================================# # 連続投稿制限 メイン(1.22 Rev4) #================================# sub limit_upload_times{ if($limit_upload_times_flag==1){ # 連続投稿カウンタを実行 # $new_utc_setはクッキーに設定される。 # 引数は設定部で設定。デフォルト値を持つので空でもいい。 $new_utc_set=&count_upload_times("$upload_limit_type","$upload_limit_times"); } } #================================# # 連続投稿制限 サブ(1.22 Rev4) #================================# sub count_upload_times{ # 連続投稿カウンタ # 引数は時刻レンジ、制限回数 # 返値は新カウンタセット値,グローバル変数の$now_up_counterに現在の連続回数 #初期化 local($upload_limit_type) = $_[0]; # 時刻レンジを引数として取得 local($upload_limit_times) = $_[1]; # 制限回数を引数として取得 local($tmp_up_counter); # デフォルト値をセット $upload_limit_type="2min" if($upload_limit_type eq ""); $upload_limit_times="5" if($upload_limit_times eq ""); local(@NOWTIME) = localtime(time); local($yday) = $NOWTIME[7]; # 時刻データからタイムベースナンバーを作る if($upload_limit_type eq "day"){ # 1日当たり?回で制限 $up_base_num=35+$yday; }elsif($upload_limit_type eq "1hour"){ # 1時間当たり?回で制限 $up_base_num=35+$yday+$hour; }elsif($upload_limit_type eq "10min"){ # 10分当たり?回で制限 $up_base_num=35+$yday+(int(($min+1)/10)); }elsif($upload_limit_type eq "2min"){ # 2分当たり?回で制限 $up_base_num=35+$yday+(int(($min+1)/2)); }elsif($upload_limit_type eq "1min"){ # 1分当たり?回で制限 $up_base_num=35+$yday+(int(($min+1)/1)); }else{ # デフォルトは2分 $up_base_num=35+$yday+(int(($min+1)/2)); } if($COOKIE{'utc'} eq ""){ # クッキーの値がない場合はセット $tmp_up_counter=$up_base_num; $now_up_counter=1; return($tmp_up_counter); }else{ $tmp_up_counter=$COOKIE{'utc'}; # クッキーからカウンタ値を読む } # エラーチェック if($tmp_up_counter=~ /^(\d+)$/){ # なにもしない }else{ # 0あるいは、数字以外の異常値になっている場合リセットする $tmp_up_counter=$up_base_num; # これをクッキーにセットする return($tmp_up_counter); } return(1) if($up_base_num==0); # 0除算予防(通常はない) #&error("up base $up_base_num yday $yday utc $COOKIE{'utc'} tmp_up $tmp_up_counter"); # メイン処理 if(($tmp_up_counter % $up_base_num)==0){ # タイムベースが一致する場合はカウントアップする $tmp_up_counter+=$up_base_num; $now_up_counter=int($tmp_up_counter/$up_base_num); if($now_up_counter > $upload_limit_times){ &error(" CGIエラー overtimes 掲示板管理者が設定した連続投稿 回数をオーバーしました。
    しばらく投稿できません "); exit; } }else{ # タイムベースが一致しない場合はカウンタをリセットし、新タイムペースを設定 $tmp_up_counter=$up_base_num; $now_up_counter=1; } # これをクッキーにセットする return($tmp_up_counter); } #================================# # 自動URLリンク機能 Ver0.9 (R5 NEW) #================================# # sub set_auto_url_link{ # 引数1は処理したいデータ; # 返値は処理後のデータ; local($tmp_data)=@_; # アンカータグを書くユーザなら自動リンクをオフにする # ない場合のみ処理 $PM{'auto_tel_find'}=1; $PM{'auto_mail_find'}=1; if($tmp_data!~ /$1<\/A>/g; $tmp_data =~ s/(r?ftp\:\/\/[\-\_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\:]+)/$1<\/A>/g; $tmp_data =~ s/(mailto\:[\-\_\.a-zA-Z0-9\@]+)/$1<\/A>/g; $tmp_data =~ s/(tel\:[\-\(\)0-9\+\#\*]+)/$1<\/A>/g; # 自動メルアドリンク if($PM{'auto_mail_find'}==1){ $tmp_data =~ s/([\-\_\.a-zA-Z0-9]+)\@([\-a-zA-Z0-9]+)\.([\-a-zA-Z0-9\.]+)([^a-zA-Z0-9]+)/$1\@$2\.$3<\/A>$4/g; } # 自動電話番号リンク(iモード用) if($PM{'auto_tel_find'}==1){ if($ENV{'HTTP_USER_AGENT'}=~ /docomo/i){ # 一般電話番号を見つける(一般数字との誤認識を防ぐため # 0で始まり-があるやつだけを認識) $tmp_data =~ s/([^\d]+)\(?0(\d{1,5})\)?\-\(?(\d{1,5})\)?\-(\d{3,6})/$10$2\-$3\-$4<\/A>/g; # 携帯の番号を見つける(-がなくて上で漏れたやつでも、 # 携帯の番号くさいなら拾う) $tmp_data =~ s/([^\d]+)(070|090)(\d|\-)(\d+)/$1$2$3$4<\/A>/g; } } } return($tmp_data); } #========================# # CGI名をとりだす #========================# # sub get_script_name { local($file_name) = $0; local($path_name); local($script_name); # パスがある場合は削る if ($file_name =~ /\\|\//) { if ($file_name =~ /^(.*)\\([^\\]*)$/) { $path_name =$1; $script_name =$2; }elsif($file_name =~ /^(.*)\/([^\/]*)$/) { $path_name =$1; $script_name =$2; }else{ $script_name ="$file_name"; } }else{ $script_name="$file_name"; } $script_path_name="$path_name"; return("$script_name"); } #===================================# # 記事登録時に管理者にメール #===================================# sub send_mail{ if ($use_email==1){ # 事前準備(エラーチェック) $www_server_os= $^O; # Win98 & NT4(SP4)対策 if($www_server_os eq ""){ $www_server_os= $ENV{'OS'}; } # AnHTTPd /OmniHTTPd/IIS対策 if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb|Omni|IIS\//i){ $www_server_os= 'win'; } # Win Apache 対策 if($ENV{'WINDIR'} ne ""){ $www_server_os= 'win'; } # 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; $eemail_body=~ s/\/\n/gi; $eemail_body=~ s/\<\!-- user/\n\<\!-- user/i; if(length($body) >500){ $eemail_body=" メッセージが長過ぎますので、メッセージはカットしました. - $ENV{'HTTP_REFERER'}"; } # URLが指定されている場合はフルURL表記にする。 $eemail_img_location="$img_location"; if($img_dir_url!~ /http:\/\/\/www.be-cup.com\/homepage\/keiji\/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; # メール文面ここから (1.22 Header変更) if (!open(OUT,"| $mail_prog $recipient")) { return; } print OUT "To: arakawa\@be-cup.com\n"; print OUT "From :arao\@be-cup.com\n"; $subject = "[be-cup][達成車] $eemail_name さんの書き込み"; &jis("Subject: $subject"); print OUT "$msg\n"; print OUT "Content-Transfer-Encoding: 7bit\n"; print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n\n"; &jis("[ 名前 ] $eemail_name"); print OUT "$msg\n"; &jis("[タイトル] $eemail_subject"); print OUT "$msg\n"; &jis("\n $eemail_body\n"); print OUT "$msg\n\n"; if (!open(DB,"footer.dat")) { &error('エラー','データファイルを読み出せません.'); } @lines = ; close(DB); &jis("\n @lines\n"); print OUT "$msg\n\n"; close(OUT); } } sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); } #==================================# # imgboard スクリプト尻切れ検出用 #==================================# sub check_script_end{ $script_end_flag='1'; } # スクリプト終端です