#!/usr/local/bin/perl # # # imgboard.cgi v1.22 (Rev.4a) # # Copyright(C) 1998特報!!倶楽部 # Origin Program to-ru@big.or.jp # Updated by 1998特報!!倶楽部スタッフ talk@big.or.jp # # Support site URL http://www.big.or.jp/~talk/t-club/soft/ # # # <改変履歴>-02/05/01 # 2000/02/02 99/12/29-00/01/31に配布したRev3a',Rev4をWin系WWWサーバで使用 # した場合に、制限サイズ以上のファイルをアップロードすると、応答がなかなか # 返ってこないという現象が発生する。この小バグをフィックス(Rev.4a) # 2000/01/08 使用禁止単語によるフィルタ、連続投稿リミッタなど、"荒し"対策を # 大幅強化(Rev.4) # 1999/12/29 転送サイズチェック小変更 (Rev.3a') # 1999/12/01 styleタグを用いたイタズラを検出するフィルタを改良 (Rev.3a) # 1999/11/18 www5x.biglobe.ne.jpに対応 (Rev.3) # 1999/09/01 $show_img_on_board=0の時、画像リサイズがうまく動かない不具合を修正(Rev.2) # 1999/08/06 Win用WWWサーバAnHTTPdに対応(Rev.1c) # 1999/07/17 送信メールの漢字コード修正(Rev.1) # 1999/06/27 拡張子リストを少し追加 (Rev.0.3) # 1999/06/20 2画面モードで削除エラー時、戻り先を変更(Rev.0.2) # 1999/05/03 1.21正式版でサブルーチンが一つ抜けていた致命的なバグを修正(V1.22) # 1999/04/17 Mac Office98update 対策を追加(R1.21) # 1999/04/12 マックバイナリカッターを変更 # 1999/02/15 Mac IE4.X対策を追加 # 1999/01/04 ゲストパスワード機能を修正 # 1998/09/20 リサイズ機能追加。管理者メール機能追加。 # 1998/08/24 最大件数を超えても画像ファイルが削除されないバグを Fix # 1998/08/14 外部IMG貼込処理時の小バグをFix # 1998/08/02 登録エラー時、画像ファイルがサーバに残るバグ対処 # 1998/07/15 タグ埋込許可オプション追加。 # 1998/07/10 CGI専用ディレクトリ型プロバイダ対応 # 1998/06/18 95/NT製のWWWサーバ対応 # 1998/06/04 クッキー対応,Mac対策 # 1998/05/24 SJIS化,リロード時の不具合対処 by ogo@ta2.so-net.ne.jp # 1998/01/24 v0.9の完成 by to-ru@big.or.jp # # <利用規定> # 1.このCGIは,当利用規定に従っていただく場合に限り,個人,法人にかかわらず, # 自由にカスタマイズし、無料で利用していただく事ができますが,著作権は # 放棄しておりませんので,当著作権表示ならびに,掲示板下部の著作権表示と # リンクを改変及び,削除することは固く禁止します。 # 2.このスクリプトの一部でも使用あるいは,参考にした場合,そのスクリプトには # 必ず当著作権表示と当サイトの URLを入れ,また当サイトへのリンクを掲示板 # 下部に埋め込んで下さい。 # 3.条件1,2を満たさない場合は,その利用を一切禁止します。 # 4.改造、非改造を問わず、作者に無断で再配布することを固く禁止します。 # 5.万一このCGIにより損害や不利益受けたとしても、当方は一切その責任を負う # 義務を持ちません.あらかじめご了承ください. # 6.掲示板の管理責任は,100%その掲示板の設置者にあるものとします。 # 7.日本以外の国籍のユーザを対象にした掲示板での利用を禁止します。 # 8.当方がその使用を不適当だと認めた場合,その使用を中止させていただく # 場合があります.あらかじめご了承ください. # ########################################################################################### # # 基本構成(初期設定はこの構成を前提に解説します) # # public_html(ホームページディレクトリ) # | # |-- cgi-bin(任意のディレクトリ705) # | # |--img-box(777 または 707)(画像保存用ディレクトリ) # | # |-- jcode_sj.pl (755 または 705)(ライト版の日本語ライブラリ) # |-- imgboard.cgi (755 または 705)(本体) # |-- imgsize.pl (755 または 705)(画像サイズ解析ライブラリ) # |-- file.dat (666 または 606)(記事データ保存用) # # ・( )内はパーミッッション値です。最初、括弧内の左の数字で試し, # 動くかどうか確認して下さい。確認がとれたら、3文字の数字の真ん中を0に変更し, # 動作するかチェックして下さい。どちらでも正常動作できるならば、できるだけ # 右の値を使ってください。 # (一般にプロバイダにおいては、真ん中の数字を0にすると、セキュリティ的により # 厳しくなり、他人からファイルを書換えられたりする危険性が減って安全度が上がり # ます。ただし中にはCGIが動かなくなるプロバイダもありますので、この場合は # 左の値をご使用ください) # # ・file.dat は中身が空の同名ファイルをパソコン上で作成.ftpで転送する # ・jcode_sj.plは中身を全くいじらずにそのままアスキー転送すること。 # ・これら4つのファイルはアスキーモード(テキスト)で転送すること。 # # (新情報!)なお最近プロバイダでよく使われているApacheというWWWサーバの場合 # 下記の設定も試してみてください。これでも動くなら、この設定の方がより安全で # す。 # # public_html(ホームページディレクトリ) # | # |-- cgi-bin(任意のディレクトリ701) # | # |--img-box(701)(画像保存用ディレクトリ) # | # |-- jcode_sj.pl (500)(ライト版の日本語ライブラリ) # |-- imgboard.cgi (500)(本体) # |-- imgsize.pl (500)(画像サイズ解析ライブラリ) # |-- file.dat (600)(記事データ保存用) # ########################################################################################### #=======================================================================# # 初期設定 #=======================================================================# # 先頭に#のある行は読み込まれません. #==================================# # <必須設定項目> # #==================================# # $admin_passwd = 'indigo'; # 管理人による記事削除時のパスワード # # (変更してください) # $title = "慶應義塾幼稚舎(東京) 画像掲示板"; # ↑「お気に入り or ブックマーク」保存時のタイトルになります。 # # ■<終了時戻り先URL> # # 掲示板の「終了ボタン」を押したときに、下記URLへ戻ります。 # (URLを下記デフォルトURLから変更しますと、ページにボタンが自動的に出現) $back_url ='http://rika.yochisha.keio.ac.jp/yagokyu-net/yousu/yousu.htm'; # # ■<CGI名> # # このCGIのファイル名です.自分でCGI名を変更した場合は適宜変更. $cgi_name = "imgboard.cgi"; # # ■<投稿画像の格納ディレクトリ> # # 投稿された画像ファイルを保存しておく場所です.整理を簡単にするため、また # セキュリティ確保のために、imgboard.cgiと同じディレクトリではなく,直下に # 新規ディレクトリを作成し,そこにアップロードファイルを保存することを強く # おすすめします. # なお,場所の指定方法ですが,通常は相対パス*で指定して下さい. # ---解説---- # 相対パスとは、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への変換機能のみ。 $jcode_name= 'jcode_sj.pl'; # # <画像プロパティ認識ライブラリ> # # imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま. $imgsize_prog="imgsize.pl"; # # #=====================================================================# # <以下,必要に応じて設定> # # # 以下の設定は,すべてオプションです。 # # 大抵のプロバイダの場合、特に変更しなくてもスクリプトは動きますので, # 一度この状態でスクリプトを動かしてみてください。正常に動かなかった場合, # サポート掲示板のFAQをみて,問題を解決してみてください。正常に動いた場合は, # いろいろ細かくアレンジできるようになっていますので, 以下のオプション項目へ # 進み、自分流にオプションを設定し,アレンジしてみてください。 #=======================================================================# #================================# # <掲示板機能 基本オプション> # #================================# # # ■<転送許可画像サイズ上限> # # ファイル投稿時、このCGIは他のテキスト系CGIよりも多くのメモリリソース # を必要とします。これはアップロードしたファイルの復元処理にバッファが必要な # ためであり、必要なメモリ量は転送された画像サイズに比例します。非力なサーバ # を使用している場合は、自然とアップロードサイズを小さくする必要があり、そう # しないと処理はタイムアウトして止まりますのでご注意下さい。 # 200KB以上にはしないこと。 # デフォルト70KB $max_upload_size = 100; # 単位KB # # ■<サーバ保存メッセージ数> # # この件数を超えると、古いものから削除されます.記事と画像は同時に消えます。 # デフォルトは30.極端に増やすとHP容量を圧迫しますので、ご注意ください。 # # --注意点-- # 画像データ削除時は、必ず掲示板を用いて、記事ごと削除して下さい。 # $max_message = 1000; # # ■<1ページに表示するメッセージ数> # # デフォルト10 # 1ページに表示するメッセージの数です。IE4の場合、多くすると表示時に少し # 時間がかかりますので、10以下を推奨 $disp_message = 10; # #==================================# # # #==================================# # # ■ <画像表示モードのユーザ選択> # # imgboardでは、画像の表示モードをユーザ側が自由に選択できるようになってい # ます。つまり、絵を直接貼り付ける、貼り付けない(リンクのみ)、アイコンサイ # ズにする、固定サイズにする等の「表示モード」の選択を、アクセスするユーザ自 # 身が自由選択できます。(通信速度、環境等の条件により、最適表示モードはユーザ # 毎に異なる)。一度選択した表示モード設定は、クッキーに記憶され、次回アクセス # から、それがデフォルトとして選択されるようになります。 # # この機能を無効化して、掲示板管理者の方で表示モードを固定したい場合は、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=オリジナル,5=極端に大きな画像のみ縮小) $on_board_img_size=2; # デフォルトは0 # # --注意点-- # 埋め込みする場合は,ページのロードが遅くなりますので、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」をご利用ください。 # # ■ <フォーム入力項目のデータ有無チェック> # # フォームの各入力項目の記入について、必須にするかどうかを指定できます。 # 必須にした入力項目が空の場合、記事は登録はされません。 # # 1=必須,0=省略を許可 $check_name =1; # 名前 (デフォルト1) $check_email =1; # email(デフォルト1) $check_subject=0; # 題名 (デフォルト0) $check_body =0; # 本文 (デフォルト0) $check_img =0; # 添付画像(デフォルト0) # # 以下は入力項目を増やす機能(imgboardでは3つまで入力項目を増やせます)を使って、 # 項目を増やした場合用 (増やしていないユーザは設定しても関係ありません)。 # $check_opt_A =0; # 追加項目opt_A (デフォルト0) $check_opt_B =0; # 追加項目opt_B (デフォルト0) $check_opt_C =0; # 追加項目opt_C (デフォルト0) # # ■ <時差> # # 海外サイトに設置した場合、投稿時刻が現地時刻になってしまいます。 # これを日本時刻に修正する場合には、以下の項目で時差を設定してください。 # (設定例) 時差を15時間にする場合 $gisa=15;という風に設定してください。 # $gisa=0; # 時差(h) # #==================================# # <セキュリティ オプション> # #==================================# # # <投稿者用パスワード> # # 投稿時にパスワードをチェックし、正しい場合だけ登録するようにできます. # 掲示板の完全公開運営に不安がある場合は、この機能を用いて会員制にする # ことをおすすめします.パスワードは一度入力するとクッキーに記憶されま # すので、次回投稿から入力は不要です。なお、1を指定すると自動的に項目が # フォーム欄に出現します。 # (1=使用,0=使用しない) $use_passwd_flag=1; # 会員パスワード $member_passwd="indigo"; # # <タグ使用許可> # # コメント中にタグを許可するかどうかを指定できます。許可すればユーザ表現の # 自由度は上がりますが、タグの閉め忘れ等によりトラブルが発生する可能性が # あります。なお、タグを許可する指定にしても、掲示板に対するイタズラ予防のため # ActiveX,Javascript等や、危険性のあるタグ、いたずらによく使われるタグ # (約22種類)は自動フィルタされ、無効化されますので、あらかじめご了承くださ # い。(詳細はsub form_checkを参照) # デフォルトはタグ使用可です。(1) # (1=使用可能,0=使用不可) $use_tag=0; # # # # タグを許可した場合、特に、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", "ohta.ap.so-net.ne.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","yokohama*.alpha-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", "kary.ap.so-net.ne.jp"); # # イタズラをするユーザの中には、たまに自分のホスト名情報を出さない設定にして # いる人がいます。これらホスト名を出さないユーザからの投稿を禁止するかどうか # を以下で決めて下さい。(1=禁止する,0=禁止しない(推奨)) $no_upload_by_no_RH_user=1; # # レベル2)投稿者名による制限 (BLACK_USER)(1.22 Rev4以降) # # 特定の文字を含むユーザ名を記入した投稿者からの投稿を失敗させます。ホスト名 # によるフィルタが役にたたない場合、補助手段としてご利用ください。 # (1=制限する,0=制限しない(推奨)) $no_upload_by_black_user=1; # マッチした場合のエラーメッセージ(変更可) $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=1; # # マッチした場合のエラーメッセージ(変更可) # (排除されたことが相手にわからないように、できるだけ、 # 無意味なものにしてください) $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=1; # # 上で"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 = 'deniro@ns.yochisha.keio.ac.jp'; # # メール本文に画像のURLリンクを作るため、画像保存ディレクトリのURLを指定して下さい。 $img_dir_url='http://rika.yochisha.keio.ac.jp/yagokyu-net/imgboard/keio/img-box/'; # # <ちょっとおやすみ> oyasumi # # 旅行に出かける等、しばらく掲示板をお休みしたい時は0にしてください。 $bbs_open_flag=1; #(1=yes,0=no)デフォルトは1 # おやすみ時のメッセージ(適宜変更) # $oyasumi_message=qq| 管理者旅行中のため、しばらくお休みします。
またのお越しをお待ちしております。 |; # # #=========================================# # <HTML詳細設定項目オプション> # #=========================================# # #==========================# # フォーム入力部のデザイン #==========================# # # <フォーム入力部を掲示板上に表示> $form_disp_on_board =0; # (1=yes,0=no)デフォルトは1 # #--注 上記数値を0にすると、内部処理の関係で表示が少々遅くなります。 # できるだけ1のままに。 # # < TABLE(表)の形状 > # $table_bgcolor ="#FFFFFF"; # フォーム部分の背景色 #$table_bgcolor =""; # フォーム部分の背景色 $table_background_image=""; # フォーム部分の背景画像 $table_border ="0"; # フォーム部分の枠の高さ $table_cellspacing ="2"; # フォーム部分の枠の幅 $table_cellpadding ="2"; # フォーム部分の枠のマージン # # < フォーム内のフォント色とサイズ > # #$font_option ="color=#90DF90 size=+0";# 下記以外の部分 #$font_option ="color=#006000 size=+0";# 下記以外の部分 $font_option ="color=#000000 size=+0";# 下記以外の部分 #$font_option2 ="color=#006000 size=+0";# "画像選択"と"題名" $font_option2 ="color=#000000 size=+0";# "画像選択"と"題名" # # < 必要/省略可の自動表示のフォント色とサイズ > # # "フォーム入力項目のデータ有無チェック"での設定に従い、 # 必要/省略可の自動表示を、フォーム欄の脇に自動表示することができます # $auto_disp_omit_frag ="1"; # 自動表示する(yes=1,no=0) $f_param ="color=#006000 size=-1"; # フォント色とサイズ # # < フォーム欄の背景色 > # #$ie_bg ="bgcolor=#505050"; # 欄の基本背景色(IE用) #$ie_bg ="bgcolor=#FFCACA"; # 欄の基本背景色(IE用) $ie_bg ="bgcolor=#DFDFFF"; # 欄の基本背景色(IE用) #$ie_bg2 ="bgcolor=#3D2020"; # "画像選択" 欄 $ie_bg2 ="bgcolor=#EDCCDD"; # "画像選択" 欄 #$ie_bg3 ="bgcolor=#3D1010"; # "画像の題名"欄 $ie_bg3 ="bgcolor=#DDCCDD"; # "画像の題名"欄 # # # ◆ <HTML抜粋> # # ユーザサイドでHTMLを変更しやすいように,スクリプト中のHTML定義部分を # 以下に抜き出し列挙してあります.それぞれ,print< # #=====================================# # # HTMLヘッダ,ボディ指定.タイトル等画面最上部のHTMLです # # print< $title

〜活動の様子〜
慶應義塾幼稚舎(東京)

HTML_END } # #=====================================# # <HTML--画面中央の説明> # #=====================================# # # 真ん中の説明部分のHTMLです. # sub middle_A_html{ print<
  • あなたのパ\ソ\コ\ン上のファイルを,直接BBS上にアップロードできます.(最大$max_upload_size KBまで) $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--投稿記事部分> # #=====================================# # # imgboardではユーザが「表示モード」を選択できるようになっています。 # そのため、テキストリンク、アイコンサイズ、固定サイズ、原寸などの # それぞれの「表示モード」により個別の記事部レイアウトを変更しなけ # ればなりませんが、それぞれ非常に良く似てますので、ここでは基本レイ # アウト2パターン(画像が小さい場合の基本レイアウト/画像が大きい場合 # の基本レイアウト)を定め、それの一部分($html_block_A)をすり替える # ことにより、全「表示モード」をカバーするものとします。レイアウトを # 自分で変更したい場合は以上の点を理解した上で、編集してください。 # # 1.レイアウトパターン1/ 画像が小さい記事系のレイアウト # (----テキスト記事、テキストリンク表示、アイコンサイズ表示用----) # # (注)レイアウト中の $html_block_Aには後述のブロックが代入されます。 # sub kiji_base_html{ print< $tmp_subject 名前:$tmp_name $tmp_date
$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 名前:$tmp_name $tmp_date

$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
会員パスワード
おなまえ $auto_omit_disp_name
e-mail $auto_omit_disp_email
題名 $auto_omit_disp_subject
画像選択 ←ファイルを選択 $auto_omit_disp_img
画像の題名 *省略可
本文: $auto_omit_disp_body
$cm_out_exit_h$cm_out_exit_f
HTML_END } #================================# # <HTML--下部> # #================================# # # フリーのCGIサイト等で掲示板下部へのバナー広告を義務付けられている # 場合は、ここにHTMLソースを書いてください。挿入ポイントは削除ボタン # の直上になります。なお、バナーには必ずHeight,Widthを追加指定してく # ださい # $html_for_bottom_banner2=qq|

  

 


  


Copyright(C)2000 "Yago-Kyu" Net Project  \All right reserved
E-mail : yago-staff\@yochisha.keio.ac.jp
事務局 慶應義塾幼稚舎

 

 

|; # # #------------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; # 削除処理 &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 "

    画像投稿ページ

\n"; &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"; $HTTP_USER_AGENT =$ENV{'HTTP_USER_AGENT'}; $REMOTE_HOST =$ENV{'REMOTE_HOST'}; $SERVER_NAME =$ENV{'SERVER_NAME'}; &check_RH; # Apache1.3.x対策 &check_ISP; # プロバイダをチェックして、アドバイスを出す eval "&check_script_end;"; # ダウンロードミスによる尻切れスクリプトを検出 #========= 以下はマイナーオプションです ( 0=no,1=yes)==========# # ブラックリスト関連 $no_disp_for_cracker =0; # リスト上のサイトには掲示板を見せることも禁止する。 $use_ext_blacklist =1; # 外部にblacklist.txt,blkuser.txt,blkword.txt # があれば,そのリストをロードする # ゲストパスワード機能 # 投稿者自身が記事を削除できる機能です。詳細はサポート掲示板を参照してください。 # $use_guest_passwd =1; # ゲストパスワード機能を使用 $guest_passwd ='guest'; # 記事削除時の ゲストパスワード(変更してください) # IPが完全一致しなくても、同じサブネットからのアクセスは同一人物とみなし、削除を許可する $gp_allow_subnet =1; # その他 $no_disp_RH_in_HTML_sorce=0; # HTMLソースにリモホを表示しない $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 ="set02.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"; }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 対策 if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb/i){ $www_server_os= 'win'; } # OmniHTTPd 対策 if($ENV{'SERVER_SOFTWARE'} =~ /Omni/i){ $www_server_os= 'win'; } # IIS 対策 if($ENV{'SERVER_SOFTWARE'} =~ /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年対策 $year += 100 if($year < 1970); $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(($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(-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 = "img$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');"; if($@ eq ""){ $jcode_eval_check_flag=1; # 成功 }else{ # 失敗 &error(" CGI設定エラー 何らかの理由で日本語ライブラリ「 $jcode_name 」の読み込みに失敗しました。
jcode_sj.pl等の名前が正しく指定されていないか、あるいは指定パス「 $jcode_name 」に該当ファイルが存在しないか、あるいはパーミッションが正しくないものと思われます "); } }else{ &jcode'convert(*value, 'sjis'); } $FORM{$name} = $value; # valueを返す } } } } #=========================# # 記事データの追加 #=========================# sub post_data{ undef @MESSAGE; &form_check; if($error_message ne ''){ &rm_tmp_uploaded_files; &set_cookies; # クッキーをセット(120Rev5以降) &error($error_message); exit; } # 記事の日付表示(変更可能) $date = "\[$year/$month/$mday,$hour:$min:$sec\]"; $rec_hour="$hour"; 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 >1007){ &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_up_times =$new_utc_set; # 連続投稿カウンタ $c_up_times =~ 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,utc:$c_up_times,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; # 2000年対策 $year += 100 if($year < 1970); $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,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 ファイル # VC++関連(デベロッパー用) if($fname=~ /\.c$/i) {return 'c'; } # C ソースファイル if($fname=~ /\.cpp$/i){return 'cpp';} # C++ソースファイル if($fname=~ /\.h$/i) {return 'h'; } # ヘッダ定義ファイル # その他細かい物は削除。今後は 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以外に以下のタイプのデータも投稿できるようにできます。 # 投稿させたくないデータタイプには#を先頭につけてコメントアウトして下さい。 # <ご注意!> # 初期設定で画像を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{'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')){ # 前処理(埋込みデータを加工) # 会員パスワード設定をしてない場合、項目は出さない。 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; $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_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=~ 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"; # if($user_IP=~ /(.*)\.(.*)\.(.*)/){ # } }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(表示モード)を決定 undef $disp_mode; &check_mode; # テキストリンク用HTML指定部に代入する$data_typeを選択 if($tmp_img_location=~ /\.gif$|\.jpe?g$/i){ $data_type=" 画 像 "; }elsif($tmp_img_location=~ /\.ram$|\.mp3?$|\.midi?$|\.wav$/i){ $data_type=" 音 声 "; }elsif($tmp_img_location=~ /\.txt$|\.html?$/i){ $data_type=" テキスト "; }elsif($tmp_img_location=~ /\.pac$/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(($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(($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"; } # 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ループの終了 # フッターを表示 # 下部にバナー広告を義務付けられている場合は、設定部の$html_for_bottom_bannerにHTMLソースを書いてください print< 削除方法
    ◆管理人: 専用パスワード :を入力し、削除対象の左欄をチェック(複数指定可)、「削除」を押す
    HTML_END if($use_guest_passwd =='1'){ 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 "
    \n"; print "
    "; print "FREE imgboard v1.22 R4<\/A><\/B>
    \n"; print "<\/DIV>
    \n"; } print "$html_for_bottom_banner2"; 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(省略可) # 以下パラメータで画像は1024x768画面でジャスト表示になる &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; # タグ禁止 # 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/<(\/?)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'}"; $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"; # いたずら防止 (99/12/01 追加分) $email =~ s/"/"/g; $email =~ s/style(\s*)=(.|\n)*//ig; $opt_data_A =~ s/style(\s*)=(.|\n)*//ig; $opt_data_B =~ s/style(\s*)=(.|\n)*//ig; $opt_data_C =~ s/style(\s*)=(.|\n)*//ig; # $opt_data_A =~ s/"/"/g; # $opt_data_B =~ s/"/"/g; # $opt_data_C =~ s/"/"/g; } #===============================# # フォームの入力項目のチェック #===============================# sub check_form_data_exist{ # 過去の外部設定ファイルとの互換性を維持する if($ext_config_ver eq "121"){ $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がありません。現在の設定では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 auto_omit_disp{ # パラメータデフォルトを指定 if($auto_disp_omit_frag ne '1'){ $auto_disp_omit_frag=0; } if($f_param eq ""){ $f_param ='size=-1 color=pink'; } local($html_h)="*必要"; local($html_s)="*省略可"; if($auto_disp_omit_frag eq "1"){ if($check_name==1){ $auto_omit_disp_name .= "$html_h"; }else{ $auto_omit_disp_name .= "$html_s"; } if($check_email==1){ $auto_omit_disp_email .= "$html_h"; }else{ $auto_omit_disp_email .= "$html_s"; } if($check_opt_A==1){ $auto_omit_disp_opt_A .= "$html_h"; }else{ $auto_omit_disp_opt_A .= "$html_s"; } if($check_opt_B==1){ $auto_omit_disp_opt_B .= "$html_h"; }else{ $auto_omit_disp_opt_B .= "$html_s"; } if($check_opt_C==1){ $auto_omit_disp_opt_C .= "$html_h"; }else{ $auto_omit_disp_opt_C .= "$html_s"; } if($check_subject==1){ $auto_omit_disp_subject .= "$html_h"; }else{ $auto_omit_disp_subject .= "$html_s"; } if($check_body==1){ $auto_omit_disp_body .= "$html_h"; }else{ $auto_omit_disp_body .= "$html_s"; } if($check_img==1){ $auto_omit_disp_img .= "$html_h"; }else{ $auto_omit_disp_img .= "$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) } #============================# # 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{ &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 from Imgboard
    Imgboard - Error Message

      $error_message

      $error_message2

    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(" エラー このブラウザでは記事の投稿はできません "); } } #====================# # プロバイダチェック #====================# sub check_ISP{ if($SERVER_NAME=~ /bekkoame\./){ &error(" CGI設定エラー。imgboardがサポート外サイトを検出しました。
    「$SERVER_NAME」は、CGIに関して特殊な制約があるため、残念ながらimgboardを利用することができません。他のプロバイダをご利用ください "); } if($SERVER_NAME=~ /hi\-ho\.ne\.jp/){ # 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); } #===================================# # 記事登録時に管理者にメール #===================================# 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 対策 if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb/i){ $www_server_os= 'win'; } # OmniHTTPd 対策 if($ENV{'SERVER_SOFTWARE'} =~ /Omni/i){ $www_server_os= 'win'; } # IIS 対策 if($ENV{'SERVER_SOFTWARE'} =~ /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) >360){ $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; # メール文面ここから (1.22 Header変更) $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 .= "[e-mail] $eemail_address\n" if($eemail_address ne ""); $mail_mes .= "---------------------------------------\n"; $mail_mes .= "[タイトル] $eemail_subject\n" if($eemail_subject ne ""); $mail_mes .= "[ 本文 ] \n $eemail_body\n" if($eemail_body ne ""); $mail_mes .= "[Image Title] $eemail_img_title\n" if($eemail_img_title ne ""); $mail_mes .= "[Image URL ] $img_data_size\n" if($img_location ne ""); $mail_mes .= " $eemail_img_location \n" if($img_location ne ""); $mail_mes .= "[使用プラウザ] $HTTP_USER_AGENT\n" if($HTTP_USER_AGENT); $mail_mes .= "[連続] $now_up_counter 回 [リミッタの現在設定] $upload_limit_times / $upload_limit_type \n" if($limit_upload_times_flag==1); $mail_mes .= " 以上 \n"; # メール文面ここまで # メールで標準の形態、漢字コードJIS、改行コードLFに変換する。 $mail_mes=~ s/\r\n/\n/g; # 改行コードを変換 $mail_mes=~ s/\r/\n/g; #改行コードを変換 &jcode'convert(*mail_mes, 'jis'); # 漢字コードをJISに(修正99.11) # メールを送出 open (MAIL, "|$mail_prog $recipient") || &error(" 管理者設定にエラーがあります
    メールプログラム$mail_progが見つかりません。メールプログラムのパスを再確認してください。
    またWebサーバとメールサーバが別のサーバの場合使用できません。\n"); print MAIL "$mail_mes"; close (MAIL); } } #==================================# # imgboard スクリプト尻切れ検出用 #==================================# sub check_script_end{ $script_end_flag='1'; } # スクリプト終端です