#!/usr/local/bin/perl # # # imgboard.cgi v1.22 (Rev.6.1q yTube) # # 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/ # # # TODO imgboardFLVplayer連携,twitter-IFの改良 # # <改変履歴>-09/30/2010/01 # 2010/08/18 外部ファイル、スパム単語リスト(spamword.cgi)の読み込みに対応 # 2010/07/08 imgboard専用ビルトインFLVプレイヤーに対応した(mp4,mov,flvの埋込み再生可) # 2010/07/08 iPad/iPhoneでHTML5版videoに対応 # 2010/07/08 SPAM対策強化2.5へ(URL16進数表記に対処) # 2010/05/27 ustream.tvのライブ埋込み再生に対応 # 2010/04/25 ストリートビューを埋め込むとエラーが出る問題を修正 # 2010/04/24 1920x1080等の液晶で画像やFlash動画が大きく見えるよう改良。 # 具体的には、viewport指定すると、横固定、オート(おまかせ)等で自動的に画像サイズを拡大、縮小する機能を追加 # 2010/04/24 ダイレクトにページ指定できるリンクを追加 # 2010/04/24 tokenのタイムアウトエラーが出る不具合を修正 # 2010/04/24 twitterで画像スレッドを紹介できる機能を追加 # 2010/04/24 twitterで画像スレッドを紹介できる機能を追加 # 2010/04/09 ワード検索メニューにおけるクロスサイトスクリプティングの可能性に対し対策をした # 2010/04/05 非マルチタッチ型スマートフォン用に、HTML下部に空きスペースを追加 # 2010/03/31 高負荷サイト用HTMLキャッシュ出力をONにするとSPAM対策用ワンタイムトークンでエラーが出る問題を修正 # 2010/03/30 コメントが記事に回り込む昔のレイアウトを復活させた # 2010/03/28 iPhone/iPadのタッチパネル操作用にボタンのサイズを大きくした # 2010/03/28 SPAM予防のため、emailを入れる人が少ないので、デフォルトで省略とした # 2010/03/18 viewport指定を小修正 # 2010/03/10 SPAM対策ソフトのバグを修正 # 2010/02/22 エスケープ機能を使ったSPAM対策を追加 # 2010/02/17 トリップ機能(なりすまし防止)をテスト実装 # 2010/02/15 SPAM対策にワインタイムトークン機能を追加 # 2010/02/15 IPアドレス指定型SPAMフィルタ機能を追加 # 2010/02/05 SPAM広告リストを大幅更新し、SPAM投稿対策を強化 # 2010/02/01 youtubemp4不調のため,iPhone/iPad再生先をyouTube提供タッチパネル用HTML5β版に変更 # 2010/01/23 iPad用のCGIコードを追加 # 2010/01/27 amcは、2005年以降au携帯で開けず、quicktimeでもmp3系はエラーなので非対応とした # 2010/01/27 auの3g2の扱いを変更し、au携帯でダウンロード視聴できるようにした # 2010/01/27 au部分のコードを修正 # 2010/01/23 android用のCGIコードを追加 # 2010/01/23 android Ver1.6のUSERAGENTが携帯と誤認識される問題でimode判定部を修正 # 2009/12/18 電子書籍のepub形式に対応 # 2009/12/18 携帯へ掲示板URLを送る機能を追加 # 2009/12/18 記事中の住所を認識し、GoogleMapリンク化する機能を追加 # 2009/12/18 デコメ、住所録データ等への対応を追加 # 2009/12/18 中国語圏からのSPAM対策を強化 # 2009/12/18 動画共有サイトdailymotion.comの埋込みに対応 # 2009/12/18 著作権に対する注意文に、ダウンロード行為を追記(法改正) # 2009/12/18 ClipLife埋め込みURLの変更に対応 # 2009/12/08 SONY MovePlayer形式対応(MQV)を廃止 # 2009/12/09 Windows版safariの文字化け対策を追加 # 2009/12/03 iPod/iPhoneのメール投稿に対応 # 2009/11/19 ニュースウォッチ2chのブログURLが住所と誤認識される不具合に対処 # 2009/10/22 AES暗号化アーカイブソフト、アタッシュケース(ATCファイル)に対応 # 2009/10/22 m4v対応を追加 # 2009/07/26 MKV/OGM/FLVの推奨プレイヤーリンクをGOMPLAYERに変更 # 2009/06/15 XPS形式ファイル(MS版PDF)対応 # 2009/06/15 aa/aax形式ファイル(ipodオーディオブック形式)対応 # 2009/06/15 mkv/ogm形式ファイル(DivX7等)対応 # 2008/08/28 ClipLife埋め込みに対応 # 2008/08/19 GoogleMAPストリートビュー(海外)埋め込みに対応 # 2008/08/18 GoogleMAPストリートビュー(日本)埋め込みに対応 # 2008/07/16 youTubeをiPod/iPhoneで見た場合に、記事が出ないバグを修正 # 2008/06/26 iPod/iPhoneで見やすくするためHTML小変更 # 2008/06/26 ニコニコ動画の埋め込み機能を修正 # 2008/06/25 PSPでyouTube動画を直接見えるように改良 # 2008/06/24 iPod/iPhoneでyouTube動画を直接見えるように改良 # 2008/06/20 iPod/iPhoneの文字化け現象に対処 # 2008/06/03 906i/706i以降の2MB画像アップ機用に携帯モジュール説明変更 # 2008/06/03 nancy形式対応部を廃止 # 2008/05/28 youTube日本語化に伴い、埋め込み方法の説明部を修正 # 2008/05/28 ニフニフ動画β版対応コードを削除 # 2007/08/15 secondlife://で始まるURLの自動リンク化対応 # 2007/07/12 SecondLifeアバター肌データ等に使われるTARGA形式に対応 # 2007/06/11 ニコニコ動画の埋め込み機能を追加 # 2007/06/05 SPAMと誤解された投稿時、戻るボタンで記入内容を復元可能に # 2007/06/05 自称されたメールアドレスの国チェック機能を追加 # 2007/05/23 英語のみの投稿を除外するようにした(SPAM対策) # 2007/05/23 返信記事の区切り線HRを出さなくできるようにした。 # 2007/05/20 URLリンク列挙型SPAM対策を標準でONにした(従来はOFF) # 2007/05/20 題名やメール欄にURLリンクを埋め込めなくした(SPAM対策) # 2007/05/18 3gppファイルのPC再生リンク先がpocketPC用ソフトだった。修正 # 2007/05/18 urlタグのみを使ったSPAMに対する判定抜けを修正 # 2006/12/25 youTube埋め込みサイズを320x240から425x350に変更 # 2006/12/13 FLV(Flash Video)動画データに対応 # 2006/12/13 アップロード上限値を拡大(30MB) # 2006/11/02 youTube投稿に対する返信コメントが自動改行しない問題に対処 # 2006/10/29 返信記事へのyouTubeタグの埋め込み許可を設定できるようにした # 2006/10/23 SPAMワードのデフォルトから「動画」「新着」等10個を削除した。 # 2006/10/20 SoftBankモバイル対応 # 2006/10/14 youTubeの埋め込み許可機能のセキュリティチェック処理を強化 # 2006/10/10 youTubeの埋め込み許可機能をためしに追加 # 2006/06/29 掲示板SPAM対策でURLリンクの個数を3個までに制限する機能を追加 # 2006/05/01 正規投稿,SPAMの誤認識防止目的で、SPAM_WORD指定欄を追加 # 2006/04/30 掲示板SPAM対策後に記事修正ができなくなっていた問題を修正 # 2006/03/27 掲示板SPAM対策を追加 # 2005/09/20 MQV形式(SONY独自 MoviePlayer形式)に対応 # 2005/09/20 tgz形式に対応.VC++ファイル廃止 # 2005/09/20 ASTEL用コード廃止 # 2005/04/20 VodahoneのAgent変更に対応 # 2005/01/15 画像アップ上限を越えると、縮小ソフトを案内するようにした # 2005/01/09 m4aファイル(MPEG-4 AAC Audio)対応 # 2005/01/09 nancy,3gp,ezmovieのPC再生用プレイヤーのURLを更新 # 2004/12/12 sage機能を追加 # 2004/08/28 blatj以外にsendまねーるに対応した # 2004/07/13 投稿通知メールが180文字以上で全文カット→後半カットに仕様変更 # 2004/05/23 検索で大文字小文字同一視できなくなっていたバグを修正 # 2003/07/21 Windows版Apacheとblatjの相性問題を修正 # 2003/07/21 Rev.6.1aで返信欄のフォント色を指定できなくなっていた問題を修正 # 2003/06/07 表示モード変更、削除時にPAGEを記憶して同じPAGEへ戻るように改良した # 2003/04/10 管理者モードの返信部分の背景色が黒の場合、文字が見えなくなる問題に対応 # 2003/03/18 iモーションの3gp拡張子のファイルに対応 # 2003/03/15 秒まで一致した同時投稿で親子関係がおかしくなる問題を修正 # 2003/03/15 GUSTパスワードが自宅サーバで動かない問題を修正 # 2003/03/15 Win環境でも投稿通知メールが出せるようにblatjに対応した # 2002/08/14 軽量ブラウザ「Opera6.0x」で記事に返信できない問題を修正 # 2002/08/02 アイコンの並び順を変更できる機能を管理メニューに追加 # 2002/06/11 EZ音声の拡張子がsmdになっていたのをpmdに修正 # 2002/05/17 無料プロバイダ「トクトク」で管理メニューが動かない問題に対処 # 2002/05/12 Netscape4.x(Linux版)の文字化け予防対策を追加 # 2002/04/23 Netscape4.xの文字化け予防対策を強化 # 2002/04/05 JSKY-スーパメールデータ対応、AUのezmovie対応部を追加 # 2002/04/01 要望に応え、会員パスワードを複数設定できるようにした # 2002/02/16 削除キー式にした場合、キーをクッキーに記憶できるようにした # 2001/11/28 返信なしにした場合、「ワード検索」等が無効になる点を修正 # 2001/10/03 管理メニューにWebParts(アイコン・背景画像等)の置き場を追加 # 2001/09/27 画像ファイルの推奨サイズを注意文で表示できるようにした。 # 2001/09/27 修正時に管理人のクッキーが記事の所有者のものになる点を修正。 # 2001/09/20 携帯モジュールとの整合で下記機能を修正。 # 2001/09/10 レスのついた記事を先頭へ持っていく機能の追加 # 2001/08/20 自動URLリンクを小修正した # 2001/08/13 会員パス使用時、会員パスでも管理パスでも投稿OKにした # 2001/08/08 暑苦しい感じがするので背景を明色系に変更した(季節限定) # 2001/07/10 無料プロバイダートクトク(tok2)でクッキーが保存できない現象に対処 # 2001/05/25 携帯対応モジュールの名前をimgboard_im.cgiからim.cgiと短くした。 # 2001/05/25 iモード以外の携帯の場合も、自動的にiアクセスへ転送できるようにした # 2001/02/24 特報独自のIP認証によるゲストパスワード削除(強く推奨)以外に、他の # 掲示板で一般的に使われている「削除キー方式」を選べるようにした # 2001/02/24 投稿に用いた携帯の機種名を表示するようにした # 2001/02/20 URL自動リンク機能をバージョンアップした # 2001/02/18 着メロ等、各種携帯のデータに対応した # 2001/02/18 デフォルトの画像ファイルとしてGIF,JPEG,PNGを受け入れるようにした # 2000/12/30 imgsize.plが見つからないときに500エラーにならないようにした # 2000/05/08 新imgsize.plにネイティブ対応。(IEでリサイズ時に画質向上効果あり) # 2000/05/08 記事中のURLを、自動的にリンクする「自動URLリンク機能」を追加 # 2000/01/08 使用禁止単語によるフィルタ、連続投稿リミッタなど、"荒し"対策を # 大幅強化(Rev.4) # 1999/12/01 styleタグを用いたイタズラを検出するフィルタを改良 (Rev.3a) # 1999/11/18 www5x.biglobe.ne.jpに対応 (Rev.3) # 1999/08/06 Win用WWWサーバAnHTTPdに対応(Rev.1c) # 1999/04/17 Mac Office98update 対策を追加(R1.21) # 1999/04/12 マックバイナリカッターを変更 # 1999/02/15 Mac IE4.X対策を追加 # 1998/09/20 リサイズ機能追加。管理者メール機能追加。 # 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.(著作権について) # 1.1当CGIの著作権及び使用許諾権は、1998特報倶楽部(以下 当方)が占有してお # ります。 # 2.(使用許諾) # ・このCGIは,当利用規定すべてに従っていただく場合に限り,個人,法人にか # かわらず,自由にカスタマイズし、無償で利用していただく事ができます。 # ・なお、ひとつでも満たせない項目があった場合は,基本的に、その利用を許諾 # しません。よくご確認ください。 # ・項目をすべて満たした場合も、当方がその使用を不適当だと認めた場合,その # 使用を中止させていただく場合があります.あらかじめご了承ください. # # 2.1 使用許諾条件 # A.当説明タイトル部(スクリプトの1行目-9X行:特に利用規定部(スクリプト # の5X行目-9X行目))および、掲示板下部の著作権表示部の改変をして # いないこと # B.改造および、カスタマイズしたスクリプトの無断再配布をしないこと。 # 特に、条件A,Bを満たさない場合は,その利用を一切禁止します。 # # 3.(制限事項について) # 3.1 改造、非改造を問わず、当方に無断で再配布することを固く禁止します。 # 3.2 日本以外の国籍のユーザを対象にした掲示板での利用を禁止します。 # 3.3 当著作権表示ならびに,掲示板下部の著作権表示とリンクを改変及び,削除 # することは固く禁止します。 # # 4.(非制限事項について) # 4.1 改造は御自由にしていただいて構いません (ただし3.3に注意して下さい) # 4.2 商用利用は御自由にしていただいて構いません(ただし3.3に注意して下さい) # 4.3 個人の利用、および法人の利用を許可します。 (ただし3.3に注意して下さい) # # 5.(免責事項) # 5.1 掲示板の管理責任は,100%その掲示板の設置者にあるものとします。当サイトは # その管理責任を一切負いません。 # 5.2 万一このCGIにより損害や不利益受けたとしても、当方は一切その責任を負う # 義務を持ちません.あらかじめご了承ください. # 5.3 当CGIに不具合、機能不足、バグなどがあった場合も、当方はその修正の義務を # 負わないものとします。 # # 6.(その他) # 当利用規定は予告なく改変、追記される場合があります。あらかじめご了承ください. ############################################################################### # 基本構成(初期設定はこの構成を前提に解説します) # # public_html(ホームページディレクトリ) # | # |-- cgi-bin(任意のディレクトリ705) # | # |--img-box(757 または 707)(画像保存用ディレクトリ) # | # |-- jcode_sj.pl (755 または 705)(ライト版の日本語ライブラリ) # |-- imgboard.cgi (755 または 705)(本体) # |-- imgsize.pl (755 または 705)(画像サイズ解析ライブラリ) # |-- file.dat (666 または 606)(記事データ保存用) # |-- fileback.dat (666 または 606)(上記ファイルのバックアップ) # |-- icon.dat (666 または 606)(WebPartsデータ保存用) # # ・( )内は属性(パーミッッション)です。最初、括弧内の左の数字で試し, # 動くかどうか確認して下さい。確認がとれたら、3文字の数字の真ん中を0に変更し, # 動作するかチェックして下さい。どちらでも正常動作できるならば、できるだけ # 右の方の値を使ってください。 # (一般にプロバイダにおいては、真ん中の数字を0にすると、セキュリティ的により # 厳しくなり、他人からファイルを書換えられたりする危険性が減って安全度が上がり # ます。ただし中にはCGIが動かなくなるプロバイダもありますので、この場合は # 左の値をご使用ください) # # ・file.dat,fileback.dat,icon.datは中身が空の同名ファイルをパソコン上で作成. # ftpで転送する(同封のファイルをそのまま使っても良い) # ・jcode_sj.plは中身を全くいじらずにそのままアスキー転送すること。 # ・これら4つのファイルはアスキーモード(テキスト)で転送すること。 # ・@nifty,wakwak,biglobe等は、上記基本構成とは異なるファイル配置や設定が必要に # なります。新FAQ掲示板に情報があるので、それを参考にして下さい # ############################################################################### #=======================================================================# # 初期設定 #=======================================================================# # # 先頭に#のある行は読み込まれません. # #==================================# # <必須設定項目> # #==================================# # $admin_passwd = 'ametalk'; # 管理人による記事削除時のパスワード # # (必ず変更してください) # $title = "画像掲示板(Light)"; # ↑「お気に入り or ブックマーク」保存時のタイトルになります。 # # ■<終了時戻り先URL> # # 掲示板の「終了ボタン」を押したときに、下記URLへ戻ります。 # (URLを下記デフォルトURLから変更しますと、ページにボタンが自動的に出現) $back_url ='http://あなたのプロバイダ/あなたのディレクトリ/index.html'; # # # ■<投稿画像の格納ディレクトリ> # # 投稿された画像ファイルを保存しておく場所です.整理を簡単にするため、また # セキュリティ確保のために、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指定は一部の該当者のみ設定する項目です。通常は設定不要なので # 当補足事項は無視して下さい。なお、@nifty,wakwak,biglobe等は、ここで説明 # したものとは異なるさらにまた別の設定が必要になります。新FAQ掲示板に情報が # あるので、それを参考にして設定して下さい) $img_url ='http://あなたのプロバイダ/あなたのディレクトリ/img-box'; # # # <携帯対応> # 携帯(iモード,FOMA,SoftBank,EZweb)からアクセスがあると、 # 下記ファイル名のCGIを探します。同じディレクトリに存在した場合は、 # 下記CGIへユーザを転送するようにナビゲートするページを自動で出し # ます。 # 携帯ユーザをiアクセスへ自動転送する(1=yes,0=no) $imode_redirect=1; # 探すCGI名 $imode_cgi_name= './im.cgi'; # # 案内する携帯アクセスCGIのURL $PM{'im_cgi_url'}='http://www.aaa.bbb.com/~myname/im.cgi'; # # <掲示データ保存ファイル名> # # テキストデータの保存用ファイルの名前です. # imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま. $file= './file.dat'; # # (R6 NEW) # # 管理者モードで使うWebPartsデータを保存するためのファイルの名前です. # imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま. $PM{'icon_data_file'} = './icon.dat'; # # <日本語コード変換ライブラリ> # # imgboard.cgiと同じ場所に入れる場合は、このパス指定のまま. # 注:jcode_sj.plはjcode.plの機能限定スリム版です。SJISへの変換機能のみ。 $jcode_name= 'jcode_sj.pl'; # # <画像プロパティ認識ライブラリ> # # imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま. $imgsize_prog="imgsize.pl"; # # # <掲示板SPAM対策> 2006.03 new # # 掲示板SPAMによる自動書き込み # (0=制限しない,1=制限する(デフォルト)) $limit_bbs_spam_flag=1; # # 上で"1"にした場合、隠しキーワードを決めてください。 # 掲示板SPAMは英語圏が多いので、彼らの苦手な日本語が # 良いでしょう。日本語の場合10文字までにしてください。 # なお、特定の文字はエラーがでると思いますので、 # うまく動かない場合は文字を変更してください。 # カタカナはNGです。漢字推奨。いろいろ試して問題のない # 文字列を探してください。 # $spam_keyword="針み歌す灰み"; # # 禁止単語によるSPAM制限 (SPAM_WORD) 2006.04 New # # URLリンクやメールアドレスがあり、かつ、特定の単語を本文に含む記事のみ # 投稿を失敗させます。NGワード指定では、広告でない記事がSPAMとして # ご認識されて会話に不都合が出る場合、こちらを使ってみてください。 # # (1=制限する(推奨),0=制限しない) $PM{'no_upload_by_spam_word'}=1; # @SPAM_WORD=(" 援交 ", " ヤリマン ", " セフレ ", " 人気AV " ," 飢えた女性 ", " 女の子検索 ", " 超高収入 ", " ヤリ放題 " ," 割り切 ", " パラダイス ", " 副収入 " #," 女性が "," エッチ "," ゲット "," ご指名 ", " セックス " #," 若い女性 "," 童貞 "," 出会い "," 人妻 " #," 旦那 "," サイトだよ "," 援助 "," 若妻 " ," 無修正 "," 完全無料 "," 推薦枠 " ," 逆援 "," 女性会員 "," 好みの女性 "," 極秘情報 " ," 妊娠契約 "," 素人女性 "," 女性登録者 "," 調教 "," 登録無料 " ," 逆指名 " ," サイトだよ "," 見放題 "," 若妻 " ," クス専売 "," ハイレプ "," copy33 "," brand188 " #," check "," thank "," More "," free "," here " #," online "," site "," visit " ," fuck "," porn "," links "," insurance "," cheap "," buy " ," Molto "," cheap "," blogspot "," Airfare "," Furniture "," Ashley " ," Casino "," Foxwoods "," Brighton "," Horseshoe "," Gambling "," Avalon " ," impresionado "," Sunglass "," Ringtones "," Loans "," Cingular " ," Insurance "," Lottery "," Highlander "," Cruise " ," merchand "," stock "," investment "," diabet " ," url= "," URL= "," viagra "," hydro "," store "," valium " ," generic "," drug "," prozac "," travel "," agency " ," mortgage "," gym "," mexico "," insurance " ," here "," discount " ," fetish "," pics "," adult "," teen "," stripper " #自動BBS-SPAM By R.kisaragi site # 以下全部同一IP66.71.248.210なのでパターンマッチ処理軽減のために # コメントアウトする # wwを多用する逆援体験自慢系のSPAM広告が多い場合は、#を外すこと #," onshaver.net "," anahorisan.com "," krieh.com "," sersai.com "," churappa.com " #," mlstarn.com "," 1g8sr4.com "," transaqtion.com "," mdern.net "," anusu.net " #," tometomes.net "," frskfrsk.com "," ometroro.com "," ikisugi.com " #," subekarazu.com "," sexi-sns.jp "," scantyend.com "," strowcrue.net " #," gatsbyy.com "," tsukimisou.net "," yaruodesu.com "," protobem.com " #," iphone5.net "," aportachannel.net "," waoooon.net "," cham-news.net " #," quitblue.com "," puripuritan.com "," adult-value.com "," opiece.com " #," churappa.com "," bolar.net "," xabrina.net "," onafriends.net " #," curucurupaa.net "," tokorogadokkoi.net "," jasdavis.net "," zeusean.net " #," kamerock.net "," chories.net "," arctries.com "," thebigmonitor.net " #," twwitta.net "," hun-kun.net "," thebigmonitor.net "," menslip.com " #," nyanyanyan.com "," tamatamanigittayo.com "," momoringo.net " #," younube.net "," cucuple.net "," grieh.net "," findeath.net "," 66.71.248.210 " #," bagww.com "," acmahsjfms.com "," gorioyaji.net "," nadamonty.net " #," korakoracola.net "," f-forward.net "," arctries.com "," chuebrarin.net " #," yaroudesu.com "," plusnote.net "," creampie2.net "," crackedpudding.com " #," dnews.net "," sexualtrend.com "," todonotsumari.com "," clayfis22fjs.net " #," betrun.net "," donby.net "," sikkaku.com "," yarashiku.com " #," sexnetcafe.net " # Other SPAM ," adult-value.com "," alturl.com "," yumenokuni.net "," oppao.net " ," au-au-a.net "," dwarfurl.com "," decenturl.com "," 2XLA.NJc9U7ty.com " ," candypop.jp "," yourfilejk.com "," mfiufv.com "," buta-infr.net " ," ccboys.net "," motomeai.net "," comoscomos.com "," lonparse.net " ," dodonpa50.com "," koreikura.net "," okamikakushi.net " ," bagshop2008.com "," yahoo-sale.net "," h-tomo.net " # 熊本デリヘル系 by http://whois.domaintools.com/b-blooming.com ," sexy-g.jp "," bigbaito.com "," deli-rakuten.com " ," firstlips.com "," forfun.jp "," hey-sey.com " # 中国語含む広告をはじく ," G "," "," 胛 "," 萵 "," 趺 "," 瑙 "," M "," 小妹 " ," 模擬器 "," 軟件 "," F "," 肛裨 "," 褊 "," 舮 "," 竟 " ," 颪 "," 恷詰 "," 爾芦 "," 原奉 "," 滯 "," 圦 "," 錚 " # SPAMが多い国へのリンクを含む投稿をSPAMとする # ロシア(ru) 中国(cn) 韓国(kr) 香港(hk) 台湾(tw) # アルゼンチン(ar)、ブラジル(br)、イギリス(uk) ," .ru/ "," .cn/ "," .kr/ "," .fi/ "," .hk/ "," .tw/ " ," .ar/ "," .br/ "," .uk/ " ," 偽善者 "," 捏造 "," 無料配布中 " ," 素人娘 "," 大放出 "); # # IPアドレス指定型 SPAMフィルタ機能の追加について(2010.02 ) # # ドメイン名を50以上(中には100以上)持つ業者も多いですが、 # リンク先の実IPアドレスは1、あるいは数個以下の固定IPである # ケースがほとんどです。 # 従って、ドメイン名をリストに追加して一つ一つ排除する方法より、 # リンク先の固定IPを調べ、禁止リストに追加して、SPAMを排除した方が、 # 50〜100倍効率が良いです。 # ドメイン名からIPアドレスを調べるには、ネットに接続した状態で、 # MS-DOSコマンドラインで「ping ホスト名」を入力すれば、結果として表示されます。 # そのIPアドレスを@SPAM_HOSTS_IPに追記してください。 # @SPAM_HOSTS_IP=("66.71.24?.","66.71.25?.","221.231.138.","18.243.22.64" ,"210.173.241.","209.160.32.22?","58.1.229.8?","202.172.28.15?" ,"69.64.147.","203.135.19?.?"); # # 2006.06 URLリンク列挙型SPAM対策 # # SPAMワードがひっかからなくても、本文中にURLリンクが4つ以上ある場合は # 書き込めないようにします。 # (1=制限する(推奨),0=制限しない) $PM{'spam_url_link_limit_4'}=1; # # 2007.05 外国からのSPAM # # 英語のみの投稿は書き込めないようにします。 # 外国からのSPAM防止に有効です。 # (1=制限する(推奨),0=制限しない) $PM{'spam_limit_non_japanese'}=1; # # 2007.06 SPAMらしきメールアドレス # # メール欄のメールアドレスがSPAMに多い国のドメインの場合 # 投稿を書き込めないようにします。 # 外国からのSPAM防止に有効です。 # (1=制限する(推奨),0=制限しない) $PM{'no_upload_by_spam_country_mail'}=1; # # SPAMが多い国へのメールアドレスを自称する投稿をSPAMと判定する # ロシア(ru) 中国(cn) 韓国(kr) 香港(hk) 台湾(tw) # アルゼンチン(ar)、ブラジル(br)、イギリス(uk) @SPAM_MAIL_COUNTRY=(".ru",".cn",".kr",".fi" ,".hk",".tw",".ar",".br"); # # 以上の様々な対策を指定しても効果がない場合、 # まずは、投稿パスワード制にすることを考えてください。 # SPAMはロボットで自動的に効率よく投稿してきますので、 # パスワードを類推されにくい位置に記述しておけば、解読される # 可能性は低いです。 # # さらに、以上の様々な対策を指定しても効果がない場合、 # 以上の様々な対策を指定しても効果がない場合、 # あらゆるSPAMをとにかく問答無用で排除したい場合は # 以下のフラグを使ってください。(通常は指定しないこと) # # URLリンクやメールアドレスのある書き込みを、問答無用ですべて廃棄 # (0=廃棄しない(デフォルト),1=廃棄する) $filter_bbs_spam=0; # #=====================================================================# # <以下,必要に応じて設定> # # # 以下の設定は,すべてオプションです。 # # 大抵のプロバイダの場合、特に変更しなくてもスクリプトは動きますので, # 一度この状態でスクリプトを動かしてみてください。 # 1.正常に動かなかった場合, # →新サポート掲示板や新FAQをみて,問題を解決してみてください。 # # 2.正常に動いた場合 # →いろいろ細かくアレンジできるようになっていますので, 以下のオプション # 項目へ進み、自分流にオプションを設定し,アレンジしてみてください。 #=======================================================================# #================================# # <掲示板機能 基本オプション> # #================================# # # ■<転送許可画像サイズ上限> # # ファイル投稿時、このCGIは他のテキスト系CGIよりも多くのメモリリソース # を必要とします。これはアップロードしたファイルの復元処理にバッファが必要な # ためであり、必要なメモリ量は転送された画像サイズに比例します。非力なサーバ # を使用している場合は、自然とアップロードサイズを小さくする必要があり、そう # しないと処理はタイムアウトして止まりますのでご注意下さい。 # # サイズ制限(画像以外) # デフォルト9000KB(99000KB以上にはしないこと。) #$max_upload_size = 9000; # 単位KB $max_upload_size = 99000; # 単位KB (TODO リリース前に修正) # # サイズ制限(画像) # デフォルト200KB(埋めこみ表示が遅くなるので500KB以上にはしないこと。なお # ユーザが下記で指定したサイズ以上の画像をアップロードしようとすると、投稿 # できないというメッセージが表示されると同時に、PCやMacで使える無料の # 画像縮小ソフトの案内が出るようになっています。) $max_upload_img_size = 500; # 単位KB # # # ■<推奨画像サイズ表記の値を決める>(R6 NEW) # # R6では、本当のリミッタとは別に「推奨サイズ」を掲示板下部の注意文に表示 # することができるようになりました。管理人が最も歓迎する画像のサイズを書いて # と良いでしょう。なお、この値はただ表示されるだけです。 # (1=注意文のところに推奨サイズを出す(推奨),0=出さない) $disp_rcmd_upload_size_flag = 1; # # デフォルト80KB # (通常ホームページ上でのJPEG画像のサイズは25−50KB程度です。また携帯等では # 100KB以上のデータが表示できない機種が多いので、100KB以下に設定すると良いで # しょう) $rcmd_upload_size = 80; # 単位KB # # ■<保存記事数> # # この件数を超えると、古いものから記事は削除されます.(記事と画像は # 同時に消えます)。 # デフォルトは150.極端に増やすとHP容量を圧迫しますので、ご注意ください。 # # --注意点-- # 画像データ削除時は、掲示板を用いて削除して下さい。 # # (ワンポイント)返信には画像を添付できませんが記事としては、1記事として # カウントされます。したがって返信機能をオンにされる場合は、保存記事数を、 # 従来の2-3倍にしておくと良いでしょう。 $max_message = 350; # # ■<1ページに表示する 親メッセージ数> # # デフォルト5 # 1ページに表示する親メッセージの数です。IEの場合、数を多くすると、 # 表示時に少し時間がかかりますので、5程度を推奨します $disp_message = 5; # # ■<返信機能>(R6 NEW) # # 返信機能を使うことができます。 # (1=返信機能あり(推奨),0=返信機能なし) $PM{'use_rep'} = 1; # # 古い記事に最近ついた返信を見過ごさないように、返信がついた記事の # スレッドを自動的に先頭へ持って行くことができるようになりました。 # (1=先頭へ持って行く(デフォルト),0=持っていかない) $PM{'res_go_up'} = 1; # # 古い記事に返信しても先頭へ持っていかないように # ユーザが投稿時に選ぶようにもできます。 # (いわゆる「sage」機能です) # (1=sage有効(デフォルト),0=sage無効) $PM{'use_sage'} = 1; # #==================================# # # #==================================# # # ■ <画像表示モードのユーザ選択> # # imgboardでは、画像の表示モードをユーザ側が自由に選択できるようになってい # ます。つまり、絵を直接貼り付ける、貼り付けない(リンクのみ)、アイコンサイ # ズにする、固定サイズにする等の「表示モード」の選択を、アクセスするユーザ自 # 身が自由選択できます。(ADSL/ISDN/モデム等の通信速度、環境等の条件により、最 # 適表示モードはユーザ毎に異なりますので)。 # なお、一度選択した表示モード設定は、クッキーに記憶され、次回アク # セスから、それが相手のデフォルトとして選択されるようになります。 # # この機能を無効化して、掲示板管理者の方で表示モードを固定したい場合は、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=5; # デフォルトは5 # # --注意点-- # 埋め込みする場合は,ページのロードが遅くなりますので、1ページ当たりの発言 # 表示個数を少なめ(5程度)にした方がいいでしょう.画像の大きさも小さ目(100KB)に # 制限した方が運営が経験上うまくいくようです。 # # ■ R5 NEW # マイクロソフトのIEからアクセスされた場合、上記選択から計算で求められた画像 # 指定サイズをそのまま真正直に適用すると、元画像との縮尺とIEのレンダラ(画面 # 描画プログラム)の相性により画質が極端に悪くなる場合があります(被写体の目が # 潰れて白目をむいて見えたり、全体に縞模様が入ったりします)。 # imgboardでは、それらの現象を防ぐために、imgsize側に指定値を補正するフィルタ # を開発しました。以下のパラメータを0以外にすると、画質を損ないにくい既知の倍 # 率へリサイズ値を微調整します。なお、当処理により表示画質がかなり向上しますが、 # 先に指定した「埋め込みサイズ」から、微補正されるため、様々なサイズの画像が # 混在する場合は、「横サイズ固定」等にしても微妙に揃わなくなります。 # この点にご注意ください。 # # 2=画質最優先し、imgsizeが、かなり補正することを許可する。 # 1=画質優先し、imgsizeが、少しだけ補正することを許可する(推奨) # 0=指定サイズの正確さを重視して、一切補正はしない $CIMGSIZE{'smooze_mode'}=1; # # ■ <マルチデータアップロード可能にする> # 当掲示板は、GIF,JPEG,PNG以外に様々なタイプのデータも投稿できるようにすること # ができます。(動画,音声,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; $allow_other_multimedia_data=1; # TODO # # ■ <保存ファイル名の指定> # # 当掲示板ではセキュリティ保全のため、自動的にファイルのリネームをします。 # ファイル名の重複を防ぐために、1.20以降では,時刻ペースの命名法をするように # なりました。 # # ○ <元のファイル名を使用する> # imgboardをバイナリファイルのアップロードツールとして使用し、ファイル共有 # 用途に用いる場合、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'} =0; # 題名 (デフォルト0) $CHECK{'body'} =0; # 本文 (デフォルト0) $CHECK{'img'} =0; # 添付画像(デフォルト0) $CHECK{'rmkey'} =0; # 削除キー(デフォルト0)# ←現在未使用 # # 必須項目が入力されなかった場合は、警告を出して、ユーザに # 入力を促すことになりますが、そのときに出すメッセージの # 内容を以下で変更できます。 # $CHECK_E{'name'} =qq|名前がありません。
|; $CHECK_E{'email'} =qq|emailがありません。現在の設定ではemailは必須項目となっています。
|; $CHECK_E{'subject'} =qq|題名がありません。
|; $CHECK_E{'body'} =qq|本文がありません。
|; $CHECK_E{'rmkey'} =qq|削除キーがありません。
|; $CHECK_E{'img'} =qq|添付画像がありません。
|; # # 以下は入力項目を増やす機能(imgboardでは6つまで入力項目を増やせます)を使っ # て、項目を増やした場合用 (増やしていないユーザは設定しても関係ありません)。 # # $CHECK{'optA'} =0; # 追加項目optA (デフォルト0) $CHECK{'optB'} =0; # 追加項目optB (デフォルト0) $CHECK{'optC'} =0; # 追加項目optC (デフォルト0) $CHECK{'optD'} =0; # 追加項目optD (デフォルト0) $CHECK{'optE'} =0; # 追加項目optE (デフォルト0) $CHECK{'optF'} =0; # 追加項目optF (デフォルト0) # $CHECK_E{'optA'} =qq|optA がありません。
|; $CHECK_E{'optB'} =qq|optB がありません。
|; $CHECK_E{'optC'} =qq|optC がありません。
|; $CHECK_E{'optD'} =qq|optD がありません。
|; $CHECK_E{'optE'} =qq|optE がありません。
|; $CHECK_E{'optF'} =qq|optF がありません。
|; # # # ■ <時差> # # 海外サイトに設置した場合、投稿時刻が現地時刻になってしまいます。 # これを日本時刻に修正する場合には、以下の項目で時差を設定してください。 # (設定例) 時差を15時間にする場合 $gisa=15;という風に設定してください。 # $gisa=0; # 時差(h) # # ■ <自動URLリンク> # # 記事中にURL,メールアドレス等が含まれる場合、自動的にリンクにします。 # なお、youTubeタグ埋め込み機能利用時は必ず1に設定してください。 # (1=自動リンク(推奨),0=自動リンクしない) $auto_url_link=1; # # 自動リンクON時、secondfile://で始まるSecondlifeアドレスを # 自動的にリンク扱いします。 # (1=リンクする(デフォルト),0=表示しない) $PM{'auto_secondlife_link'} = 1; # # ■ 2010NEW # # 記事スレッドをtwitterで紹介しやすくする # リンクを、各スレッドにつける場合は、 # 以下のフラグをONにしてください。 # (1=リンク表示(推奨),0=表示しない) $PM{'use_twitter_link'} = 1; # # 追加のハッシュタグを定義(5文字以内) # 末尾は必ず半角空白を1つ入れてください #(例)$PM{'twitter_hash01'}="#dog "; $PM{'twitter_hash01'}=""; # # テキスト(英半角文字5文字以内) # #$PM{'twitter_mes01'}="Watch it"; $PM{'twitter_mes01'}=""; # # ■ <新着表示> # # 最新投稿3記事に(new)を添えて表示します # (1=表示する(デフォルト),0=表示しない) $PM{'disp_new_notice'} = 1; # #==================================# # <セキュリティ オプション> # #==================================# # # <投稿者用パスワード> # # 投稿時にパスワードをチェックし、正しい場合だけ登録するようにできます. # 掲示板の完全公開運営に不安がある場合は、この機能を用いて会員制にする # ことをおすすめします.パスワードは一度入力するとクッキーに記憶されま # すので、次回投稿から入力は不要です。なお、1を指定すると自動的に項目が # フォーム欄に出現します。 # (1=使用,0=使用しない) $use_passwd_flag=0; # 会員パスワード @MEMBER_PASSWD=("nodame","","",""); # # <タグ使用許可> # # コメント中にタグを許可するかどうかを指定できます。許可すればユーザ表現の # 自由度は上がりますが、タグの閉め忘れ等によりトラブルが発生する可能性が # あります。なお、タグを許可する指定にしても、掲示板に対するイタズラ予防のため # 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; # # # # 動画共有サイトの埋め込みタグの許可を例外的に # 認める場合は、以下のフラグをONにしてください。 $use_youtube_tag_in_comment=1; # # URLチェック # # 許可する動画共有サイトのドメイン名を指定してください。 # アダルト審査が甘いサイトを許可した場合、管理リスクや # 動画スパムの脅威が高まります。荒れる場合はyoutubeだけ許可されるとよいでしょう。 @DOUGA_KU_DOMAIN=('www.youtube.com','www.dailyymotion.com','www.ustream.tv',''); # # 2=厳密(上記で許可したドメインのみ)(推奨) # 1=に限定しない # なお、2以外にした場合、セキュリティ的にリスクが # 増大しますので、覚悟の上で設定してください。 $yt_check_level=2; # # # 返信記事に動画共有サイトのタグ埋め込みを許可するかどうか # ルールを決めてください。 # (1=許可,0=非許可(推奨)) $allow_youtube_tag_in_res=1; # # youTubeのH.264高画質表示指定 2008.06 new # 指定するとH.264表示用のオプションfmt=18をyouTubeのURLに追加します # (1=指定する(推奨),0=指定しない) $youtube_h264_flag=1; # # # (注意)返信への埋め込み許可等はyouTubeの設定と同じポリシになります。 # # <ニコニコ動画関連タグ許可・非許可> NEW # # ニコニコ動画の埋め込みを例外的に認める場合は、 # 以下のフラグをONにしてください。 # (1=許可,0=非許可(推奨)) $PM{'auto_nicovideo_find'}=1; # # 返信記事にニコニコ動画の埋め込みを許可するかどうか # ルールを決めてください。 # 非許可にした方が話題が発散しないと思います。 # (1=許可,0=非許可(推奨)) $allow_nicovideo_in_res=0; # # NEW # # ClipLife動画の埋め込みを例外的に認める場合は、 # 以下のフラグをONにしてください。 # (1=許可,0=非許可(推奨)) $use_cliplife_tag_in_comment=1; # # チェックの厳密さ(厳密なほうが安全ですが、その場合向こうのURL仕様が # 少しでも変更されるとエラーになります) # 3=かなり厳密;2=そこそこ厳密(推奨);1=cliplife.jpなら許す; $cliplife_check_level=2; # # NEW # # ストリートビューの画像埋め込みタグの許可を例外的に認める場合は、 # 以下のフラグをONにしてください。 # (1=許可(推奨),0=非許可) $use_stview_tag_in_comment=1; # # Google Mapの地域限定フィルタを設定できます # 地域限定がない場合、諸外国版のGoogleMapを利用できますが、 # 海外からスパム的に多数の土地をロケ推奨される可能性があります。 # 通常は2にしてください。 # 3=日本地域限定;2=日本+米国地域(推奨);1=地域限定なし; $stview_check_level=2; # # # <各種掲示板荒し対策> # # (レベル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??", "66.71.248.21?","osaka.nt.ftth?.ppp.infoweb.ne.jp","oska.nt.adsl.ppp.infoweb.ne.jp", ".yournet.ne.jp","dy.bbexcite.jp",".u-netsurf.ne.jp","kcn.ne.jp",".u-netsurf.ne.jp", "wave.home.net","202.231.144.1??", "agcs.com","utsunomiya-ppp-*.interq.or.jp"); # # イタズラをするユーザの中には、ホスト名による制限を逃れるために、自分のホスト # 名情報を出さない設定にしている人がいます。これらホスト名を出さないユーザから # の投稿を禁止するかどうかを以下で決めて下さい。(1=禁止する,0=禁止しない(推奨)) $no_upload_by_no_RH_user=0; # # (レベル2)禁止単語による制限 (BLACK_WORD) # # 特定の単語を本文に含む記事の投稿を失敗させます。前述の手段を用いても"荒し" # や "宣伝広告の嵐" がどうしても収まらない場合、あるいは、ホスト名を頻繁に変 # えるユーザからしつこいイタズラを受けている場合に、最終手段として使ってみて # ください。 # (1=制限する,0=制限しない(推奨)) $PM{'no_upload_by_black_word'}=0; # # マッチした場合のエラーメッセージ(変更可) # (排除されたことが相手にわからないように、できるだけ、 # 無意味なものにしてください) $PM{'error_message_to_black_word'}="CGI error code 2244 NBW"; # @BLACK_WORD=(" しねしね "," 死ね "," 制裁 " ," ユダヤ "," ごみ以下 " ," 雑魚 "," 罵 "," 童貞 "," 傍観者 " ," 女性登録者 "," 調教 " ," porn "," ウンコ " ," 偽善者 "," わらい "," 捏造 "," adult "," teen "," stripper " ," fetish "," pics " ," 素人娘 "," ビデオを大放出 "); # # <連続投稿回数制限> # # イタズラを防ぐために、同一ユーザからの連続投稿回数を掲示板側 # で制限できます。 # (1=制限する(デフォルト),0=制限しない) $limit_upload_times_flag=1; # # 上で"1"にした場合、どれだけのサンプリング期間の間に最大何回までアップ # ロード許可するかを決めてください。(オーバすると投稿エラーになります) # # サンプリング期間 (day,1hour,10min,2min,1minを選択可。デフォルトは2min) $upload_limit_type="2min"; # 回数。デフォルトは5回 $upload_limit_times="5"; # # <超長文テキスト投稿による荒らし対策> 2004.05 new # # 無意味な超長文のテキストを投稿し、いたずらする人への対策です。 # その場合は、入力フォームのHTMのTEXTAREAタグにおいて、MAXLENGTHを # 小さくしてください(デフォルトは10000文字になっています)。 # なお、MAXLENGTHで指定する文字数は英語換算ですので、日本語だと1文字 # で2になります。つまり、MAXLENGTH=10000なら、日本語で5000文字までです。 # # <連続改行による荒らし制限> 2004.05 new # # 文字数制限をすると、無意味な連続改行だけしたテキストを投稿して # いたずらする人がいるそうです。そういう人に困っている場合はテキ # スト部分の総行数を制限する機能を使ってください。 # (0=制限しない(デフォルト),1=制限する) $limit_body_cols_flag=0; # # 上で"1"にした場合、どれだけの行数まで許可するかを決めてください。 # (オーバすると投稿エラーになります) # # 本文の改行許可数 $body_text_max_cols="40"; # # <トリップ機能による、なりすまし防止> 2010.02new # # 名前#任意のワードでトリップを表示できるようにしてみました。 # 他人のなりすましで、掲示板が荒れる場合は、これをお使いください。 # # (1=トリップ機能を使えるようにする(推奨),0=しない) $PM{'use_trip_flag'}=1; # # <自動バックアップ> # # 定期的に記事を自動バックアップする機能がつきました。前回バックアップファ # イルを作成した日から間隔日以上空いて、新規登録があると、そのタイミングで # バックアップファイルを更新します。なお、バックアップは記事が5件以上ある # 場合にのみ動作します。 # # 自動定期バックアップを使用# # (1=使用する(デフォルト),0=使用しない) $PM{'make_backup_file'} = '1'; # # バックアップする間隔(日) $PM{'backup_day_interval'} = '7'; # # バックアップファイル名(セキュリティ上の理由より、適宜変更して使うことを推奨) $PM{'backup_file_name'} = 'fileback.dat'; # # <管理者自動メール> sendmail # # 新規記事が登録されると、下記メールアドレスにメールで通知します。 # この機能を使用する場合は、以下の三つの情報をすべて確実に指定してください。 # これらの情報を間違えると、サーバ管理者へ迷惑をかけるので、必ず管理者に確認 # してから慎重に設定を行ってください。なお、この機能が使えるのはプロバイダ # がUNIX系のユーザのみです。(Mac,Win不可)設定がよくわからない場合は使用し # ないでください。 # $use_email =0; # (1=yes,0=no)デフォルトは0 # # メールプログラムのパス # 普通のプロバイダの場合は'/usr/lib/sendmail'等になる(プロ # バイダにより異なるので、詳細はCGIを設置するプロバイダに聞く)。 # 自宅サーバの場合は'D:\blatj\blatj.exe'等を設定する $mail_prog = '/usr/lib/sendmail'; # # 管理者のメールアドレス(あなたのメールアドレス) $recipient = 'yourname@your_provider.ne.jp'; # # メール本文に画像のURLリンクを作るため、画像保存ディレクトリのURLを指定して下さい。 $img_dir_url='http://yourprovider/yourname/imgboard/img-box/'; # # <ちょっとおやすみ> oyasumi # # 旅行に出かける等、しばらく掲示板をお休みしたい時は0にしてください。 $bbs_open_flag=1; #(1=yes,0=no)デフォルトは1 # おやすみ時のメッセージ(適宜変更) # $oyasumi_message=qq| 管理者旅行中のため、しばらくお休みします。
またのお越しをお待ちしております。 |; # # # その他変数の初期化 $PM{'flock'} = '1'; # flockを使う $PM{'use_crypt'} = '1'; # 暗号化を用いる # #===============================================# # <外部の設定ファイルのロード(1.21以降)> # #===============================================# # # カスタマイズしたHTMLや設定したパラメータ等を外部からロードします。 # バージョンアップによる引越しやカスタマイズが楽になります。 # # 外部設定ファイルを使う(1=yes,0=no) $load_ext_config =0; # # (一例)マスコットアイコン付き掲示板に変更できる外部設定ファイル $ext_config_name ="set_icon624.cgi";# 設定ファイル名(拡張子は必ず cgiに) # # #=========================================# # <HTML詳細設定項目オプション> # #=========================================# # #==========================# # HTML全体のデザイン #==========================# # # # $PM{'body_bgcolor'} ="#FAF0E6"; # 全体の背景色 $PM{'body_text'} ="#2A3A3A"; # 基本フォント色 $PM{'body_link'} ="#6060FF"; # リンク色 $PM{'body_vlink'} ="#4040FF"; # 既アクセスリンク色 $PM{'body_background'} =""; # 背景画像名 # # (ワンポイント)一般の掲示板の背景色は明色系が多いのですが、画像掲示板の # 場合は、濃い暗めの背景色を選んだ方が写真や画像が見やすくなります # # (注意)返信欄の基本フォント色は、「返信欄のデザイン」の部分で指定します # #==========================# # 掲示板最上部のデザイン #==========================# # # <最上部テキストタイトル > # <最上部画像タイトル > # <最上部埋め込みバナー > # # <HTML抜粋>以下のsub top_htmlで直接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=#810808 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_bg ="bgcolor=#ECAC8E"; # 欄の基本背景色(IE用) $ie_bg2 ="bgcolor=DEB887"; # "画像選択" 欄 $ie_bg3 ="bgcolor=DEB887"; # "画像の題名"欄 # # # < フォーム欄の(題名)をクッキーに記憶させない > # # R5.2以降、デフォルトでは題名を記憶しないに設定にしましたが、 # これを記憶する設定にしたい方は以下のフラグを0にしてください。 # $no_cookie_for_subject=1; # #==========================# # 記事部のデザイン #==========================# # # <HTML抜粋>以下で直接指定してください。 # #==========================# # 返信欄のデザイン #==========================# # # < 返信欄の背景色/背景画像の指定 > # # 返信欄の背景色/背景画像をここで指定できます $res_table_sitei="bgcolor=#F0E0D6"; # # (ワンポイント) # 背景画像を指定する場合の書き方「$res_table_sitei="bgcolor=#F0E0D6";」 # 背景画像を指定する場合の書き方「$res_table_sitei="background=res_haikei.gif";」 # # 返信欄のフォント基本色 $res_base_font_color="color=#404040"; # # #==========================# # HTML--下部のデザイン #==========================# # # フリーのCGIサイト等で掲示板下部へのバナー広告を義務付けられている # 場合は、ここにHTMLソースを書いてください。挿入ポイントは削除ボタン # の直上になります。なお、バナーには必ずHeight,Widthを追加指定してく # ださい # $html_for_bottom_banner=qq| |; # #=============================# # HTML--ボタンのデザイン #=============================# # 2010.04 ページ直接指定できるようにした # sub output_button_HTML{ # $PM{'use_direct_page_link'} = 1; # print ""; if($pre_page > 0){ # 先頭へジャンプ if($pre_page > 0){ print ""; print "<\/FORM>\n"; } # 前の?件へジャンプ print ""; print "<\/FORM>\n"; }else{ print ""; } # 下部のページ切替えボタンのHTML if($next_page <= $total_page){ print ""; print "<\/FORM>\n"; }else{ print ""; } print "
"; print "
"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$POSTADDP{'BUTTONTOPFORM'}\n"; # 将来拡張用 # ワード検索時のページ変更ボタンは検索パラメータを引きずっていく if($FORM{'mode'} eq "search_menu"){ print "\n"; print "\n"; print "\n"; } print "\n"; print "
"; print ""; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$POSTADDP{'BUTTONPREVFORM'}\n"; # 将来拡張用 # ワード検索時のページ変更ボタンは検索パラメータを引きずっていく if($FORM{'mode'} eq "search_menu"){ print "\n"; print "\n"; print "\n"; } print "\n"; print ""; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$POSTADDP{'BUTTONNENTFORM'}\n"; # 将来拡張用 # ワード検索時のページ変更ボタンは検索パラメータを引きずっていく if($FORM{'mode'} eq "search_menu"){ print "\n"; print "\n"; print "\n"; } print "\n"; print "これより先のページはありません
"; # ページ指定:ダイレクトリンク 2010.04 if($PM{'use_direct_page_link'} == 1){ if($total_page > 2){ print "

   ページ指定:[ "; for($i=1;$i<=$total_page;$i++){ local($tttt_ldflag)=0; if($i == $disp_page){ $tttt_ldflag=0; print "$i /\n"; }else{ $tttt_ldflag=0; if($i <= 20){ $tttt_ldflag=1; }elsif($i <= 50){ $tttt_ldflag=1 if(($i % 5) == 0); }elsif($i <= 100){ $tttt_ldflag=1 if(($i % 10) == 0); }elsif($i <= 400){ $tttt_ldflag=1 if(($i % 50) == 0); }elsif($i <= 1000){ $tttt_ldflag=1 if(($i % 100) == 0); }elsif($i <= 10000){ $tttt_ldflag=1 if(($i % 1000) == 0); }elsif($i > 10000){ $tttt_ldflag=1 if(($i % 1000) == 0); } } if($tttt_ldflag==1){ print "$i /\n"; } } print "]
"; } } } # #==========================# # その他のデザイン #==========================# # # <HTML抜粋>以下で直接指定してください。 # # ===================<HTML抜粋>========================================== # # ユーザサイドでHTMLを変更しやすいように,スクリプト中のHTML定義部分を # プログラムから以下に抜き出し列挙してあります.それぞれ,print< # #=====================================# # # HTMLヘッダ,ボディ指定.タイトル等画面最上部のHTMLです # # print< $title$top_html_header $body_tag_f
$PM{'INS_POINT_TOP01'}
$PM{'INS_POINT_TOP02'}

    画像Upload掲示板 (Ver.122)

    3携帯,iPhone,iPad,Android対応版&スパム対策Ver.2.5
HTML_END } # #=====================================# # <HTML--アンカーリンク部分> # #=====================================# # # フォームの下にある[ワード検索]、[携帯対応]、[管理等]のアンカーリンクを # 作る部分のHTMLです。 # # (ワンポイント) 他にリンク等を追加したい場合はここへリンクを # 追加すると収まりが良いでしょう。 # # 2010.03 Windows7/iPhone/iPad/Android等のタッチ液晶対応のためリンク文字を離した # sub link_top_html{ print< $cm_out_exit_h [ トップに戻る ] $cm_out_exit_f [ ワード検索 ] [ 携帯対応 ] [ 管理 ]     HTML_END } # #=====================================# # <HTML--画面中央の説明> # #=====================================# # # 真ん中の説明部分のHTMLです. # # (ワンポイント) # 「パソコン」の部分に「\」が入っているのは文字化け防止のためです。 # 文字化けする場合はこの例のようにテキストの間に「\」を入れると良い # でしょう。 # sub middle_A_html{ local($mes_01); if($allow_other_multimedia_data==1){ $html_mA01="ファイル"; }else{ $html_mA01="画像"; } if($disp_rcmd_upload_size_flag==1){ $mes_01=qq| 推奨$rcmd_upload_size KB以下\/|; } print<
  • パ\ソ\コ\ン、携帯上の$html_mA01を,アップロードできます.($mes_01画像最大$max_upload_img_size KB/画像以外$max_upload_size KBまで)
  • 著作権上問題があるものはアップロード(埋込表\示含む)、および、ダウンロードしないでください。広告宣伝の投稿も禁止です。
  • $auto_url_message $tag_siyou_tyuui
HTML_END } sub middle_B_html{ # 追加説明 if($HTTP_USER_AGENT=~ /ipod|iphone|android|safari/i){ $iPhone_mes_01=qq|

iPhone/Androidで画像拡縮→画像を指でダブルタップ!

|; }elsif($HTTP_USER_AGENT=~ /ipad/i){ $iPhone_mes_01=qq|

iPadで画像拡縮→画像 or ファイル名リンクを指でクリック!

|; } print<
  • 新しい記事から1ページ $disp_message 件毎に表\示\。最高$max_message件の記事が記録され、 それを超えると古い記事から削除されます
$iPhone_mes_01
HTML_END } # #=====================================# # <HTML--投稿記事部分> # #=====================================# # # imgboardではユーザが「表示モード」を選択できるようになっています。 # そのため、テキストリンク、アイコンサイズ、固定サイズ、原寸などの # それぞれの「表示モード」により個別の記事部レイアウトを変更しなけ # ればなりませんが、それぞれ非常に良く似てますので、ここでは基本レイ # アウト2パターン(画像が小さい場合の基本レイアウト/画像が大きい場合 # の基本レイアウト)を定め、それの一部分($html_block_A)をすり替える # ことにより、全「表示モード」をカバーするものとします。レイアウトを # 自分で変更したい場合は以上の点を理解した上で、編集してください。 # # 1.レイアウトパターン1/ 画像が小さい記事系のレイアウト # (----テキスト記事、テキストリンク表示、アイコンサイズ表示用----) # # (注)レイアウト中の $html_block_Aには後述のブロックが代入されます。 # sub kiji_base_html{ print< $tmp_subject $icon_html 名前:$mail_a_start $tmp_name $mail_a_end $tmp_date $auto_user_IP $disp_seq_no $disp_re $tmp_url_link
$tmp_body
$html_block_A $keitai_env_link HTML_END } # # テキスト、テキストリンク、アイコンサイズ、各表示モードに # より以下のHTMLが上記レイアウトのhtml_block_Aに代入されます。 # 以下でその代入ブロックを編集できます。 # sub set_html_block{ # 変数の準備 $img_dsize="$IMG_PARAMETERS{'dsize'}"; # # 2009.12 update $ttmp_target_sitei=qq|TARGET="top"|; if($HTTP_USER_AGENT=~ /ipod|iphone|android|PSP/i){ $ttmp_target_sitei=""; } # 1.1テキスト/テキストリンクモード時用の $html_block_A $textlink_html_block=qq|
$data_type: $tmp_imgtitle -$img_dsize
|; # 1.2アイコンサイズモード時用の $html_block_A $icon_html_block=qq|
画 像: $tmp_imgtitle -$img_dsize
|; } # # 2.レイアウトパターン2/ 画像がメインな記事系レイアウト # (------横固定サイズ表示&オート&オリジナルサイズ表示用--------) sub kiji_base2_html{ local($ttmp_img_location)="$tmp_img_location"; if($tmp_snl_location ne ""){ $ttmp_img_location="$tmp_snl_location"; } if($HTTP_USER_AGENT=~ /ipod|iphone|ipad|android/i){ &kiji_base2_ipod_html; return; } print< 画像タイトル:$tmp_imgtitle -$img_dsize

$tmp_subject $icon_html 名前:$mail_a_start $tmp_name $mail_a_end $tmp_date $auto_user_IP $disp_seq_no $disp_re $tmp_url_link
$tmp_body
$keitai_env_link $br_auto_clear HTML_END } # # 2.レイアウトパターン2/ 画像がメインな記事系レイアウト(ipod/iPhone/Android) # (------横固定サイズ表示&オート&オリジナルサイズ表示用--------) sub kiji_base2_ipod_html{ local($ttmp_img_location)="$tmp_img_location"; if($tmp_snl_location ne ""){ $ttmp_img_location="$tmp_snl_location"; } if($HTTP_USER_AGENT=~ /ipad/i){ print< 画像タイトル:$tmp_imgtitle  クリックで拡大 -$img_dsize
HTML_END }else{ print< 画像タイトル:$tmp_imgtitle  ダブルタップで拡大 -$img_dsize
HTML_END } print< $tmp_subject $icon_html 名前:$mail_a_start $tmp_name $mail_a_end $tmp_date $auto_user_IP $disp_seq_no $disp_re $tmp_url_link
$tmp_body
$keitai_env_link $br_auto_clear
HTML_END } # 3.レイアウトパターン3/ 返信記事レイアウト sub kiji_rep_html{ # 旧外部ファイルとの互換部分(指定がない場合はpinkにする) $res_base_font_color="color=pink" if($res_base_font_color eq ""); print< $tmp_subject $icon_html 名前:$mail_a_start $tmp_name $mail_a_end $tmp_date $auto_user_IP $disp_seq_no $tmp_url_link
$tmp_body
$keitai_env_link
HTML_END } #=========================================# # <HTML--入力フォーム部> # #=========================================# # # 記事入力フォーム部のHTML.入力項目を増やしたり、減らしたりしたい # 場合はここを変更してください。だだし、変更によりCGIがうまく動かな # くなる可能性がありますので,ここは変更する時は十分注意してください. # なお、URL等の項目を追加したいなど、よくある希望に対しては、外部設定 # ファイルというカスタマイズした設定ファイルを使うことにより、より簡単 # に実現できますので、自分でカスタマイズするよりも、それを使った方が楽 # でしょう。なお、同ファイルはサポートサイトの方で配布しています。 # sub form_html{ &ext_config_form_pre if($EXTSUB{'form_pre'} == 1 ); &auto_omit_disp; $COOKIE{'subject'}="" if($no_cookie_for_subject ==1); # 2008.06.25 &auto_cols_change; # WiFi環境を考慮するとipod/iPhone/PSPは画像埋め込みで見たい sub auto_cols_change{ if($HTTP_USER_AGENT=~ /ipod|iPhone|android/i){ $form_textarea_cols="50"; }elsif($HTTP_USER_AGENT=~ /PSP/i){ $form_textarea_cols="40"; }else{ $form_textarea_cols="66"; } } print< $POSTADDP{'UPLOADFORM'}
    $cm_out_pw_h $cm_out_pw_f $PM{'INS_POINT_FORM01'} HTML_END &ext_config_form_opt if($EXTSUB{'form_opt'} == 1 );# 外部設定ファイルによる将来拡張用 print< $cm_out_img_h $cm_out_img_f HTML_END if($use_guest_passwd=='-1'){ $rmkey_default_checked="CHECKED" if($COOKIE{'rmkeym'} eq "on"); if($FORM{'bbsaction'} ne "edit_form"){ print< HTML_END }else{ print< HTML_END } } print<
    会員パスワード: *必要 $POSTADDP{'MEMBERPASS'}
    おなまえ: $DISP_OMIT{'name'}
    題名: $DISP_OMIT{'subject'}
    本文: $DISP_OMIT{'body'}
    画像選択 $DISP_OMIT{'img'}
      画像の題名 *省略可
    削除キー $DISP_OMIT{'rmkey'} 自分で記事を削除時に使用。数字で4ケタ以内 キーを記憶
    $form_sage_checkbox_html
HTML_END } # #===================================================# # <HTML--画像フルスクリーン表示部> # #===================================================# # 2008.06 new # # iPod Touch/iPhone/Androidで画像だけを呼び出した場合、小さく表示されてしまうため、 # フルスクリーンに出すために新設したHTML部です。 # # print< imgboard iPad/iPhone/Android AUTO FULLSCR $top_html_header
$tmpp_img_type - w $tmpp_img_width/h $tmpp_img_height - $tmpp_img_dsize
HTML_END } # #------------HTML抜粋ここまで------------# # cfg_end #=================================================================# # 以上でユーザカスタマイズ部分である初期設定は終わりです # # 以下はプログラムになります. # #=================================================================# #=======================================================================# # メインルーチン #=======================================================================# &init_valiables; # 初期化 &check_open; # 開店確認 &read_input; # フォームの内容とクッキーを読み込む &ext_config_amode if($EXTSUB{'amode'}==1);# 外部設定による将来拡張用 &amode_done; # 管理者画面の処理 &ext_config_bbsaction if($EXTSUB{'bbsaction'}==1);# 外部設定による将来拡張用 if($FORM{'bbsaction'} eq 'post'){ # モードが投稿モードの場合 &check_post_browser_type; # ブラウザチェック &check_entry_passwd; # 会員チェック &protect_from_BBS_cracker; # 荒し対策 &read_cookie; # クッキーを読込む &limit_upload_times; # 連続投稿回数チェック if($FORM{'prebbsaction'} eq 'edit_form'){# 置換モードの場合 &replace_data("$FORM{'target'}","$file");# 修正処理 }else{ &check_double_post("$FORM{'email'}","2","1");# 2重投稿チェック &post_data("$file"); # 投稿処理 &set_cookies; # クッキーをセット } &send_mail; # 管理者へメール &jump_html; # パラメータクリア用HTML exit; # 終了 }elsif($FORM{'bbsaction'} eq 'remove'){ # モードが削除モードの場合 if($FORM{'passwd'} eq $admin_passwd){ $remove_mode="admin"; # 削除モード &remove_data("$file"); # 削除処理 &jump_html; # パラメータクリア用HTML exit; # 終了 }elsif(($FORM{'passwd'} eq $guest_passwd)&&($use_guest_passwd ==1)){ $remove_mode="guest"; # 削除モード &remove_data("$file"); # 削除処理 &jump_html; # パラメータクリア用HTML exit; # 終了 }elsif($use_guest_passwd =='-1'){ $remove_mode="rmkey"; # 削除モード &remove_data("$file"); # 削除処理 &jump_html; # パラメータクリア用HTML exit; # 終了 }else{ &error("パスワードが違います.削除を中止しました."); } }elsif($FORM{'bbsaction'} eq 'pf_change'){# モードがプロファイル変更の場合 &set_cookies; # クッキーをセット &jump_html; # パラメータクリア用HTML exit; # 終了 }elsif($FORM{'bbsaction'} eq 'page_change'){# モードがページ変更の場合 &read_cookie; # クッキーを読込む }elsif($FORM{'bbsaction'} eq 'disp_form_only'){# フォームウィンド表示の場合 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &top_html; &output_form_html; # 入力フォームを表示 print "\n"; exit; }elsif($FORM{'bbsaction'} eq 'disp_rep_form'){# 返信用ウィンド表示の場合 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &top_html; print "\n"; $form_sage_checkbox_html=qq|sage| if($PM{'use_sage'} == 1); &output_form_html; # 入力フォームを表示 &protect_from_BBS_cracker if($PM{'no_disp_for_cracker'}==1);# 荒し対策 &output_html("$file"); # 掲示板を表示 exit; # twitter用API }elsif($FORM{'twi'} ne ""){# twitter用処理の場合 # twitter用の短縮URLパラメータを復元 # http://myhost.jp/imgboard.cgi?twi=b100411033041p1024drfx # twitterっぽい雰囲気で違和感をなくすかな $PM{'top_style_option'}=qq| body { background: #C0DEED url('http://a3.twimg.com/a/1272044617/images/bg-clouds.png') repeat-x; } |; if($FORM{'twi'}=~ /b(\d+)p(\d+)(p*)(\d*)(\w+)x(\w*)/i){ $FORM{'blood'} ="$1"; # 復元 $FORM{'parent'} ="$2"; # 復元 $FORM{'page'} ="$4"; # 復元 $FORM{'twia'} ="$5"; # twitter actionを復元 $FORM{'twip'} ="$6"; # twitter parameterを復元 } if($FORM{'twia'} eq "drf"){ $FORM{'bbsaction'}='disp_rep_form'; # 復元 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &top_html; print "
    from twitter

    画像スレにコメントします (推奨:200文字以内)

    \n"; print "[←掲示板へ戻る]
\n"; $form_sage_checkbox_html=qq|sage| if($PM{'use_sage'} == 1); &output_form_html; # 入力フォームを表示 &protect_from_BBS_cracker if($PM{'no_disp_for_cracker'}==1);# 荒し対策 &output_html("$file"); # 掲示板を表示 exit; } # 2008.06.26 for ipod/iPhone }elsif($FORM{'bbsaction'} eq 'disp_fullscr'){# フルスクリーン表示の場合 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &protect_from_BBS_cracker if($PM{'no_disp_for_cracker'}==1);# 荒し対策 &disp_fullscreen_html($FORM{'timg_location'},$FORM{'timg_location'},$FORM{'timg_w'},$FORM{'timg_h'},$FORM{'timg_dsize'},$FORM{'timg_type'}); exit; # 配布版では未使用 }elsif($FORM{'bbsaction'} eq 'remove_select'){ # 削除記事の選択 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; $title=qq| 削除確認 |; &top_html; &output_remove_select_html; # 削除パス確認画面を出す print "\n"; exit; }elsif($FORM{'bbsaction'} eq 'edit_form'){ # 記事編集画面 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; $title=qq| 修正フォーム |; &edit_top_html; &load_target_kiji("$FORM{'target'}","$file"); if($FORM{'amode'} eq "icon_edit"){ &output_wp_upload_form; # WP入力フォームを表示 }else{ &output_form_html; # 入力フォームを表示 } print "\n"; exit; }elsif($FORM{'bbsaction'} eq 'webslice'){ # Webスライス画面 &protect_from_BBS_cracker if($no_disp_for_cracker==1); # 荒し対策 &protect_from_NON_member if($use_view_passwd_flag==1); # 会員限定 &count_bbs if($PM{'use_count'} == 1); # アクセスカウンタ &output_webslice; # websliceを表示 } # アクションが何も指定されていない時は、表示となる # 各モードにより表示画面の種類を分岐させて表示させる &ext_config_mode if($EXTSUB{'mode'}==1); # 外部設定による将来拡張用 if($FORM{'mode'} eq "disp_admin_check_menu"){ # 管理者確認メニュー表示 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &output_admin_check_HTML; exit; }elsif($FORM{'mode'} eq "disp_icon_list"){ # アイコン一覧を表示 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &output_icon_list_HTML; exit; }elsif($FORM{'mode'} eq "disp_admin_menu"){ # 設定変更メニューを表示 if(&check_passwd("$FORM{'apasswd'}","$admin_passwd","0")==1){ &set_admin_cookies; # 管理者パスを一時記憶 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &output_admin_menu_HTML; }else{ &error("パスワードが違います.処理を中止しました.","","1"); } exit; }elsif($FORM{'mode'} eq "search_menu"){ # ワード検索メニュー表示 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; # 2010.04 ワード検索メニューにおける、 # クロスサイトスクリプティング対策を追加 &form_check; &output_search_menu_HTML; if($FORM{'SearchWords'} ne ""){ &protect_from_BBS_cracker if($PM{'no_disp_for_cracker'}==1);# 荒し対策 &output_html("$file"); # 掲示板を表示 exit; # 終了 }else{ print " 検索ワードが何もありませんでした.入力してください \n"; } &output_search_menu_HTML2; exit; }elsif($FORM{'mode'} eq "keitai_menu"){ # 携帯対応メニューを表示 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &output_keitai_menu_HTML; exit; }else{ # モードが指定されてない場合,掲示板を表示 &protect_from_BBS_cracker if($no_disp_for_cracker==1); # 荒し対策 print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; # HTMLヘッダ,ボディ.(書換えは初期設定の所で行う) &top_html; $COOKIE{'body'}=""; &output_form_html; # フォームを表示 &output_html("$file"); # 掲示板を表示 exit; } exit; #=======================================================================# # サブルーチン #=======================================================================# #================# # 初期化 #================# sub init_valiables{ $vip_n ="11020609"; $imgboard_ver ="2001101501"; $EXTCFG{'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'}; $HTTP_REFERER =$ENV{'HTTP_REFERER'}; # iPod Touch #$HTTP_USER_AGENT="Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3"; undef $tok2_cookie; # 2010.06 add FLVPlayer用に独自のCGI環境変数を作る undef %MYCGI_ENV; # 初期化 # CGI本体のURL $MYCGI_ENV{'cgi_url'}='http://'."$ENV{'HTTP_HOST'}"."$ENV{'REQUEST_URI'}"; # CGIの本体のあるディレクトリのURL $MYCGI_ENV{'cgi_base_url'}="$MYCGI_ENV{'cgi_url'}"; $MYCGI_ENV{'cgi_base_url'}=~ s/^(.*)(\/)([^\/]*)$/$1$2/g; #&error("MYCGI_ENV{'cgi_url'} $MYCGI_ENV{'cgi_url'} MYCGI_ENV{'cgi_base_url'} $MYCGI_ENV{'cgi_base_url'}"); if($HTTP_USER_AGENT=~ /iPhone|iPod|iPad|PSP|Android 1\./i){ $MYCGI_ENV{'flash_object_tag_support'}='false'; }else{ $MYCGI_ENV{'flash_object_tag_support'}='true'; } if(int($])<5){ &error(" 設定エラー。スクリプトの1行目でパスの指定されたPerlのバージョン $] は古すぎます。imgboard1.22R5以降ではjcode.plのバージョンの関係でPerl5以上が必要です。Perl5以上のパスを探してそれに変更するか、Perl4でも動くR5\(for Perl4\)とjcode_sj.plを特報倶楽部にて入手してください。 "); } &check_browser_type; # ブラウザチェック &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,blkword.txt # があれば,そのリストをロードする # スパムリスト関連の追加設定 $use_ext_spamlist =1; # 外部にspamlist.cgi,spamword.cgi # があれば,そのリストをロードする # ゲストパスワード機能(PPP対応-IP認証型) # 投稿者自身が記事を削除できる機能です。詳細はサポート掲示板を参照してください。 # $use_guest_passwd =1; # ゲストパスワード機能を使用 # (-1 削除キー式にする,0使用しない(この場合は管理者のみ削除可能)、1ゲストパスワードを使用する(強く推奨)) $guest_passwd ='guest'; # 記事削除時の ゲストパスワード(変更は必要ありません) # IPが完全一致しなくても、同じサブネットからのアクセスは同一人物とみなし、削除を許可する $gp_allow_subnet =1; # その他 $no_disp_RH_in_HTML_sorce=0; # HTMLソースにリモホを表示しない # -1=常時IP表示,0=HTMLソースのみIP表示,1=IP完全非表示 $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) $use_sjis_header_for_Netscape4X ='0';# Netscape4.X文字化け対策(def=0) $force_www_server_os_to=''; # 未使用パラメータ(指定しないこと) #------------------ 以下はプログラム ----------------------------- 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($EXTCFG{'ext_config_ver'} < 2001101500 ){ &error(" 外部設定ファイルのバージョン $ext_config_nameは古過ぎるため使えません。最新版をご入手いただくか、読み込まない設定にしてください。"); } if($imgboard_ver < $EXTCFG{'support_imgboard_ver'} ){ &error(" この外部設定ファイル($EXTCFG{'ext_config_ver'}-imgboard $EXTCFG{'support_imgboard_ver'}以降用)はこのimgboard(バージョン$imgboard_ver)では使用できません。最新版の外部設定ファイルをご入手いただくか、読み込まない設定にしてください。"); } } &make_uniq_onetime_id; #======================# # SPAM対策用トークン #======================# # 2010.02 SPAM対策のため、掲示板固有のワンタイムIDを作成する # 2010.04 softbankのスマートフォン対策でロジック変更 sub make_uniq_onetime_id{ local($ttmp_uniq_char)=""; # perl5のDigestやSHA256モジュールを使えないプロバイダが多いので、 # 独自ロジックで類推しにくいHASH代用計算をすることにした if(-e "$img_dir/index.html"){ @UNQ_FILE_STAT=stat("$img_dir/index.html"); # 属性を調査 $tttmp_pick_file_size =substr($UNQ_FILE_STAT[7],-1,1); # ファイルサイズを取得 $tttmp_pick_file_lastupdate=substr($UNQ_FILE_STAT[9],-1,1); }else{ $tttmp_pick_file_size =3; $tttmp_pick_file_lastupdate=4; } $tmp_token_time= substr(time,-7,2); #27.7時間単位 $tmp_alphabet_sn ="$ENV{'SCRIPT_FILENAME'}"; $tmp_alphabet_sn =~ s/[^a-zA-Z0-9]//g; $tmp_alphabet_sa ="$ENV{'SERVER_ADMIN'}"; $tmp_alphabet_sa =~ s/[^a-zA-Z0-9]//g; $tmp_alphabet_saddr ="$ENV{'SERVER_ADDR'}"; $tmp_alphabet_saddr =~ s/[^a-zA-Z0-9]//g; #$admin_passwd = 'biko'; # HTC disire対策でロジック変更(1文字長くしておく) $tttmp_pick_sa_base=substr($tmp_alphabet_saddr,-3,1)."$tttmp_pick_file_lastupdate".substr($admin_passwd,-1,1).substr($tmp_alphabet_sn,5,1).substr($tmp_alphabet_sa,5,1)."$tttmp_pick_file_lastupdate"."$tttmp_pick_file_lastupdate"; #&error("$tttmp_pick_sa_base $tmp_alphabet_sn $tmp_alphabet_sa s $tttmp_pick_file_lastupdate"); $tttmp_salt="$tttmp_pick_file_lastupdate"."$admin_passwd";# salt作成 $tttmp_pick_sa = substr(time,-7,2)."$tttmp_pick_sa_base"; $tttmp_pick_sa_old = (substr(time,-7,2)-1)."$tttmp_pick_sa_base"; # token動作確認test用(100秒単位で無効に) # $tttmp_pick_sa = substr(time,-4,2)."$tttmp_pick_sa_base"; # $tttmp_pick_sa_old = (substr(time,-4,2)-1)."$tttmp_pick_sa_base"; $uniq_token =crypt($tttmp_pick_sa ,$tttmp_pick_sa);# HASH代用文字列作成 $uniq_token_old =crypt($tttmp_pick_sa_old ,$tttmp_pick_sa_old);# HASH代用文字列作成 27.7時間単位で一つ前 # saltを切り落とす $uniq_token =substr($uniq_token,2,11); $uniq_token_old =substr($uniq_token_old,2,11); # URLと相性の悪い文字を除く $uniq_token =~ s/[^a-zA-Z0-9]//g; $uniq_token_old =~ s/[^a-zA-Z0-9]//g; #&error("$uniq_token"); # $ttmp_uniq_char="$uniq_token - $uniq_token_old - salt $tttmp_salt - sa $tttmp_pick_sa - saold $tttmp_pick_sa_old - $ENV{'SERVER_ADDR'} "."$ENV{'REMOTE_ADDR'} "."$ENV{'SERVER_ADMIN'}"." $tttmp_pick_file_size $tttmp_pick_file_lastupdate"; #&error("ttmp_uniq_char $ttmp_uniq_char"); } # 2006.03 SPAM対策 if($spam_keyword ne ""){ $POSTADDP{'UPLOADFORM'}="$POSTADDP{'UPLOADFORM'}\n"."\n"; } # 2006.10.14 Bug fix # if($limit_bbs_spam_flag==1){ if($filter_bbs_spam==1){ if($CHECK{'email'}==1){ &error(" 管理者の設定エラー。「メール必須」に設定された場合、SPAM設定で「URLリンクやメールアドレスのある書き込みを、問答無用ですべて廃棄」すると、投稿できなくなります。設定を見直してください。 "); } } 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 < 2001070701 ){ &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{ &error("$oyasumi_message") if($bbs_open_flag !=1); } #=====================# # 入力データを読む #=====================# sub read_input{ # 変数の初期化 local($name); undef $img_data_exists; undef @NEWFNAMES; undef $jcode_eval_check_flag; $mac_ie4_flag='0'; # リロード&GETでかつ返信なしの場合は以下の処理をスキップ if($ENV{'CONTENT_LENGTH'}==0){ # リロード時 & GETの場合 &read_cookie; # クッキーのロード if($PM{'use_rep'}==1){ # 返信ありの場合 # ウィンド描画のためにGET受け入れ }else{ # 返信なしの場合 # return if($form_disp_on_board==1); } } # データの取得&転送データのサイズをチェック $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if(($ENV{'SERVER_SOFTWARE'}=~ /BlackJumboDog/i)&&($allow_other_multimedia_data==1)){ # 自宅サーバは他人に迷惑をかけないので、規制を緩くする if($max_upload_size > 218000){$max_upload_size='218000';}# 変更禁止 }elsif(($ENV{'SERVER_SOFTWARE'}=~ /AnWeb/i)&&($allow_other_multimedia_data==1)){ # 自宅サーバは他人に迷惑をかけないので、規制を緩くする if($max_upload_size > 218000){$max_upload_size='218000';}# 変更禁止 }elsif(($ENV{'SERVER_SOFTWARE'}=~ /04WebServer/i)&&($allow_other_multimedia_data==1)){ # 自宅サーバは他人に迷惑をかけないので、規制を緩くする if($max_upload_size > 218000){$max_upload_size='218000';}# 変更禁止 }else{ if($max_upload_size > 118000){$max_upload_size='118000';}# 変更禁止 } $max_content_length =($max_upload_size + 1)*1000; $max_content_limit ="$max_upload_size"; if($ENV{'REQUEST_METHOD'} eq "POST"){ # OSの種別を判別 $www_server_os =&check_www_server_os; if($www_server_os=~ /win/i){ binmode(STDIN); } if($ENV{'CONTENT_LENGTH'} > 120000000){ # 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.
SAL $vip_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|7)\./i)){ $mac_ie4_flag='1'; } # 特例処理(マイムが不明な場合) if(($fname ne "")&&($content_type eq "")){ # 以下の3ケースが想定される. # ケース1)Macユーザがファイル名に拡張子のないファイルをアップロード # ケース2)Mac,Win,Unixユーザがブラウザの知らない(Plug-inのない)データをアップロード # この場合はデータのヘッダ部分のテキスト解析からの自動判別を試みる(GIF,JPEG,PNG). # 失敗したら拡張子が存在するかどうかをチェック # 存在したら後の拡張子による判断に任せる. # 存在しない場合警告を出し終了. # データヘッダから画像の種類を自動判別 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($vars[3] =~ /^\x89PNG/i){ $check_m .=" ヘッダー分析の結果4はPNG
"; $content_type="image/png"; # 拡張子らしき物がついている場合 }elsif($fname=~ /\.(\w){1,4}$/){ $content_type="unknown";#後の拡張子による判断に任せる }else{ if($HTTP_USER_AGENT =~ /MAC/i){ &error(" アップロードエラー。アップロードデータの属性が判断できません。
\nあなたがMacユーザの場合,アップロード対象のファイル名に拡張子(gif.jpeg.png等)が
\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もPNGも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($vars[4] =~ /^\x89PNG/){ $check_m .="ヘッダー分析の結果4はPNG
"; $content_type="image/png"; }elsif($fname=~ /\.lzh$/i){ $content_type="compressed/lha"; # # 拡張子らしき物がついている場合 # }elsif($fname=~ /\.(\w){1,4}$/){ # $content_type="unknown";# 後の拡張子による判断に任せる }else{ &error(" Mac版IE4.X以降は仕様が特殊なため、GIF・JPEG・PNG以外のアップロードはできません。
その他の形式のファイルのアップロードには、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=~ /png$/i){ if($data!~ /^\x89PNG/){ ($gomi,$data,$gomi2)=split(/\x89PNG/,$data); $data ="\x89PNG"."$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・PNG・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++; $unq_id++; }elsif( -e "$img_dir/img$date_count\.$ext"){ $date_count++; $unq_id++; }elsif( -e "$img_dir/img$date_count\.$ext"){ &error(" ファイル名決定処理中にエラーが発生しました。時刻ベースmode "); } $new_fname = "img$date_count\.$ext"; } # 複数アップロード対応用 push(@NEWFNAMES, $new_fname); # 画像サイズ専用リミッタによるチェック if($max_upload_img_size ne ""){ if($ENV{'CONTENT_LENGTH'} > $max_upload_img_size*1024){ if($new_fname=~ /\.gif$|\.jpe?g$|\.png$|\.bmp$/i){ &error(" デ\ータが大きすぎます。画像サイズは$max_upload_img_size KB以下にしてから、投稿してください。

おすすめ画像縮小ツール(Windows): 縮小専用ツール
おすすめ画像縮小ツール(Mac): ResizeIt
画像縮小方法(携帯ユ\ーザー):写メの撮影画質をFINEからノ\ーマルに変更して、撮影し直してください
"); exit; } } } open(OUT, ">$img_dir/$new_fname")|| &error(" 画像データを$img_dirに保存中にエラーが起きました.
指定ディレクトリ\"$img_dir\"に書込み許可がない可\能\性があります.
ディレクトリのパーミション設定を確認してみてください."); # IIS,PWS(NT/95)対策 if($www_server_os=~ /win/i){ binmode(OUT); } eval "flock(OUT,2);" if($PM{'flock'} == 1 ); print OUT $data; eval "flock(OUT,8);" if($PM{'flock'} == 1 ); 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{ local($tmp_file) = $_[0];# 処理するログファイル名 undef @HEAD_MESSAGE; undef @MESSAGE; undef @NEW_MESSAGE; local($old_seq_no,$new_seq_no,$tmp_mes_line,$mes_counter); local($img_data_size_num); local($sage_flag); if($ENV{'REQUEST_METHOD'} ne 'POST'){ &error(" セキュリティ警告
GETによる記事投稿はNGです "); } &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 '')&&($imgtitle eq '')){ # タイトルがない場合はファイル名がタイトル $imgtitle="$img_location"; } # 投稿画像の容量を計算 if($img_location ne ''){ $content_length="$ENV{'CONTENT_LENGTH'}"; $content_length="$content_length"-800; $content_length_kb=int($content_length/1024); # R7 new Webでゲットしたファイルにサイズに差換え if($web_get_file_size > 0){ $content_length_kb=int($web_get_file_size*10/1024); $content_length_kb=($content_length_kb / 10); } if(("$content_length" > 0)&&("$content_length_kb"==0)){ $img_data_size=1; }else{ $img_data_size="$content_length_kb"; } if($FORM{'amode'} eq "post_webparts"){ if($img_data_size > 52){ &error(" エラー容量オーバー。パーツ画像は50KB以下にしてください。
"); } } $img_data_size_num="$img_data_size"; $img_data_size="($img_data_size KB)"; } # imgsizeのバージョンをチェック if($imgsize_lib_flag ==1){ unless($imgsize_version >=20010301){ &error(" 管理者設定のエラー。処理を中止しました。
imgsize.plのバージョン $imgsize_version は古過ぎます。最新版をご利用ください。"); } } # 投稿画像のプロパティを取得 &check_uploaded_img_property; sub check_uploaded_img_property{ if((-e "$img_location")&&($imgsize_lib_flag== 1 )){ &imgsize("$img_location"); if(($IMGSIZE{'result'} ==1)&&($img_data_exists==1)){ $img_type ="$IMGSIZE{'type'}"; $img_width ="$IMGSIZE{'width'}"; $img_height ="$IMGSIZE{'height'}"; $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.="opt_data_"."$1"."\="."$tmp_data"."\;"; undef $tmp_data; }elsif($p_key=~ /^opt(.{1,2})$/){ $tmp_data=&Enc_EQ($FORM{$p_key}); $opt_data.="opt_data_"."$1"."\="."$tmp_data"."\;"; undef $tmp_data; } } if(-e "$tmp_file"){ }else{ # コメント保存ファイルがない場合,自動作成を試みる open(NEWFILE,">$tmp_file")||&error(" 設定エラー.データ保存用ファイル\$tmp_file\"が見つかりません.自動作成を試みましたができませんでした。処理は中断されました."); close(NEWFILE); } # 準備完了 # メッセージを読み込む open(IN, "$tmp_file")|| &error(" 設定エラー.データ保存用ファイル\"$tmp_file\"が見つかりません.処理は中断されました."); eval "flock(IN,1);" if($PM{'flock'} == 1 ); while(){ # HEADER保存 (将来への拡張もここで対応) if($_ =~ /^\#?\,param_/i){ # (#でコメントアウトしたものを含む) if($_ =~ /^\,param_seq_no(\s*)=(\s*)(\d+)(\s*)/i){ # 連番を取得する $old_seq_no="$3"; }elsif($_ =~ /^\,param_last_backup_date(\s*)=(\s*)(\d+)(\s*)/i){ # 最終更新日を取得する $HEAD_MESSAGE{'last_backup_date'}="$3"; }elsif($_ =~ /^\,param_last_bloods(\s*)=(\s*)([^\;]*)(\;+)(\s*)/i){ # 最新の記事の親を取得する $HEAD_MESSAGE{'last_bloods'}="$3"; $HEAD_MESSAGE{'last_bloods'}=&Dec_EQ("$HEAD_MESSAGE{'last_bloods'}"); }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++; } } eval "flock(IN,8);" if($PM{'flock'} == 1 ); close(IN); # 連番処理 if($old_seq_no eq ""){# ない場合は作る $old_seq_no='0'; } $new_seq_no=$old_seq_no+1; # WebPartsがオーバーしないように警告する if($limit_wp_max_message ne ""){ if(($limit_wp_max_message-1) < $all_message){ &error(" エラー。imgboardでは、Webパーツは最大 $limit_wp_max_message までしか保存できません。

それ以上のパーツやアイコンを保存したい場合は、姉妹スクリプト eFTPboard(シェアウェア2500円)をご利用ください。なお、入手ご希望の方はtalk\@big.or.jpまでメールにてご連絡ください "); } } # 暗号化 if(($rmkey ne "no_key")&&($rmkey ne "")){ $rmkey = &make_pass("$rmkey"); } # SNLとして存在するデータのリストを作る foreach (@SNL_MADE_DATA){ # $existing_snl_type_list.="$_"."\/"; } # 輸入URLでタブと;をエスケープ $img_import_url=~ s/\t//g; $img_import_url=~ s/\;//g; $img_import_url=~ s/\s+$//g; # sage機能 if(($PM{'use_sage'} == 1)&&($tt_email=~ /^sage$/i)){ $tt_email=""; $sage_flag=1; } # 新しいメッセージを作る(imgboard1.22新形式) $new_message = "$subject\t$name\t$email\t$date_data\t$body<\!--opt\:$opt_data-->\t$img_location\t$imgtitle<\!--dsize=$img_data_size;type=$img_type;width=$img_width;height=$img_height;hw_racio=$img_hw_racio;size=$img_data_size_num;-->\t$new_seq_no\t$FORM{'blood'}\t$rmkey\t$unq_id\t"; # レスの付いた記事を上へ持って行くために、親スレッドリストへ追加する # 2004.12 sage機能を追加 if(($FORM{'sage'} == "1")||($sage_flag == 1 )){ # リストに記録しない }else{ &update_bloods_list; } # 記事データを追加する if($FORM{'parent'} eq ""){ # 親記事の場合 unshift(@MESSAGE, $new_message); $all_message++; # 記事数は一つ増 }else{ # 子記事の場合 # 記事データを探索する $mes_counter=1; $last_child_number=0; foreach(@MESSAGE){ if($_ =~ /$FORM{'blood'}/){ $last_child_number=$mes_counter; } $mes_counter++; } # 記事データを追加する $mes_counter=1; foreach(@MESSAGE){ push(@NEW_MESSAGE, $_); if($mes_counter==$last_child_number){ push(@NEW_MESSAGE, $new_message); $all_message++; # 記事数は一つ増 } $mes_counter++; } @MESSAGE=@NEW_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]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)/){ local($remove_file) = $6; local($remove_imgtitle) = $7; local($tmp_unq_id) = $11; if($remove_file ne '' && -e $remove_file){ unlink($remove_file); # メタファイルも削除する &rm_meta_file("$remove_file"); # 携帯用ファイルも削除する if($remove_file=~ /\.(jpe?g|gif|png|bmp|mng)$/i){ # SNLのパスを調べる if($remove_imgtitle ne ''){ &parse_img_param($remove_imgtitle); } &rm_snl_file("$tmp_unq_id","$IMG_PARAMETERS{'snl_dir'}","$IMG_PARAMETERS{'exist_snl_type'}"); } } } } } # 新しいファイルとして出力 if($all_message > $max_message){ $repost_message = $max_message; }else{ $repost_message = $all_message; } if($PM{'make_backup_file'}== 1 ){ &make_backup_file; # バックアップファイル自動作成 } # 書き出し処理 open(OUT, "> $tmp_file")|| &check_file_open_error("$tmp_file"); eval "flock(OUT,2);" if($PM{'flock'} == 1 ); $HEAD_MESSAGE{'last_bloods'}=&Enc_EQ("$HEAD_MESSAGE{'last_bloods'}"); # HEAD部分 print OUT "\,param_seq_no=$new_seq_no\n"; print OUT "\,param_last_backup_date=$HEAD_MESSAGE{'last_backup_date'};\n"; print OUT "\,param_last_bloods=$HEAD_MESSAGE{'last_bloods'};\n"; foreach(@HEAD_MESSAGE){ print OUT "$_"; } # 記事部分 for($i=0; $i<$repost_message; $i++){ print OUT "$MESSAGE[$i]\n"; } eval "flock(OUT,8);" if($PM{'flock'} == 1 ); close(OUT); } sub check_file_open_error{ local($tmp_ffile)= $_[0]; # メッセージを引数として取得 unless(-e "$tmp_ffile"){ &error(" 設定エラー.データ用保存ファイル\"$tmp_ffile\"にデータを書込むことができませんでした.\"$tmp_ffile\"という名前のファイルが正しい位置に見つからないためです。パスの設定を再確認してみてください。投稿処理は中断されました."); } unless(-w "$tmp_ffile"){ &error(" 設定エラー.データ用保存ファイル\"$tmp_ffile\"にデータを書込むことができませんでした.$tmp_ffileに対する書込み許可がないためだと思われます.パーミションの設定を再確認してみてください。投稿処理は中断されました."); } if($ENV{'OS'}=~ /Windows_NT/i){ &error(" 設定エラー.データ用保存ファイル\"$tmp_ffile\"にデータを書込むことができませんでした.IISでNTFSファイルシステムを利用されている場合は、ディレクトリのアクセス許可の設定を再確認してみてください。投稿処理は中断されました."); } &error(" 設定エラー.データ用保存ファイル\"$tmp_ffile\"にデータを書込むことができませんでした.パーミションの設定を再確認してみてください。投稿処理は中断されました."); } # # 最近の記事とその血統(スレッド)を記憶するサブサブルーチン # imgboardR6のログにおいては、最新の5記事分の記事IDと # 親の血統(スレッド)をパラメータとして覚えておくことにする。 # sub update_bloods_list{ local ($b_new_list); # return if($HEAD_MESSAGE{'last_bloods'} eq ""); # 親記事追加の場合,親ー親で追加する if($FORM{'parent'} eq ""){ return if($unq_id eq ""); $b_new_list="$unq_id-$unq_id"."\,"."$HEAD_MESSAGE{'last_bloods'}"; }else{ # 子記事の場合、子ー親で追加する return if($unq_id eq ""); return if($FORM{'blood'} eq ""); $b_new_list="$unq_id-$FORM{'blood'}"."\,"."$HEAD_MESSAGE{'last_bloods'}"; } # 5つ以上になれば、6つ目以降は捨てる if($b_new_list=~ /^(\,*)([\d|\-]*)\,([\d|\-]*)\,([\d|\-]*)\,([\d|\-]*)\,([\d|\-]*)(.*)/){ $b_new_list="$2"."\,"."$3"."\,"."$4"."\,"."$5"."\,"."$6"."\,"; } $HEAD_MESSAGE{'last_bloods'}=$b_new_list; } # # #===================================# # 自動バックアップ作成処理(R6 new) #===================================# # 2001.07(ver.0.7) # 万一のサーバのファイル出力中ダウンや投稿によるログ消失事故に # 備えて、$PM{'backup_day_interval'}で指定された間隔日でfile.datの # 自動バックアップを作る機能を追加する。 # # 2001.07 空ファイルのバックアップによるファイル消去を防止 sub make_backup_file{ # sub post_data内で呼ばれる # $HEAD_MESSAGE{'last_backup_date'}に最終バックアップ日時が # unq_id と同じ形式で入っている。 # $PM{'backup_day_interval'} でバックアップ間隔を設定し # $PM{'backup_file_name'} にバックアップファイル名を指定し、作っておくこと local($do_backup_flag); local($today_day_count); local($tmp_day_count); # 設定されてないときは処理しない(互換性) if(($PM{'backup_day_interval'} eq "")||($PM{'backup_file_name'} eq "")){ return; } # 記事が5件以下の場合は、処理しない #(空ファイルのバックアップによる、バックアップファイル消滅を防ぐ) if($all_message < 6 ){ return; } # 初回用 if($HEAD_MESSAGE{'last_backup_date'} eq ""){ $HEAD_MESSAGE{'last_backup_date'}='20001112020459'; } if($HEAD_MESSAGE{'last_backup_date'}=~ /^(20..)(..)(..)(..)(..)(..)$/){ $tmp_day_count=$1*365+$2*31+$3; if($unq_id=~ /^(....)(..)(..)......$/){ $today_day_count=$1*365+$2*30+$3; if($today_day_count-$tmp_day_count > $PM{'backup_day_interval'}){ $do_backup_flag=1; } } } # このフラグが1ならバックアップを作る if($do_backup_flag ==1){ #&error("$unq_id-$HEAD_MESSAGE{'last_backup_date'}"); if(-e "$PM{'backup_file_name'}"){ $HEAD_MESSAGE{'last_backup_date'}=$unq_id;# 最終バックアップ日を更新 # &write_file_data("$PM{'backup_file_name'}"); # 上のsub write_file_dataの代用(R5.2用の互換部分)================ # 書き出し処理 open(OUT, "> $PM{'backup_file_name'}")|| &check_file_open_error("$PM{'backup_file_name'}"); eval "flock(OUT,2);" if($PM{'flock'} == 1 ); $HEAD_MESSAGE{'last_bloods'}=&Enc_EQ("$HEAD_MESSAGE{'last_bloods'}"); # HEAD部分 print OUT "\,param_seq_no=$new_seq_no\n"; print OUT "\,param_last_backup_date=$HEAD_MESSAGE{'last_backup_date'};\n"; print OUT "\,param_last_bloods=$HEAD_MESSAGE{'last_bloods'};\n"; foreach(@HEAD_MESSAGE){ print OUT "$_"; } # 記事部分 for($i=0; $i<$repost_message; $i++){ print OUT "$MESSAGE[$i]\n"; } eval "flock(OUT,8);" if($PM{'flock'} == 1 ); close(OUT); # ========================================================== }else{ &error(" 設定エラー。投稿処理は中断されました。記事バックアップデータ保存用ファイル\"$PM{'backup_file_name'}\"にデータを書込むことができませんでした.
\"$PM{'backup_file_name'}\"という名前のファイルが正しい位置に見つからないためです。ファイルをまだ作っていない人は、$PM{'file'}をコピーして$PM{'backup_file_name'}という名前にして、同じディレクトリに置き、パーミッションを606等にして下さい。置いたけど、またこのエラーが出た人は、パスの設定を再確認してみてください。"); } } } # #=================================# # 記事データの削除 (メイン部) #=================================# # sub remove_data{ local($tmp_file) = $_[0];# 処理するログファイル名 @remove_list=@_;# 引数 削除リスト(新モード 今は未使用) $tmpnum=0; local($tmp_blood_name)=0; local($killed_blood_name);# 消された親記事の血統を一時記憶 undef @HEAD_MESSAGE; # ■セキュリティチェック if($ENV{'REQUEST_METHOD'} eq 'GET'){ &error(" エラー。いたずら防止のため、GETメ\ソ\ッドでは、削除できない仕様になっています "); } # ■複数の削除指定を受け取り、配列にする # rmid旧連番S新固有IDをチェックボックスからもらう # R4形式を@old_remove_list R6形式を@remove_listへ入れること foreach $form(sort keys %FORM){ if($form =~ /^rmid/){ if($FORM{"$form"} == 1){ ($tmp_old_rmid,$tmp_new_rmid) =split(/S/,$form); $tmp_old_rmid =~ s/rmid//g; push(@old_remove_list, $tmp_old_rmid); push(@remove_list, $tmp_new_rmid); } } } $remove_article_number= @remove_list; # 削除予定数 # データを読み込みながら、削除するものはスキップし、最後に書き出す。 open(IN, "$tmp_file")|| &error(" 設定エラー.データ保存用ファイル\"$tmp_file\"が見つかりません.処理は中断されました."); eval "flock(IN,1);" if($PM{'flock'} == 1 ); while(){ if($_ =~ /^\,param_last_bloods(\s*)=(\s*)([^\;]*)(\;+)(\s*)/i){ # 最新スレッドリストを取得する $HEAD_MESSAGE{'last_bloods'}="$3"; $HEAD_MESSAGE{'last_bloods'}=&Dec_EQ("$HEAD_MESSAGE{'last_bloods'}"); }elsif($_ =~ /^\#?\,param_/i){ # HEADERを保存する(#でコメントアウトしたものを含む) push(@HEAD_MESSAGE, $_); next; } if($_ =~ /^([^\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]*)/){ $tmpnum++; undef @LDATA; $tmpdata = $_; # 全体データを保存 chop($tmpdata); # 改行コードを除く @LDATA = split(/\t/,"$_"); # 切断して配列に入れる $tmp_body = $LDATA[4]; # check_guest_passwdへ渡す $tmpimg = $LDATA[5]; # 画像 $tmp_imgtitle = $LDATA[6]; $tmp_seq_no = $LDATA[7]; # 連番 $tmp_blood_name = $LDATA[8]; # 親の血統ID(子供のみ持つ) $tmp_rmkey = $LDATA[9]; # 削除キー $tmp_unq_id = $LDATA[10]; # 固有ID(時刻ベース) $flag_remove = 0; undef $host_flag; undef $allow_remove_flag; # 親が消えた場合は子記事は問答無用で全部消す if($killed_blood_name ne ""){ if($killed_blood_name eq "$tmp_blood_name"){ # 正規に消えた親と血統が一致した場合、子も消す # (@TMPMESSAGEへ保存しないで次のループへ行く) # 子記事の画像データを消す if($tmpimg ne ""){ # 子記事に添付画像があれば # 画像ファイルを削除する if(-e $tmpimg){ unlink($tmpimg); # メタファイルも削除する &rm_meta_file("$tmpimg"); # 携帯用ファイルも削除する if($tmpimg=~ /\.(jpe?g|gif|png|bmp|mng)$/i){ # SNLのパスを調べる if($tmp_imgtitle ne ''){ &parse_img_param($tmp_imgtitle); } &rm_snl_file("$tmp_unq_id","$IMG_PARAMETERS{'snl_dir'}","$IMG_PARAMETERS{'exist_snl_type'}"); } } } # 記事が削除されたらスレッドリストから削除する $HEAD_MESSAGE{'last_bloods'}=~ s/$tmp_unq_id\-(\d+)\,//gi; # 親なしの子記事の削除に成功 next; } } undef @do_remove_list; # 初期化する # ここで新旧の指定の違いを吸収する if($tmp_unq_id ne ""){ # R6形式のログの場合 # 固有IDで消す(より安全) $tmp_rm_num="$tmp_unq_id"; @do_remove_list=@remove_list; }else{ # R4以前の旧形式のログの場合 # ページ中の連番で消す $tmp_rm_num="$tmpnum"; @do_remove_list=@old_remove_list; } # この行が削除リストにあるか検索 foreach $tmp_list(@do_remove_list){ if($tmp_rm_num == $tmp_list){ if($remove_mode eq "guest"){ # ゲストパスワードをチェック &check_guest_passwd; }elsif($remove_mode eq "rmkey"){ # 削除キーをチェック &check_rmkey("$tmp_rmkey"); }else{ $allow_remove_flag=1; } if($allow_remove_flag ==1){ $flag_remove = 1; # 子記事に添付画像があれば if($tmpimg ne ""){ # 画像ファイルを削除 if(-e $tmpimg){ unlink($tmpimg); # メタファイルも削除する &rm_meta_file("$tmpimg"); # 携帯用ファイルも削除する if($tmpimg=~ /\.(jpe?g|gif|png|bmp|mng)$/i){ # SNLのパスを調べる if($tmp_imgtitle ne ''){ &parse_img_param($tmp_imgtitle); } &rm_snl_file("$tmp_unq_id","$IMG_PARAMETERS{'snl_dir'}","$IMG_PARAMETERS{'exist_snl_type'}"); } } } } } } # 結果の処理 if($flag_remove == 0){ # 削除に失敗したときは、バッファに入れて保存、記事を残す push(@TMPMESSAGE, $tmpdata); }else{ # 削除に成功 # 記事が削除されたらスレッドリストから削除する $HEAD_MESSAGE{'last_bloods'}=~ s/$tmp_unq_id\-(\d+)\,//gi; if($tmp_blood_name eq ""){ # 親の場合 # 親だった場合は、その血統を記憶しておく # 消された親の血統を持つ子は後のループで全部消える $killed_blood_name="$tmp_unq_id"; }else{ # 子の場合 # 子記事単独消去(親は残る)の場合、ここを通る # 特になにもしない $killed_blood_name=""; } } } #End of if } #End of While eval "flock(IN,8);" if($PM{'flock'} == 1 ); close(IN); # データを書き込む open(OUT, "> $tmp_file")|| &error("設定エラー.テキストデータ保存用ファイル\"$tmp_file\"にデータを書込むことができません.
おそらくファイルに対して書込み許可がないためだと思われます.処理は中断されました."); eval "flock(OUT,2);" if($PM{'flock'} == 1 ); $HEAD_MESSAGE{'last_bloods'}=&Enc_EQ("$HEAD_MESSAGE{'last_bloods'}"); print OUT "\,param_last_bloods=$HEAD_MESSAGE{'last_bloods'};\n"; foreach(@HEAD_MESSAGE){ # HEAD部分 print OUT "$_"; } foreach(@TMPMESSAGE){ # 記事部分 print OUT "$_\n"; } eval "flock(OUT,8);" if($PM{'flock'} == 1 ); close(OUT); } # #====================================# # 親スレッド新着順UIDリストを取得する #====================================# # $HEAD_MESSAGE{'last_bloods'}を入力として # @NEW_BLOODS として親スレッド新着順UIDリストを出す # @RECENT_MESSAGE_UID として最近の記事の新着順UIDリストを出す #(@RECENT_MESSAGE_UIDは副産物。今は(new)表示に使っている) sub output_new_bloods_list{ undef @NEW_BLOODS; undef @RECENT_MESSAGE_UID; local (@SEP_FAMILY); local ($b_child,$b_parent,$already_find_flag); return if($HEAD_MESSAGE{'last_bloods'} eq ""); # 子(親)ー親のペアに分解する @SEP_FAMILY=split(/\,/,$HEAD_MESSAGE{'last_bloods'}); for($numb=0;$numb < scalar(@SEP_FAMILY) ;$numb++){ ($b_child,$b_parent)=split(/\-/,$SEP_FAMILY[$numb]); if($b_parent ne ""){ $already_find_flag=0; # 既に親リストにあれば追加しない foreach(@NEW_BLOODS){ if($_ eq "$b_parent"){ $already_find_flag=1; } } if($already_find_flag == 0){ push(@NEW_BLOODS, $b_parent); } } if($b_child ne ""){ push(@RECENT_MESSAGE_UID, $b_child); } } return(scalar(@NEW_BLOODS)); } #==================================================# # 記事データの削除 (ゲストパスワードチェック部) #==================================================# sub check_guest_passwd{ # ゲストパスワード機能を有効にすると,投稿者 ,削除者 のIPが一致する場合 # ゲストパスワードで記事の削除ができる。 # チェックlを行い,条件を満たせば$allow_remove_flag=1となる。 # 投稿者のホスト名を取得 if($tmp_body=~ /user:\s([^>]*)(\s*)--/){ $tmp_user_IP="$1"; $tmp_user_IP=&tiny_decode("$tmp_user_IP"); #2002.02 #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 する場合のみ有効です"); } } } #==================================================# # 記事データの削除 (削除キー部) #==================================================# # 2001.02(暗号化対応) sub check_rmkey{ # 削除キー機能を有効にすると,削除キーが一致する場合、記事の削除ができる。 # ゲストパスワードとの同時使用はできない。削除キーが設定されてない場合は、 # 記事の削除ができる。チェックを行い,条件を満たせば$allow_remove_flag=1となる。 local($ttmp_rmkey) = @_; # 記事中に埋め込まれた削除キー # フォームで入力された削除キー(暗号化前) local($tmp_form_rmkey)=$FORM{'passwd'}; # フォームで入力された削除キー(暗号化したもの) local($cpt_form_rmkey); $cpt_form_rmkey=&make_pass($tmp_form_rmkey); if(($ttmp_rmkey eq "")||($ttmp_rmkey eq "no_key")){ # 削除キーがログにない古い記事の場合、削除を不許可 # 削除キーがログにない記事の場合、削除を不許可 $skipped_rmkey_remove++; # 削除失敗した記事の数 if($remove_article_number=='1'){ &error(" パスワードが違います.削除を中止しました "); }elsif($remove_article_number == "$skipped_rmkey_remove"){ &error(" パスワードが違います.削除を中止しました "); } return; }else{ # 削除キーがログに存在する場合 if($tmp_form_rmkey eq ""){ &error(" 削除キーが入力されていません。削除できませんでした。
この記事には投稿者により、削除キーが設定されています。記事投稿時に用いた削除キーを入力してください。なお、削除キーを忘失した場合は、掲示板管理者に頼んで削除してもらってください "); }elsif($tmp_form_rmkey eq "$ttmp_rmkey"){ $allow_remove_flag=1; }elsif($cpt_form_rmkey eq "$ttmp_rmkey"){ $allow_remove_flag=1; }else{ $FORM{'passwd'}="****(←セキュリティ対策のため非表\示\)" if($FORM{'passwd'}=~ /ZzZ/); &error(" 入力された削除キー「$FORM{'passwd'}」が違います。削除できませんでした。
この記事には投稿者により、削除キーが設定されています。記事投稿時に用いた削除キーを入力してください。なお、削除キーを忘失した場合は、掲示板管理者に頼んで削除してもらってください "); } } } #=====================# # クッキーを読む #=====================# sub read_cookie{ local($ttt_cookie)=$ENV{'HTTP_COOKIE'}; # URLデコードをする(2002.08.12) $ttt_cookie=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; @pairs = split(/\;/,$ttt_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{'imgboard121'})){ local($name,$value) = split(/\:/); $value=&Dec_EQ($value); $COOKIE{$name} = $value; } foreach ( split(/\,/,$COOKIES{'imgboardad121'})){ local($name,$value) = split(/\:/); $value=&Dec_EQ($value); $COOKIEAD{$name} = $value; } } #========================# # クッキーを書く(R6aVer) #========================# sub set_cookies{ undef $set_value; # セパレータと区別できなくなる=を事前にEnc_eqに置換 $FORM{'utc'}=$new_utc_set; # 連続投稿カウンタ # 削除キーの記憶、非記憶 $FORM{'rmkey'}=&make_pass("$FORM{'rmkey'}"); # 暗号化 $FORM{'rmkey'}="" if($FORM{'rmkeym'} ne "on"); # Clear &CEnc_EQ('subject'); &CEnc_EQ('name'); &CEnc_EQ('email'); &CEnc_EQ('view_mode'); &CEnc_EQ('viewport_set'); &CEnc_EQ('optA'); &CEnc_EQ('optB'); &CEnc_EQ('optC'); &CEnc_EQ('optD'); &CEnc_EQ('optE'); &CEnc_EQ('optF'); &CEnc_EQ('imgtitle'); &CEnc_EQ('utc'); &CEnc_EQ('entry_passwd'); &CEnc_EQ('rmkey'); &CEnc_EQ('rmkeym'); foreach $p_key(keys %T_COOKIE){ # パスワードはXXXpasswdというNAMEにする # これは暗号化される 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("imgboard121","$set_value"); } #=================================# # クッキーを書く(管理メニュー用) #=================================# sub set_admin_cookies{ undef $set_value; # セパレータと区別できなくなる=を事前にEnc_eqに置換 &CEnc_EQ('apasswd'); foreach $p_key(keys %T_COOKIE){ # パスワードはXXXpasswdというNAMEにする # これは暗号化される 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("imgboardad121","$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) = 180; # 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; $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"; # 2002.08.12 Opera対策で日本語をURLエンコードすることにした $value =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "Set-Cookie: $name=$value; expires=$date\n"; # クッキー出力 #&error("Set-Cookie: $name=$value; expires=$date\n"); # tok2対応 # http://www26.tok2.com/home/wingstar/toktokcgi.htmlの情報より if($SERVER_NAME=~ /tok2\.com/){ $tok2_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 $ext{'image/x-png'} = 'png'; # for PNG file $ext{'image/png'} = 'png'; # for PNG file # 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ユーザ) # IMAGE if($fname=~ /\.png$/i){return 'png';} # PNG 形式 if($fname=~ /\.bmp$/i){return 'bmp';} # Win BMP 形式 if($fname=~ /\.pict$/i){return 'pict';}# Mac PICT 形式 if($fname=~ /\.pdf$/i){return 'pdf';} # Adobe PDF形式 if($fname=~ /\.xps$/i){return 'xps';} # XPS(MS-PDF)形式 2009.06 add if($fname=~ /\.epub$/i){return 'epub';}# 電子書籍ファイル 2009.12 if($fname=~ /\.svg$/i){return 'svg';} # SVG画像ファイル # 次の三つの形式は圧縮率が低く、インターネットに不向きな画像形式なので、 # デフォルト設定ではアップロードを許可しない。 # if($fname=~ /\.tiff?$/i){return 'tif';}# TIFF形式 # 2007.07 SecondLifeのSKIN(肌データ)でTGAが使われることが多いため、 # デフォルトで許可するよう仕様変更 if($fname=~ /\.tga$/i){return 'tga';} # TARGA形式 if($fname=~ /\.psd$/i){return 'psd';} # PhotoShop形式 # SecondLife if($fname=~ /\.bvh$/i){return 'bvh';} # bvh形式 # MS_OFFICE if($fname=~ /\.ppt$/i){return 'ppt';} # PowerPoint if($fname=~ /\.rtf$/i){return 'rtf';} # Word98 if($fname=~ /\.doc$/i){return 'doc';} # Word if($fname=~ /\.xls$/i){return 'xls';} # 表計算(excel) if($fname=~ /\.csv$/i){return 'csv';} # データベース if($fname=~ /\.slk$/i){return 'slk';} # 表計算やデータベースのデータ交換用ファイル if($fname=~ /\.mdb$/i){return 'mdb';} # MS Access Data if($fname=~ /\.adp$/i){return 'adp';} # MS Access Data(アップサイジング) if($fname=~ /\.mht$/i){return 'mht';} # MS Web 単一アーカイブ if($fname=~ /\.vsd$/i){return 'vsd';} # MS Visio if($fname=~ /\.art$/i){return 'art';} # クリップアートイメージ # MS_OFFICE2007 if($fname=~ /\.pptx$/i){return 'pptx';} # PowerPoint2007(XML) if($fname=~ /\.docx$/i){return 'docx';} # Word2007(XML) if($fname=~ /\.xlsx$/i){return 'xlsx';} # excel2007(XML) if($fname=~ /\.pptm$/i){return 'pptm';} # PowerPoint2007(XML)Macro有効 if($fname=~ /\.docm$/i){return 'docm';} # Word2007(XML)Macro有効 if($fname=~ /\.xlsm$/i){return 'xlsm';} # excel2007(XML)Macro有効 # Archive if($fname=~ /\.lzh$/i){return 'lzh';} # LHA if($fname=~ /\.sea\.hqx$/i){return 'sea.hqx';} if($fname=~ /\.hqx$/i){return 'hqx';} # Binhex 形式(Mac) if($fname=~ /\.sea$/i){return 'sea';} # SfuffIt形式(Mac) if($fname=~ /\.sit$/i){return 'sit';} # SfuffIt形式(Mac) if($fname=~ /\.cpt$/i){return 'cpt';} # CompactPro形式(Mac) if($fname=~ /\.zip$/i){return 'zip';} # ZIP if($fname=~ /\.tar$/i){return 'tar';} # Tar File if($fname=~ /\.tar\.z$/i){return 'tar.Z';} if($fname=~ /\.tar\.gz$/i){return 'tar.gz';} if($fname=~ /\.tgz$/i){return 'tgz';} # 200509 add # 2009.12 add if($fname=~ /\.rar$/i){return 'rar';} # RAR形式 # 暗号化Archive if($fname=~ /\.atc$/i){return 'atc';} # アタッシュケース形式 if($fname=~ /\.7z$/i){return '7z';} # セブンジップ形式 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ファイル # Mac Application if($fname=~ /\.dxf$/i){return 'dxf';} # AutoCAD 3Dファイル if($fname=~ /\.3ds$/i){return '3ds';} # 3D Studio MAXファイル if($fname=~ /\.pzr$/i){return 'pzr';} # Poserファイル if($fname=~ /\.rok$/i){return 'rok';} # 六角大王ファイル if($fname=~ /\.shd$/i){return 'shd';} # Shadeファイル if($fname=~ /\.sfc$/i){return 'sfc';} # 汎用CAD交換ファイル if($fname=~ /\.p21$/i){return 'p21';} # 汎用CAD交換ファイル if($fname=~ /\.pm6$/i){return 'pm6';} # PageMaker6ファイル if($fname=~ /\.pt6$/i){return 'pt6';} # PageMaker6ファイル if($fname=~ /\.p65$/i){return 'p65';} # PageMaker6.5ファイル if($fname=~ /\.t65$/i){return 't65';} # PageMaker6.5ファイル if($fname=~ /\.qxd$/i){return 'qxd';} # QuarkXpressファイル # 2009.12 add if($fname=~ /\.eps$/i){return 'eps';} # Adobe Illustratorファイル if($fname=~ /\.ai$/i){return 'ai';} # Adobe Illustratorファイル if($fname=~ /\.aep$/i){return 'aep';} # Adobe After Effectsファイル if($fname=~ /\.dim$/i){return 'dim';} # Adobe Dimensionsファイル if($fname=~ /\.ppj$/i){return 'ppj';} # Adobe Premiereファイル if($fname=~ /\.inx$/i){return 'inx';} # Adobe InDesign 互換ファイル if($fname=~ /\.indd$/i){return 'indd';}# Adobe InDesign DOCファイル if($fname=~ /\.indt$/i){return 'indt';}# Adobe InDesign テンプレートファイル if($fname=~ /\.indl$/i){return 'indl';}# Adobe InDesign ライブラリファイル if($fname=~ /\.indb$/i){return 'indb';}# Adobe InDesign ブックファイル if($fname=~ /\.cdr$/i){return 'cdr';} # CorelDRAW画像ファイル # Japanese Application if($fname=~ /\.oas$/i){return 'oas';} # 富士通オアシスファイル if($fname=~ /\.jtd$/i){return 'jtd';} # 一太郎 if($fname=~ /\.jvw$/i){return 'jvw';} # 一太郎(定型文書) if($fname=~ /\.jhd$/i){return 'jhd';} # 花子 if($fname=~ /\.jhdc$/i){return 'jhdc';}# 花子 # WindowsMedia if($fname=~ /\.wma?$/i){return 'wma';} # Windows Media Audio if($fname=~ /\.asf$/i){return 'asf';} # Windows Media (ASF形式) if($fname=~ /\.asx$/i){return 'asx';} # Windows Media (ASF形式 Redirecter) if($fname=~ /\.wmv$/i){return 'wmv';} # Windows Media オーディオ/ビデオ ファイル # Real Audio if($fname=~ /\.ra$/i) {return 'ra';} # Real Audioファイル if($fname=~ /\.ram$/i){return 'ram';} # Real Audioファイル if($fname=~ /\.rm$/i) {return 'rm';} # Real Audioファイル if($fname=~ /\.rmm$/i){return 'rmm';} # Real Audioファイル if($fname=~ /\.rmj$/i){return 'rmj';} # Real Audioファイル # if($fname=~ /\.rmx$/i){return 'rmx';} # Real Audio METAファイル # Other Audio if($fname=~ /\.at3$/i){return 'at3';} # ATRAC3 ファイル # 電子名刺共通データ(携帯アドレス帳等) if($fname=~ /\.mng$/i){return 'mng';} # PNG アニメーション if($fname=~ /\.vcf$/i){return 'vcf';} # vCard(アドレス帳) if($fname=~ /\.vcs$/i){return 'vcs';} # vCalendar(スケジュール帳) if($fname=~ /\.vmg$/i){return 'vmg';} # vMessage(メールデータ) if($fname=~ /\.vbm$/i){return 'vbm';} # vBookmark(ブックマークデータ) if($fname=~ /\.vnt$/i){return 'vnt';} # vNote(定型文・メモ帳) # 携帯(EZ new) # if($fname=~ /\.amc$/i){return 'amc';} # ezmovie if($fname=~ /\.3g2$/i){return '3g2';} # EZムービーデータ # 携帯(FOMA) new if($fname=~ /\.mp3$/i){return 'mp3';} # MP3データ if($fname=~ /\.mp4$/i){return 'mp4';} # MP4データ(iモーション) # スマートフォンやimgboard FLV Playerとの互換性対策 if($ENV{'CONTENT_LENGTH'} < 10000*1024){ # 10MB以下の場合 if($fname=~ /\.3gp$/i){return '3gp';} # MP4データ(iモーション) if($fname=~ /\.3gpp$/i){return '3gpp';}# MP4データ(iモーション) if($fname=~ /\.3gp4$/i){return '3gp4';}# MP4データ(iモーション) }else{ # どうせiムービーでは再生できない。 # よって、スマートフォンやFlv Playerと互換性の良いmp4にする if($fname=~ /\.3gp$/i){return 'mp4';} # MP4データ if($fname=~ /\.3gpp$/i){return 'mp4';}# MP4データ if($fname=~ /\.3gp4$/i){return 'mp4';}# MP4データ } # 2010.08 iPhoneの動画対応 if($fname=~ /\.mov$/i){return 'mp4';} # 2005.1 M4A対応 if($fname=~ /\.m4a$/i){return 'm4a';} # MPEG-4 AAC Audio(iTunes) if($fname=~ /\.m4b$/i){return 'm4b';} # MPEG-4 AAC Audio DRM(iTunes) if($fname=~ /\.aa$/i) {return 'aa';} # audible.com spoken word if($fname=~ /\.aax$/i){return 'aax';} # audible.com spoken word Enhanced if($fname=~ /\.aiff?$/i){return 'aif';} # AIFF # 2009.10 iPhone対応追加 if($fname=~ /\.m4v$/i){return 'm4v';} # M4vファイル # 2005.09 add if($fname=~ /\.mqv$/i){return 'mqv.mov';}# Sony MoviePlayer形式 # 2009.06追加 if($fname=~ /\.ogm$/i){return 'ogm';} # ogg Vorbis if($fname=~ /\.mkv$/i){return 'mkv';} # MKVコンテナ(DivX7等) if($fname=~ /\.ogv$/i){return 'ogv';} # ogg Theora (VP3 for HTML5) # 携帯(Jフォン)R5d new if($fname=~ /\.smd$/i){return 'smd';} # Jスカイメロディ if($fname=~ /\.mmf$/i){return 'mmf';} # Jスカイメロディ if($fname=~ /\.pmd$/i){return 'pmd';} # EZ音声/きゃらメロ if($fname=~ /\.qcp$/i){return 'qcp';} # EZ音声/きゃらメロ if($fname=~ /\.mld$/i){return 'mld';} # iメロディ # その他細かい物は削除。今後は imgboard 2010をご利用ください。 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=~ /\.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';} # 2006.12.13 Flash Movie追加 if($fname=~ /\.flv$/i){return 'flv';} # Flash Video # 2010.06.08 imgboard FLV Player用に追加 if($fname=~ /\.f4v$/i){return 'mp4';} # Flash Video if($fname=~ /\.f4a$/i){return 'mp4';} # Flash Video # if($fname=~ /\.f4b$/i){return 'mp4';} # Flash Video(保護付きなので再生できない) # 拡張子がtxtと違うけど、プレインテキスト属性だとブラウザが判断したデータ # をここで救う if($content_type =~ /text\/plain/i){ return 'txt'; } } #end of allow_other_multimedia_data == OK $unknown_data_exit=1; # データタイプ不明の場合の最終判断 if($unknown_data_exit==1){ &error(" 現在の設定では、このタイプのデータはアップロードできません."); }else{ return 'dat'; } } #==========================# # Content-type の自動補完 #==========================# sub additional_content_types{ # 拡張子がないファイルがアップロードされた場合、ブラウザから通知された # マイムタイプから拡張子を決定します。Macユーザからの拡張子なしファイル # のアップロードに対応するための部分です。 # 画像系(その他) # $ext{'image/x-png'} = 'png'; # for PNG file # $ext{'image/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{'application/vnd.ms-xpsdocumen'}= 'xps'; # for MS-PDF file 2009.06 add $ext2{'x-shockwave-flash'}= 'swf'; # for Shockwave_flash $ext2{'postscript'}= 'ps'; # for PostScript $ext2{'application/epub'}= 'epub'; # for kindle(epub) 2009.12 # アーカイブ系 $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) $ext2{'application/x-7z-compressed'}= '7z'; # for 7ZIP # 3D & ビデオ系 $ext2{'x-world/x-vrml'} = 'wrl'; # for 3D-VRML file # TODO movも小さいときは3GPにリネームした方がいいかも $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-ntt-vod(.*)'}= 'nsmil';# for VOD Script file $ext2{'video/x-ms-wvx'}= 'wvx'; # Windows Media オーディオ/ビデオ ショートカット $ext2{'video/x-ms-wmv'}= 'wmv'; # Windows Media オーディオ/ビデオ ファイル # スマートフォンやimgboard FLV Playerとの互換性対策 if($ENV{'CONTENT_LENGTH'} < 10000*1024){ # 10MB以下の場合 $ext2{'video/3gpp'} = '3gp'; # for i-Motion file $ext2{'video/3gp'} = '3gp'; # for i-Motion file $ext2{'video/3gpp2'} = '3g2'; # EZムービーデータ $ext2{'audio/3gpp'} = '3gp'; # for i-Motion file $ext2{'audio/3gpp2'} = '3g2'; # EZムービーデータ # 10MB以上だと、どうせ再生できないので、 # FLVPlayerやiPhone/iPadと互換性の高いmp4拡張子にする }else{ $ext2{'video/3gpp'} = 'mp4'; # for i-Motion file $ext2{'video/3gp'} = 'mp4'; # for i-Motion file $ext2{'video/3gpp2'} = 'mp4'; # EZムービーデータ $ext2{'audio/3gpp'} = 'mp4'; # for i-Motion file $ext2{'audio/3gpp2'} = 'mp4'; # EZムービーデータ } # 2006.12.13 追加 $ext2{'video/x-flv'} = 'flv'; # Flash Videoデータ # 2009.10 追加 # $ext2{'application/x-mpeg'} = 'amc'; # ezmovieデータ $ext2{'video/x-m4v'} = 'm4v'; # M4v データ # vCard対応(電子名刺データ共通フォーマット) $ext2{'text/x-vbookmark'}= 'vbm'; # for vBookMark file $ext2{'text/x-vcalender'}= 'vcs'; # for vCalendar file(謎?) $ext2{'text/x-vcalendar'}= 'vcs'; # for vCalendar file $ext2{'text/x-vmessage'}= 'vmg'; # for vMessage file # 各社携帯データ $ext2{'audio/x-smd'} = 'smd'; # for SMD $ext2{'application/x-smaf'}= 'mmf'; # for MMF $ext2{'video/mng'} = 'mng'; # for Animation file $ext2{'video/x-mng'} = 'mng'; # for Animation file $ext2{'audio/amr'} = 'amr'; # AMR audio(docomo) $ext2{'application/x-decomail-template'} = 'dmt'; # デコメールテンプレート(docomo) $ext2{'application/x-htmlmail-template'} = 'hmt'; # デコレメール(SoftBank) $ext2{'pplication/x-kddi-htmlmail'} = 'khm';# auデコメール $ext2{'application/x-jam'} = 'jam'; # iアプリ $ext2{'application/java-archive'} = 'jar'; # Javaアプリ $ext2{'text/vnd.sun.j2me.app-descriptor'} = 'jad'; # Javaアプリ $ext2{'application/x-kjx'} = 'kjx'; # EZ APL # 会社で仕事に役立ち系 $ext2{'text/html'}= 'html'; # HTMLテキスト # $ext2{'text/plain'}= 'txt'; # テキスト $ext2{'msword'}= 'doc'; # MS_WORD $ext2{'excel'}= 'xls'; # MS_Excel $ext2{'powerpoint'}= 'ppt'; # MS_PowerPoint # NIMDA対策で外すことにした(2001.09/21) # $ext2{'message/rfc822'}= 'eml'; # Outlook Express メイル # 音楽系 $ext2{'audio/mpeg'}= 'mp3'; # for MPEG Audio $ext2{'audio/x-mpegurl'}= 'm3u'; # for MPEG Audio $ext2{'audio/mp4'} = 'm4a'; # for MPEG Audio AAC $ext2{'audio/x-m4a'}= 'm4a'; # for MPEG Audio AAC $ext2{'audio/x-m4b'}= 'm4b'; # for MPEG Audio AAC $ext2{'audio/x-m4p'}= 'm4p'; # for MPEG Audio AAC $ext2{'audio/x-wav'}= 'wav'; # for WAV Audio $ext2{'audio/(.+)mid'}= 'mid'; # for MIDI file $ext2{'audio/(.+)aiff?'}= 'aif'; # for AIFF file $ext2{'audio/basic'}= 'au'; # for Sun Audio $ext2{'audio/(.+)realaudio'}= 'ram'; # for Real Audio $ext2{'audio/x-ms-wax'}= 'wax'; # WindowsMedia Audioショートカット $ext2{'audio/x-ms-wma'}= 'wma'; # WindowsMedia Audioファイル # 2009.06 追加 $ext2{'audio/audible'} = 'aa'; # for audible spoken word file(iPod) $ext2{'audio/x-audible'} = 'aa'; # for audible spoken word file(iPod) $ext2{'audio/vnd.audible.aax'} = 'aax'; # for audible spoken word Enhanced file(iPod) } # 2009.10 new #=========================================# # 拡張子からマイムを計算するルーチン #=========================================# # HTML5の埋め込み用に、拡張子からマイムを計算するルーチン # # sub make_html5_mimetype{ local($tmpp_check_ctype) =$_[0];# 引数1として取得 local($tmpp_img_location) =$_[1];# 引数2として取得 if($tmpp_check_ctype=~ /video/i){ # video if($tmpp_img_location=~ /\.3gp?p$/i){return 'video/3gpp';} if($tmpp_img_location=~ /\.3gp?p?2$/i){return 'video/3gpp2';} if($tmpp_img_location=~ /\.mov$|\.qt$|\.mqv$/i){return 'video/quicktime';} if($tmpp_img_location=~ /\.mp4$/i){return 'video/mp4';} if($tmpp_img_location=~ /\.m4v$/i){return 'video/x-m4v';} if($tmpp_img_location=~ /\.mp4$/i){return 'video/mp4';} } # audio if($tmpp_check_ctype=~ /audio/i){ if($tmpp_img_location=~ /\.mp3$/i){return 'audio/mp3';} if($tmpp_img_location=~ /\.m4a$/i){return 'audio/x-m4a';} # AAC audio if($tmpp_img_location=~ /\.m4b$/i){return 'audio/x-m4b';} # AAC audio book if($tmpp_img_location=~ /\.m4p$/i){return 'audio/x-m4p';} # AAC audio (protected) if($tmpp_img_location=~ /\.aiff?$/i){return 'audio/aiff';} # AIFF if($tmpp_img_location=~ /\.amr$/i){return 'audio/amr';} # AMR audio if($tmpp_img_location=~ /\.wav$|\.bwf$/i){return 'audio/wav';} # WAVE audio } return 'nomatch'; } # #=========================# # html出力 #=========================# #====================================# # フォーム部分のHTMLを出力する #====================================# sub output_form_html{ # 表示モード以外ならフォームを出さない if($FORM{'mode'} ne ""){ return; } # 修正記事選択画面ならフォームを出さない if(($FORM{'amode'} eq "select_edit")&&($FORM{'bbsaction'} ne "edit_form")){ return; } # 代入する変数を準備 # 表示モード・デフォルト選択値 if($COOKIE{'view_mode'} ne ""){ &select_default_view_mode; # 2010.06.23 未投稿経験者にFLV Playerが表示されない問題に対処 }else{ if($show_img_on_board == 1){ $COOKIE{'view_mode'}='as_cgi_defined'; } } # フォーム欄の色 if($HTTP_USER_AGENT =~ /IE/i){ $bgcolor_ie="bgcolor=GRAY"; } #==================================================# # 同一ウィンド表示時(デフォルト)の掲示板の先頭 #==================================================# if(($form_disp_on_board ==1)||($FORM{'bbsaction'} eq 'disp_form_only')||($FORM{'bbsaction'} eq 'disp_rep_form')||($FORM{'bbsaction'} eq 'edit_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='タグ使用可。使用する場合、閉じ忘れにご注意ください'; } # youTubeタグを許可する場合、説明を表示する if($use_youtube_tag_in_comment == 1){ $tag_siyou_tyuui="$tag_siyou_tyuui".'

  • youTube,dailymotion,ustream上の、あなたの動画を掲示板に埋込表示する場合は、"埋め込みコード"の< object で始まるHTMLタグをそのまま本文欄にコピペしてください
  • '; } # 返信・編集フォーム時は画像アップロードさせない if(($FORM{'bbsaction'} eq 'disp_rep_form')||($FORM{'bbsaction'} eq 'edit_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; # 修正ウィンドの時は以下を出さない return if($FORM{'bbsaction'} eq "edit_form"); if($FORM{'bbsaction'} eq 'disp_rep_form'){ print<
    • $tag_siyou_tyuui
    HTML_END }else{ # アンカーリンク部分を出力(書換えは初期設定の所で行う) &link_top_html if($form_disp_on_board ==1); # 入力フォーム下の説明部分を出力(書換えは初期設定の所で行う) &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); # アンカーリンク部分を出力(書換えは初期設定の所で行う) &link_top_html; print<
    $cm_out_exit_h$cm_out_exit_f
    EOF print<
    EOF } #============================================# # 別ウィンド表示時の掲示板の先頭ここまで #============================================# } #====================================# # 記事部分のHTMLを出力する #====================================# sub output_html{ local($tmp_file) = $_[0];# 処理するログファイル名 # cgi_wrap使用プロバイダ対策 # 古いプロバイダの中にはcgi_wrapを使っているプロバイダがあります。 # 相対パス指定を使用する場合、下記の数値を1にして、そのイメージ # 保存ディレクトリのURLを$img_urlで指定することにより、掲示板を # 使用する事ができます。それ以外の人は必ず0に指定してください。 # なお、1を指定した場合は$img_urlの設定が必須になります。 $using_cgi_wrap=0;#(デフォルト0) # メッセージを読み込む # 読込みながらページ生成に必要な情報を作る undef @HEAD_MESSAGE; undef @GOUP_MESSAGE; # 上へ持って行くメッセージ(ただ抜いたもの) undef @LATEST_MESSAGE; # 上へ持って行くメッセージ(ソート後) undef @RECENT_MESSAGE_UID; # 最近登録されたメッセージ #$PM{'res_go_up'} = 1; undef @MESSAGE; undef $all_message; local($tmp_parent); undef @PAGE_START; # ページスタートの記事番号情報を保存する配列 undef @PAGE_END; # ページエンド の記事番号情報を保存する配列 undef $page_parent_counter; # 親記事を数える $total_counter="0"; # 親+子の記事を数える # 検索用変数 local($search_words) = $FORM{'SearchWords'}; local($match_mode) = $FORM{'MatchMode'}; # 検索タイプ(AND OR) local($match_flag); # 返信記事を作成する場合は検索機能を流用する # 親記事の血統を持つ記事を表示する if($FORM{'bbsaction'} eq 'disp_rep_form'){ $search_words ="$FORM{'blood'}"; $match_mode ="AND"; } # ループに入る前にチェック&下処理をしておく if(($FORM{'mode'} eq "search_menu")||($FORM{'bbsaction'} eq 'disp_rep_form')){ if($search_words eq ""){ &error(" 検索ワードが入力されていません "); }else{ $search_words =~ s/ / /g; @tmp_search_words = split(/\s+/, $search_words); } } open(READ, "$tmp_file"); eval "flock(READ,1);" if($PM{'flock'} == 1 ); push(@PAGE_START,0); # 条件に一致するものを@MESSAGEに入れる while(){ # HEADER保存 (将来への拡張もここで対応) if($_ =~ /^\#?\,param_/i){ if($_ =~ /^\,param_last_update(\s*)=(\s*)(\d+)(\s*)/i){ # 最終更新日を取得する $HEAD_MESSAGE{'last_update'}="$3"; }elsif($_ =~ /^\,param_last_bloods(\s*)=(\s*)([^\;]*)(\;+)(\s*)/i){ # 最新記事のスレッドのリストを取得する $HEAD_MESSAGE{'last_bloods'}="$3"; $HEAD_MESSAGE{'last_bloods'}=&Dec_EQ("$HEAD_MESSAGE{'last_bloods'}"); &output_new_bloods_list; }else{ push(@HEAD_MESSAGE, $_); } } # Debug # &error("nw @NEW_BLOODS"); if($_ =~ /^([^\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 $match_flag; # 検索時 if(($FORM{'mode'} eq "search_menu")||($FORM{'bbsaction'} eq 'disp_rep_form')){ $tmp_line_data=$_; # 検索するラインを保存 foreach $tmp_search_word(@tmp_search_words) { #&error("$tmp_search_word"); # 2004.05 $tmp_search_word=~ tr/A-Z/a-z/; # 小文字に統一 $tmp_line_data =~ tr/A-Z/a-z/; # 小文字に統一 $tmp_enc_search_word=&Enc_EQ("$tmp_search_word"); if(($tmp_search_word =~/http/)&&($tmp_line_data =~/http/)){ #&error("tmp_search_word-$tmp_search_word-tmp_line_data-$tmp_line_data"); } if (index($tmp_line_data,$tmp_search_word) >= 0) { $match_flag=1; if($match_mode eq 'OR') { last; } }elsif (index($tmp_line_data,$tmp_enc_search_word) >= 0) { $match_flag=1; if($match_mode eq 'OR') { last; } }else{ if ($match_mode eq 'AND') { $match_flag=0; last; } } } if($match_flag ==1){ push(@MESSAGE, $_); $all_message++; }else{ next; } # 非検索時 }else{ # レスのついた記事を上へ持って行くために # @MESSAGEへ入れずに、@GOUP_MESSAGEへ if($PM{'res_go_up'} == 1){ undef $tp_match_flag; local($tp_loop_counter)=0; foreach $tmp_parent(@NEW_BLOODS){ # 3スレッドまで上へ持って行く # それ以上にすると負荷が上がるのでやめる last if($tp_loop_counter >= 3); if(($tmp_parent eq "$9")||($tmp_parent eq "$11")){ $tp_match_flag = 1; last;# 検出したら抜ける } $tp_loop_counter++; } if($tp_match_flag == 1){ push(@GOUP_MESSAGE, $_); $all_message++; }else{ push(@MESSAGE, $_); $all_message++; } }else{ push(@MESSAGE, $_); $all_message++; } } } } eval "flock(READ,8);" if($PM{'flock'} == 1 ); close(READ); # Debug # &error("gup @GOUP_MESSAGE"); # webslice temp rss if($FORM{'bbsaction'} eq 'webslice'){ print("最新記事投稿日時$RECENT_MESSAGE_UID[0]"); $user_selected_view_mode=0; # return; } # レスのついた記事を上へ持って行くために、 # @MESSAGEの先端に足す # 高速化、低負荷化のために、リストに入れてから、ソートする if($PM{'res_go_up'} == 1){ # 検索とレスの場合は足さない if(($FORM{'mode'} ne "search_menu")&&($FORM{'bbsaction'} ne 'disp_rep_form')){ local($tmp_goup_line); $tp_loop_counter=0; foreach $tmp_parent(@NEW_BLOODS){ # 3スレッドまで上へ持って行く last if($tp_loop_counter >= 3); foreach $tmp_goup_line(@GOUP_MESSAGE){ if($tmp_goup_line =~ /^([^\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]*)/){ if(($tmp_parent eq "$9")||($tmp_parent eq "$11")){ push(@LATEST_MESSAGE,$tmp_goup_line); } } } $tp_loop_counter++; } # @MESSAGEの先端に足す unshift(@MESSAGE,@LATEST_MESSAGE); # Debug # &error("mes @MESSAGE"); # &error("latest @LATEST_MESSAGE"); } } # ページ情報を作る foreach(@MESSAGE){ if($_ =~ /^([^\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]*)/){ # 記事閲覧、ページ生成に必要な情報(@PAGE_START)を用意する if($9 ne ""){ # $child_kiji_flag="1"; # 子記事確認用フラグ }else{ $page_parent_counter++; } if($page_parent_counter > $disp_message){ push(@PAGE_START,$total_counter); push(@PAGE_END,$total_counter-1); $page_parent_counter=1; } $total_counter++; } } push(@PAGE_END,$total_counter); #&error("start @PAGE_START end @PAGE_END"); # ページを決める $total_page=@PAGE_START; if($FORM{'page'} > 0){ if($FORM{'page'} > $total_page){ $disp_page = $total_page; }else{ $disp_page = $FORM{'page'}; } }else{ $disp_page = 1; } $next_page = $disp_page + 1; $pre_page = $disp_page - 1; &output_kiji_html; #====================================# # 記事部分のHTMLを出力する #====================================# sub output_kiji_html{ # ユーザプロファイル指定部分のHTML(書換えはsub form_usr_profile_htmlの所で行う) if($user_selected_view_mode==1){ &form_user_profile_html; } if($FORM{'mode'} eq "search_menu"){ print"
    \n"; print"$total_counter件の記事がヒットしました \n"; print"
    \n"; }elsif($FORM{'bbsaction'} eq 'disp_rep_form'){ print"
      \n"; print" ↓以下の記事スレッドに、フォームの内容が追加されます "; print"
    \n"; } # 外部ファイル用の処理をロード(将来拡張用) if($EXTSUB{'kiji_pre_loop'} == 1){ &ext_config_kiji_pre_loop; } # 管理者モード解除用のリンクを出す if($FORM{'amode'} ne ""){ print qq|

    \n|; print qq|
    ---- 現在、掲示板は管理者モード$amode_done_mes01です ----- [管理者モード終了]
    \n|; print qq|
    \n|; } # webslice if($FORM{'bbsaction'} eq "webslice"){ $PAGE_END[$disp_page-1]=1; }else{ # 記事削除指定用のフォーム開始部 print"\n"; print"
    \n"; print"\n"; print"\n"; print"\n"; print"\n"; print"$POSTADDP{'REMOVEFORM'}\n"; } print"\n"; # 2008.08 $oya_kiji_embed_flag=0; # 親記事がEMBED系確認用フラグ $child_kiji_embed_flag=0; # 子記事がEMBED系確認用フラグ # 記事部 inu for($i=$PAGE_START[$disp_page-1];$i<=$PAGE_END[$disp_page-1];$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_rmkey; undef $tmp_unq_id; undef $tmp_snl_location; undef $new_kiji_flag; # 最近の記事フラグ $tmp_subject = $1; $tmp_name = $2; $tmp_email = $3; $tmp_date = $4; $tmp_body = $5; $tmp_img_location = $6; $tmp_imgtitle = $7; $tmp_seq_no = $8; # 連番 $tmp_blood_name = $9; # 親の血統ID(子供のみ持つ) $tmp_rmkey = $10; # 削除キー $tmp_unq_id = $11; # 固有ID(時刻ベース) $new_p1 = $12; $new_p2 = $13; $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++ } # Debug # &error("rmid @RECENT_MESSAGE_UID"); # 最新投稿記事にはフラグを立てる if($PM{'disp_new_notice'}==1){ $tp_loop_counter=0; foreach $recent_uid(@RECENT_MESSAGE_UID){ last if($tp_loop_counter >= 3 ); if($recent_uid == $tmp_unq_id ){ $new_kiji_flag="1"; # 最近の記事フラグ last; } $tp_loop_counter++; } } $tmp_subject=&Dec_EQ("$tmp_subject"); undef %IMG_PARAMETERS; undef %YOUTUBE_VIDEO;# 2008.06.25 undef %CLIPLIFE_VIDEO;# 2008.08.18 undef %DAILYMOTION_VIDEO;# 2009.12 undef %USTREAM_VIDEO; # 2010.05 undef %HTML5_PARAM; # 2010.05 # imgtitleから情報を抜き出す if($tmp_imgtitle ne ""){ $tmp_imgtitle=&parse_img_param("$tmp_imgtitle"); } # 予備入力項目パラメータを復元 # bodyの中に、コメントアウト形式でデータは隠し保存されている # 書式 #を除きパラメータ部を抽出する処理 if($tmp_body ne ''){ ($tmp_body,$opt_form_data) =split(/<\!--opt:/,$tmp_body); $opt_form_data =~ s/-->//g; } #パラメータ$opt_form_dataが追加されている場合. undef %OPTDATA; # 新R6 undef %OPT_FORM_DATA; # 旧R5互換用 if($opt_form_data ne ''){ foreach ( split(/;/,$opt_form_data)){ local($name,$value) = split(/\=/); $value=&Dec_EQ("$value"); if($name=~ /^opt_data_(.+)$/){ $OPTDATA{"opt$1"} = $value; $OPT_FORM_DATA{"opt$1"}= $value;# 旧R5互換用 # 徐々にこちらへシフト }elsif($name=~ /^opt(.+)$/){ $OPTDATA{"$name"} = $value; $OPT_FORM_DATA{"$name"}= $value;# 旧R5互換用 } } } # 相手のホスト名を変数$user_IP に代入 # (なりすまし防止などの事情で相手のIPを表示したい場合はこの変数を使って下さい) if($tmp_body=~ /user:\s([^>]*)(\s*)--/){ $user_IP="$1"; $user_IP=&tiny_decode("$user_IP"); #2002.02 # $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; if($FORM{'bbsaction'} eq 'webslice'){ $disp_mode = "img_use_snl_iS"; } # テキストリンク用HTML指定部に代入する$data_typeを選択 $disp_ip_flag=0; undef $data_type; if($tmp_img_location ne ""){ if($tmp_img_location=~ /\.gif$|\.jpe?g$|\.png$/i){ $data_type=" 画 像 "; }elsif($tmp_img_location=~ /\.aiff?$|\.aifc$|\.snd$|\.au$|\.midi?$|\.wav$/i){ $data_type=" 音 声 "; }elsif($tmp_img_location=~ /\.ram?$|\.rmm?$|\.rmj$/i){ $data_type=" 音 声 (RealPlayer) "; }elsif($tmp_img_location=~ /\.mp4$/i){ $data_type=" 動画\/音声 [MP4形式→QuickTime再生 (PC再生)] "; }elsif($tmp_img_location=~ /\.mp3$/i){ $data_type=" 音 声 (MP3形式) "; }elsif($tmp_img_location=~ /\.wma?$/i){ $data_type=" 音 声 (Windows Media Audio) "; }elsif($tmp_img_location=~ /\.at3$/i){ $data_type=" 音 声 (ATRAC3形式) "; }elsif($tmp_img_location=~ /\.ogg$/i){ $data_type=" 音 声 (ogg Vorbis 形式) "; }elsif($tmp_img_location=~ /\.aax?$/i){ $data_type=" 音 声 (オーディオブック形式) "; }elsif($tmp_img_location=~ /\.te?xt$|\.html?$/i){ $data_type=" テキスト "; }elsif($tmp_img_location=~ /\.oas(\d)?$/i){ $data_type=" オアシス文書 "; }elsif($tmp_img_location=~ /\.jtd$|\.jvw$/i){ $data_type=" 一太郎 文書 [MS Word or 一太郎Viewer (PC再生)] "; }elsif($tmp_img_location=~ /\.jhd$|\.jhdc$/i){ $data_type=" 花子 文書 [花子Viewer (PC再生)]"; }elsif($tmp_img_location=~ /\.pdf$/i){ $data_type=" Adobe PDF 書類 "; }elsif($tmp_img_location=~ /\.xps$/i){ $data_type=" XPS MS版PDF 書類 "; }elsif($tmp_img_location=~ /\.epub$/i){ $data_type=" 電子書籍 epub書類 "; #2009.12 }elsif($tmp_img_location=~ /\.xdw$|\.xbd$/i){ $data_type=" DocuWorksデ\ータ [DocuWorks Viewer(PC再生)]"; }elsif($tmp_img_location=~ /\.ai$|\.eps$/i){ $data_type=" Adobe イラストレーター書類 "; }elsif($tmp_img_location=~ /\.ppj$/i){ $data_type=" Adobe Premiere 書類 "; }elsif($tmp_img_location=~ /\.indd$|\.indt$|\.indl$|\.indb$|\.inx$/i){ $data_type=" Adobe InDesign DATA "; }elsif($tmp_img_location=~ /\.shd$/i){ $data_type=" Mac Shade 書類 "; }elsif($tmp_img_location=~ /\.pzr$/i){ $data_type=" Mac Poser 書類 "; }elsif($tmp_img_location=~ /\.pm6$|\.pt6$|\.p65$|\.t65$/i){ $data_type=" Mac PageMaker 書類 "; # 2009.10 アタッシュケース対応 }elsif($tmp_img_location=~ /\.atc$/i){ $data_type=" 圧縮デ\ータ [AES暗号化 (PC解凍)] "; }elsif($tmp_img_location=~ /\.7z$/i){ $data_type=" 圧縮デ\ータ [7zip暗号化 (PC解凍)] "; }elsif($tmp_img_location=~ /\.(zip|tar|rar|arj|tar.g?z)$/i){ $data_type=" 圧縮デ\ータ($1形式) "; }elsif($tmp_img_location=~ /\.rok$/i){ $data_type=" 3D 六角大王 書類 "; }elsif($tmp_img_location=~ /.(dxf|jwc|jww|rok|sfc|p21|3ds)$/i){ $data_type=" 3Dデ\ータ($1形式) "; # Secondlife 2007.08.15 update }elsif($tmp_img_location=~ /\.bvh$/i){ $data_type=" デ\ータ [BVHモーション]"; }elsif($tmp_img_location=~ /\.tga$/i){ $data_type=" デ\ータ [Secondlife-TARGA]"; # 携帯 2002.04.05 update }elsif($tmp_img_location=~ /\.vcs$/i){ $data_type=" デ\ータ [vCardスケジュール帳]"; }elsif($tmp_img_location=~ /\.vcf$/i){ $data_type=" デ\ータ [vCardアドレス帳]"; }elsif($tmp_img_location=~ /\.vmg$/i){ $data_type=" デ\ータ [vCardメール]"; }elsif($tmp_img_location=~ /\.vbm$/i){ $data_type=" デ\ータ [vCardブックマーク]"; }elsif($tmp_img_location=~ /\.vnt$/i){ $data_type=" デ\ータ [vCard定型文・メモ帳]"; }elsif($tmp_img_location=~ /\.mng$/i){ $data_type=" 動 画 [JSKY-Animation]"; }elsif($tmp_img_location=~ /\.amc$/i){ # $data_type=" 動 画 [ezmovie形式]"; $data_type=" 動 画/着ムービ [ au ezmovie形式(PC再生)]"; }elsif($tmp_img_location=~ /\.3gp$/i){ $data_type=" 動 画 [iモーション or 着ムービ or QuickTime圧縮 (PC再生)] "; }elsif($tmp_img_location=~ /^(.*)\.3g2/i){ $data_type=" 動 画 [au EZムービー or 着うた3G2形式 (PC再生)] "; }elsif($tmp_img_location=~ /\.flv$/i){ # 2006.12.13 FLV対応 $data_type=" 動 画 [Flash Video形式→FLV再生 (PC再生)] "; }elsif($tmp_img_location=~ /\.mkv$/i){ $data_type=" 動 画 [MKV形式→PC再生 (PC再生)] "; # 2009.06 OGM対応 }elsif($tmp_img_location=~ /\.ogm$/i){ $data_type=" 動 画 [OGM形式→PC再生 (PC再生)] "; }elsif($tmp_img_location=~ /\.ogv$/i){ $data_type=" 動 画 [OGV形式→PC再生 (PC再生)] "; # 2009.12 m4v対応 }elsif($tmp_img_location=~ /\.m4v$/i){ $data_type=" 動 画 [M4V形式→QuickTime再生 (PC再生)] "; }elsif($tmp_img_location=~ /\.vod$|\.nsmil$/i){ $data_type=" 動 画 [VOD スクリプト]"; }elsif($tmp_img_location=~ /\.smd$/i){ $data_type=" 音 声 [Jスカイメロディ]"; }elsif($tmp_img_location=~ /\.mmf$/i){ $data_type=" 音 声 [着うた/着メロ(Docomo)(PC再生)] "; }elsif($tmp_img_location=~ /\.pmd$|\.qcp$/i){ $data_type=" 音 声 [EZ音声/きゃらメロ]"; }elsif($tmp_img_location=~ /\.mld$/i){ $data_type=" 音 声 [着うた/着メロ(Docomo)]"; # 2009.12 add }elsif($tmp_img_location=~ /\.dmt$/i){ $data_type=" デ\ータ [docomoデコメテンプレ]"; }elsif($tmp_img_location=~ /\.khm$/i){ $data_type=" デ\ータ [auデコメテンプレ]"; }elsif($tmp_img_location=~ /\.hmt$/i){ $data_type=" デ\ータ [SoftBankデコレメール]"; }elsif($tmp_img_location=~ /\.jam$/i){ $data_type=" デ\ータ [docomo iアプリ]"; }elsif($tmp_img_location=~ /\.jar$/i){ $data_type=" デ\ータ [Javaアーカイブ or Javaアプリ(危険性あり注意)]"; }elsif($tmp_img_location=~ /\.jad$/i){ $data_type=" デ\ータ [Java Jadファイル or Javaアプリ(危険性あり注意)]"; }elsif($tmp_img_location=~ /\.ucm$|\.ucp$/i){ $data_type=" デ\ータ [docomo きせかえツール]"; }elsif($tmp_img_location=~ /\.kjx$/i){ $data_type=" デ\ータ [EZアプリ]"; }elsif($tmp_img_location=~ /\.m4a$/i){ $data_type=" 音 声 [MPEG-4 AAC Audio(PC再生)]"; }elsif($tmp_img_location=~ /\.m4b$/i){ # 2009.06 add $data_type=" 音 声 [MPEG-4 AAC DRM Audio(PC再生)]"; }elsif($tmp_img_location=~ /\.m4p$/i){ # 2009.06 add $data_type=" 音 声 [MPEG-4 AAC iTune DRM Audio(PC再生)]"; }elsif($tmp_img_location=~ /\.amr$/i){ # 2009.12 add $data_type=" 音 声 [AMR形式→QuickTime再生 (PC再生)]"; }elsif($tmp_img_location=~ /\.hdml$/i){ $data_type=" EZweb/H\"等WAP系HDML 書類 "; }elsif($tmp_img_location=~ /\.ppt$|\.xls$|\.csv$|\.rtf$|\.doc$/i){ $data_type=" OFFICE 書類 "; }elsif($tmp_img_location=~ /\.pptx$|\.xlsx$|\.docx$/i){ $data_type=" MS OFFICE2007 書類 "; }elsif($tmp_img_location=~ /\.pptm$|\.xlsm$|\.docm$/i){ $data_type=" OFFICE2007書類(Macro有効) "; }elsif($tmp_img_location=~ /\.mdb$|\.adp$/i){ $data_type=" MS Access 書類 "; }elsif($tmp_img_location=~ /\.vsd$/i){ $data_type=" MS Visio書類 "; }elsif($tmp_img_location=~ /\.mpp$/i){ $data_type=" MS Project 書類 "; }elsif($tmp_img_location=~ /\.slk$/i){ $data_type=" 表計算汎用交換デ\ータ 書類 "; }elsif($tmp_img_location=~ /\.wri$/i){ $data_type=" Windows ワ\ードパット書類 "; }else{ $disp_ip_flag=1; $data_type=" データ "; } } #========================# # CGIのURLを決める #========================# # imgboard FLV Player 2010.06.02 update # メールリンク/imgboard FLV Player用 # sub make_contents_url { if($tmp_img_location ne ""){ $MYCGI_ENV{'img_box_base_url'}="$MYCGI_ENV{'cgi_base_url'}"."$tmp_img_location"; $MYCGI_ENV{'img_box_base_url'}=~ s/\.\///g; } } # &make_contents_url; # 3GPはFlashPlayerで再生できなかった if((($COOKIE{'view_mode'} eq "")&&($show_img_on_board == 1))||($COOKIE{'view_mode'}=~ /as_cgi_defined$|text_img_type12$|text_img_type13$|text_img_type2$|text_img_type3$|text_img_type4$|text_img_type5$/i)){ #オート(おまかせ) # 動画のリンクを作る。動画は単独でなく、スレッド単位で引用、参照される仕様とする(話題を発散させないため) # FlashVarsの区切りが&なので、urlに&を含むものを入れるとおかしくなる。ここだけは、URLエスケープしておこう $HTML5_PARAM{'thread_link'} ="http://"."$ENV{'SERVER_NAME'}"."$ENV{'SCRIPT_NAME'}"."?twi=b"."$tmp_unq_id"."p"."$tmp_seq_no"."p"."$disp_page"."drfx"; $HTML5_PARAM{'thread_link'} =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $HTML5_PARAM{'img_box_base_url'} ="$MYCGI_ENV{'img_box_base_url'}"; $HTML5_PARAM{'img_box_base_url'} =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $HTML5_PARAM{'token_time'} = substr(time,-7,2); #27.7時間単位 if($MYCGI_ENV{'flash_object_tag_support'} eq 'true'){ if($tmp_img_location=~ /\.flv$|\.f4v$|\.f4a$|\.f4b$|\.mp4$|\.mp3$|\.mov$/i){ $data_type=qq|
    |; } # imodeとHTML5で共通する書き方をしたいが。objectタグにすると、マイムの宣言エラーに厳しくなるのでやめた。 # http://www.html5.jp/html5doctor/the-video-element.html }elsif($HTTP_USER_AGENT=~ /^docomo/i){ # http://www.nttdocomo.co.jp/service/imode/make/content/imotion/mp4/distribution/index.html # $HTML5_PARAM{'object_tag_type'}=&make_html5_mimetype('video',"$tmp_img_location"); if($tmp_img_location=~ /\.mp4$|\.3gp$/i){ $data_type=qq| iモーション
    |; } }else{ # HTML5 for iPhone/iPod/iPad if($tmp_img_location=~ /\.mp4$|\.m4v$|\.mov$|\.3gp?p$|\.3g2$/i){ # videoタグ記述 # http://dev.opera.com/articles/view/introduction-html5-video/ $data_type=qq|
    |; } } } #危険度の高いデータの場合は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_imgtitle = $tmp_img_location if $tmp_imgtitle eq ''; $tmp_imgtitle =~ s/^(.*)\///; # パスを消去して名前のみにする } undef $ddd; #デバッグ用パラメータ undef %KIJI_LAYLOUT; #記事最適化用のレイアウト(回り込みレイアウト判断用) # 画像のサイズ変更 if(($tmp_img_location!~ /\.dat$/)&&($tmp_img_location=~ /\.gif$|\.jpe?g$|\.png$|\.bmp$/i)){ $KIJI_LAYLOUT{'exist_image'}=1; &check_img; # imgboard FLV Player 対策(ここで引っ掛けてリサイズする) }elsif($tmp_img_location=~ /\.flv$|\.f4v$|\.f4a$|\.f4b$|\.mp4$|\.3gp$|\.mp3$/i){ &check_flash_and_iframe_img('flash'); }else{ # 埋め込みFlash動画のサイズ変更 if($tmp_body=~ /"; $mail_a_end =""; }else{ $mail_a_start =""; $mail_a_end =""; } # HTMLブロックの初期化 undef $html_block_A; undef $size_sitei; undef $disp_seq_no; # 携帯からの投稿の場合、種類を表示する undef $keitai_env_link; if($OPTDATA{'optKeitaiFlag'} ne ""){ # 2003.12 SoftBank対策 # if($OPTDATA{'optKeitaiMachineType'}=~ /v/i){ if($OPTDATA{'optKeitaiFlag'}=~ /J\-PHONE|SoftBank/i){ $OPTDATA{'optKeitaiFlag'}="SoftBank"; } # } $keitai_env_link=qq|$OPTDATA{'optKeitaiFlag'}:$OPTDATA{'optKeitaiMachineType'}|; } if($tmp_seq_no ne ""){ $disp_seq_no="No\."."$tmp_seq_no"; } # html_block_Aに代入する要素を呼び出し(変更は初期設定でおこなう) &set_html_block; # 外部ファイル用の処理をロード # アイコン付き掲示板等に対応 if($EXTSUB{'kiji'} == 1){ &ext_config_kiji; } # 2004.07 ダイジェストモードを追加 if($digest_flag==1){ $tmp_digest_limit=300; # 初期設定で設定した制限より長い場合 if(length($tmp_body) >$tmp_digest_limit){ # 先頭から指定バイトまでのみ残す $tmp_body =substr("$tmp_body",0,"$tmp_digest_limit"); $tmp_body .=" .... "; if($child_kiji_flag != '1' ){ # 親の場合 $tmp_body .="
    (このスレッドの全文を表\示)"; } } } # 2004.07 ダイジェストモードを追加 if($FORM{'bbsaction'} eq "webslice"){ $tmp_digest_limit=50; # 初期設定で設定した制限より長い場合 if(length($tmp_body) >$tmp_digest_limit){ # 先頭から指定バイトまでのみ残す $tmp_body =substr("$tmp_body",0,"$tmp_digest_limit"); $tmp_body .=" .... "; if($child_kiji_flag != '1' ){ # 親の場合 $tmp_body .="
    (スレッド全文表\示)"; } } } # 2008.08 レイアウト適正化 if($child_kiji_flag != 1){ # 親記事にyoutubeタグ等が含まれる場合 (2008.08修正) if(($tmp_body=~ /"; if(($FORM{'mode'} eq "search_menu")&&($FORM{'SearchWords'} ne "$tmp_blood_name")){ print"
    \n"; #2004.05 検索時に親子関係が紛らわしいのでセパレータを追加 print"
    |\n"; } # 2006.10.29 youTube対応 # 子記事に画像、あるいはyoutubeタグが含まれる場合 (2008.08修正) if($oya_kiji_embed_flag == 1){ if(($child_kiji_embed_flag == 1)||($KIJI_LAYLOUT{'exist_image'} == 1)){ print"
    \n"; }else{ # print"
    \n"; } }else{ if($child_kiji_embed_flag == 1){ print"
    \n"; }else{ print"\n"; } } # 2010.03 レイアウト改良(親の画像大きい場合は回り込む) # 親がデカイ場合は回り込み解除 if($oya_kiji_img_width > 800){ if($KIJI_LAYLOUT{'out_img_width'} > 100){ # &error("oya over 800 $oya_kiji_img_width"); print"
    \n"; } }elsif($oya_kiji_img_width > 500){ # 親+子がデカイ場合は回り込み解除 if($KIJI_LAYLOUT{'out_img_width'} > 300){ print"
    \n"; } } print"\n"; print"
    >>\n"; }else{ # 親の場合 # 幅を指定する $tmp_td_width=""; # TODO子記事の上位3つ以下に埋込み画像がなければ、親記事はbr_clearしないで、コメントを回り込ませたい $br_auto_clear=""; $oya_kiji_img_width="$KIJI_LAYLOUT{'out_img_width'}"; # グローバルで記憶 $oya_kiji_img_height="$KIJI_LAYLOUT{'out_img_height'}";# グローバルで記憶 if(($disp_mode eq "text_only")||($disp_mode eq "img_icon")||($disp_mode eq "img_text_link")){ $tmp_td_width=qq|WIDTH="7%"|; } if(($PM{'use_rep'} == 1)&&($FORM{'bbsaction'} ne 'disp_rep_form')&&($FORM{'amode'} ne 'select_edit')&&($FORM{'amode'} ne 'show_ip')){ $disp_re=qq|返信|; if($PM{'use_twitter_link'} == 1){ # 日本語は不可(UTF-8はPerl本体にモジュール追加が前提になり環境依存するため) $disp_twia="IMAGE #imgboard "."$PM{'twitter_hash01'}"."$PM{'twitter_mes01'}"." http://"."$ENV{'SERVER_NAME'}"."$ENV{'SCRIPT_NAME'}"."?twi=b"."$tmp_unq_id"."p"."$tmp_seq_no"."p"."$disp_page"."drfx"; $disp_twia =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $disp_re="$disp_re "."(t)"; } } print"
    \n"; # 2010.06 add iPhone/iPadでレイアウトが乱れる事があるのでさらに回り込み解除を重ねる if($HTTP_USER_AGENT=~ /ipod|iphone|ipad/i){ print"
    \n"; } print"
    \n"; } $disp_re="" if($old_kiji_flag == '1');# 旧形式なら返信リンクを出さない if($FORM{'bbsaction'} ne 'disp_rep_form'){ # print"\n"; # R6 new # 旧連番 S 新固有IDを送る(Sはセパレータ) $mes_rmid="rmid"."$tmp_rm_number"."S"."$tmp_unq_id"; $disp_rm_cbox=qq|\n|; print "$disp_rm_cbox"; if($new_kiji_flag ==1){ print "(new)"; } } print" \n"; # 子記事 if($child_kiji_flag == '1' ){ # 返信記事(書換えは初期設定の所で行う) &kiji_rep_html; print"
    \n"; # 親記事 }else{ 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"; if($FORM{'amode'} eq "remove_webparts"){ &kiji_base_icon_html; }else{ &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; } } # 返信に入るためのリンク if($FORM{'amode'} eq "select_edit"){ print<[\↑上記の記事を修\正\] HTML_END } } }# forループの終了 # 返信のときの参考記事用のHTML下部 if($FORM{'bbsaction'} eq 'disp_rep_form'){ print<
    [返信しないで戻る] HTML_END exit; } if($FORM{'bbsaction'} eq 'webslice'){ print"aa\n"; return; } # フッターを表示 # 下部にバナー広告を義務付けられている場合は、設定部の$html_for_bottom_bannerにHTMLソースを書いてください $dd_guest_passwd="$guest_passwd"; print<
    $html_for_bottom_banner 削除方法
    ◆管理人: 削除対象の左欄をチェック(複数指定可)、専用パスワードを下欄に入力し、「削除」を押す
    HTML_END if($use_guest_passwd =='1'){ print< HTML_END }elsif($use_guest_passwd =='-1'){ $dd_guest_passwd="$COOKIE{'rmkey'}"; if($COOKIE{'rmkey'} ne ""){ print<(キーを記憶している場合は自動入力されます)
    HTML_END }else{ print< HTML_END } } print<



    HTML_END &output_button_HTML; # 改造,非改造を問わず,クレジットの変更は固くお断りします。(著作権侵害となります) # なお,当スクリプトの一部,あるいは全部を利用,あるいは参考にしたスクリプトを作成された場合も, # かならず当リンクをその掲示板に付加してください。 print "
    \n"; print "
    "; print "FREE imgboard v1.22 R6.1q for youTube/iPhone/iPad <\/A>!!<\/B>
    \n"; print "<\/DIV>
    \n"; } if($FORM{'bbsaction'} ne 'webslice'){ print "
    \n"; # マルチタッチ非対応の拡大ボタン対策(XPERIA) 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$|\.png$|\.bmp$/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$|\.png$|\.bmp$/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(省略可) # レイアウトを揃えることができる。 if($COOKIE{'viewport_set'}=~ /(\d{3,5})/){ if($1 > 2400){ #2560dot &imgsize("$check_img_location",'static_width','1800','2400'); }elsif($1 >= 1920){ # 1920(FullHD) &imgsize("$check_img_location",'static_width','1440','1920'); }elsif($1 >= 1600){ # 1600,1680等 横長PC &imgsize("$check_img_location",'static_width','960','1280'); }elsif($1 >= 1366){ # 1366,1368,1440 横長 AV Note等 &imgsize("$check_img_location",'static_width','960','1280'); }elsif($1 >= 1280){ # 1280 横長Note等 &imgsize("$check_img_location",'static_width','960','1280'); }elsif($1 > 1024){ # 1152等(TVが多い) &imgsize("$check_img_location",'static_width','792','1056'); }elsif($1 == 1024){ # XGA &imgsize("$check_img_location",'static_width','672','896'); }elsif($1 >= 960){ # XGA相当NoteやNetBook タブレット &imgsize("$check_img_location",'static_width','672','896'); }elsif($1 >= 800){ # ゲーム機、MIDデバイス &imgsize("$check_img_location",'static_width','384','512'); }else{ &imgsize("$check_img_location",'static_width','384','512'); } }else{ &imgsize("$check_img_location",'static_width','440','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画面でジャスト表示になる if($COOKIE{'viewport_set'}=~ /(\d{3,5})/){ if($1 > 2400){ #2560dot &imgsize("$check_img_location",'static_height','980','1800'); }elsif($1 >= 1920){ # 1920(FullHD) &imgsize("$check_img_location",'static_height','900','1600'); }elsif($1 >= 1600){ # 1600,1680等 横長PC &imgsize("$check_img_location",'static_height','810','1400'); }elsif($1 >= 1366){ # 1366,1368,1440 横長 AV Note等 &imgsize("$check_img_location",'static_height','680','1000'); }elsif($1 >= 1280){ # 1280 横長Note等 &imgsize("$check_img_location",'static_height','680','1000'); }elsif($1 > 1024){ # 1152等(TVが多い) &imgsize("$check_img_location",'static_height','680','1000'); }elsif($1 == 1024){ # XGA &imgsize("$check_img_location",'static_height','680','1000'); }elsif($1 >= 960){ # XGA相当NoteやNetBook タブレット &imgsize("$check_img_location",'static_height','680','1000'); }elsif($1 >= 800){ # ゲーム機、MIDデバイス &imgsize("$check_img_location",'static_height','480','780'); }else{ &imgsize("$check_img_location",'static_height','360','600'); } }else{ &imgsize("$check_img_location",'static_height','680','1000'); } }elsif($disp_mode eq 'img_auto'){ # インテリジェントオートリサイズ。引数3は面積系のパラメータ(省略可) if($COOKIE{'viewport_set'}=~ /(\d{3,5})/){ if($1 > 2400){ #2560dot &imgsize("$check_img_location",'auto_resize','600000000'); }elsif($1 >= 1920){ # 1920(FullHD) &imgsize("$check_img_location",'auto_resize','240000000'); }elsif($1 >= 1600){ # 1600,1680等 横長PC &imgsize("$check_img_location",'auto_resize','96000000'); }elsif($1 >= 1366){ # 1366,1368,1440 横長 AV Note等 &imgsize("$check_img_location",'auto_resize','16000000'); }elsif($1 >= 1280){ # 1280 横長Note等 &imgsize("$check_img_location",'auto_resize','8000000'); }elsif($1 > 1024){ # 1152等(TVが多い) &imgsize("$check_img_location",'auto_resize','2400000'); }elsif($1 == 1024){ # XGA &imgsize("$check_img_location",'auto_resize','1600000'); }elsif($1 >= 960){ # XGA相当NoteやNetBook タブレット &imgsize("$check_img_location",'auto_resize','1600000'); }elsif($1 >= 800){ # ゲーム機、MIDデバイス &imgsize("$check_img_location",'auto_resize','1600000'); }else{ &imgsize("$check_img_location",'auto_resize','1600000'); } }else{ &imgsize("$check_img_location",'auto_resize','1600000'); } }elsif($disp_mode eq 'img_limit_max'){ # 極端に大きな画像のみ縮小。引数3は縦制限サイズ、引数4は横制限サイズ(省略可) if($COOKIE{'viewport_set'}=~ /(\d{3,5})/){ if($1 > 2400){ #2560dot &imgsize("$check_img_location",'limit_by_max_size','960','1800'); }elsif($1 >= 1920){ # 1920(FullHD) &imgsize("$check_img_location",'limit_by_max_size','960','1600'); }elsif($1 >= 1600){ # 1600,1680等 横長PC &imgsize("$check_img_location",'limit_by_max_size','640','1200'); }elsif($1 >= 1366){ # 1366,1368,1440 横長 AV Note等 &imgsize("$check_img_location",'limit_by_max_size','640','900'); }elsif($1 >= 1280){ # 1280 横長Note等 &imgsize("$check_img_location",'limit_by_max_size','640','900'); }elsif($1 > 1024){ # 1152等(TVが多い) &imgsize("$check_img_location",'limit_by_max_size','560','720'); }elsif($1 == 1024){ # XGA &imgsize("$check_img_location",'limit_by_max_size','480','480'); }elsif($1 >= 960){ # XGA相当NoteやNetBook タブレット &imgsize("$check_img_location",'limit_by_max_size','480','480'); }elsif($1 >= 800){ # ゲーム機、MIDデバイス &imgsize("$check_img_location",'limit_by_max_size','480','480'); }else{ &imgsize("$check_img_location",'limit_by_max_size','480','480'); } }else{ &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; } } # 2010.03 add レイアウト改良 if($w_set=~ /(\d+)/){ $KIJI_LAYLOUT{'out_img_width'}= $1; } if($h_set=~ /(\d+)/){ $KIJI_LAYLOUT{'out_img_height'}= $1; } #&error("$KIJI_LAYLOUT{'out_img_width'}-$KIJI_LAYLOUT{'out_img_height'} "); } # #==============================================# # Flashビデオやiframeの表示サイズ変更処理部 #==============================================# # view_modeに従い、表示サイズの変更を実際に行うルーチン sub check_flash_and_iframe_img{ undef $orig_width; undef $orig_height; undef $w_set; undef $h_set; if((($COOKIE{'view_mode'} eq "")&&($show_img_on_board == 1))||($COOKIE{'view_mode'}=~ /as_cgi_defined$|text_img_type12$|text_img_type13$|text_img_type2$|text_img_type3$|text_img_type4$|text_img_type5$/i)){ #オート(おまかせ) if($COOKIE{'viewport_set'}=~ /(\d{3,5})/){ if($1 > 2400){ #2560dot &change_flash_and_iframe_embed_size('1920','1080'); }elsif($1 >= 1920){ # 1920(FullHD) &change_flash_and_iframe_embed_size('1280','720'); }elsif($1 >= 1600){ # 1600,1680等 横長PC &change_flash_and_iframe_embed_size('854','480'); }elsif($1 >= 1366){ # 1366,1368,1440 横長 AV Note等 &change_flash_and_iframe_embed_size('854','480'); }elsif($1 >= 1280){ # 1280 横長Note等 &change_flash_and_iframe_embed_size('854','480'); }elsif($1 > 1024){ # 1152等(TVが多い) &change_flash_and_iframe_embed_size('640','360'); }elsif($1 == 1024){ # XGA &change_flash_and_iframe_embed_size('640','360'); }elsif($1 >= 960){ # XGA相当NoteやNetBook タブレット &change_flash_and_iframe_embed_size('640','360'); }elsif($1 >= 800){ # ゲーム機、MIDデバイス &change_flash_and_iframe_embed_size('480','270'); }else{ &change_flash_and_iframe_embed_size('640','360'); } }else{ &change_flash_and_iframe_embed_size('640','360'); } } $orig_width = "640"; $orig_height = "385"; $w_set= "width=$tmp_cfds_width" if($tmp_cfds_width!=0); $h_set= "height=$tmp_cfds_height" if($tmp_cfds_height!=0); # 2010.03 add レイアウト改良 if($w_set=~ /(\d+)/){ $KIJI_LAYLOUT{'out_img_width'}= $1; } if($h_set=~ /(\d+)/){ $KIJI_LAYLOUT{'out_img_height'}= $1; } #&error("$KIJI_LAYLOUT{'out_img_width'}-$KIJI_LAYLOUT{'out_img_height'} "); } # #==================================# # Flashビデオの埋込みサイズの変更 #==================================# # youtube,dailymotion,imgboard FLV playerに有効 # ストリートビューにも有効 # sub change_flash_and_iframe_embed_size{ $tmp_cfds_width = $_[0];# 引数 2 指定横サイズ $tmp_cfds_height = $_[1];# 引数 3 指定縦サイズ if($COOKIE{'view_mode'}=~ /as_cgi_defined|text_img_type13/i){ #サムネイル-大小Mix if($child_kiji_flag == '1' ){ # 子の場合 return(0); } } # objectタグによる埋込みの場合 if($tmp_body=~ / 0){ $yoko_sub_setumei=" をほぼ "; } print<
    表\示モード (クッキーに記憶されます)
    $POSTADDP{'DISPMODE'}

    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'; } if($COOKIE{'viewport_set'} eq "as_cgi_defined"){ $selected_01='selected'; }elsif($COOKIE{'viewport_set'} =~ /(\d{3,4})/i){ $selected_vps{$1}='selected'; }elsif($COOKIE{'viewport_set'} =~ /device\-width/i){ $selected_vps{'device-width'}='selected'; }elsif($COOKIE{'viewport_set'} =~ /no/i){ $selected_vps{'no'}='selected'; }elsif($COOKIE{'viewport_set'} =~ /auto/i){ $selected_vps{'auto'}='selected'; }else{ $selected_01='selected'; } } # #=====================================================# # その他のサブルーチン #=====================================================# # #=========================# # フォームのチェック #=========================# sub form_check{ local($crypt_RH)=$REMOTE_HOST; 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/ActiveXObject/ Sorry..You can not use ActiveXObject in comment./ig;# ActiveXObject 除去 $FORM{$form} =~ s/document\.cookie/ Sorry..You can not use cookie in comment./ig; # 不正クッキー参照 除去 $FORM{$form} =~ s/<(\/?)BGSOUND(.|\n)*>(\s*)(\n?)/ Sorry..You can not use BGSOUND tag in comment./ig; # BGSOUND 除去 $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/<(\/?)applet(.|\n)*>(\s*)(\n?)/ Sorry..You can not use JAVA in comment./ig; # APPLET 除去 $FORM{$form} =~ s/(\s*)(\n?)//ig;#METAタグ飛ばし禁止 # youTubeの埋め込みで対応 # embed とか、objectタグは危険なので、チェックは厳密にする if(($use_youtube_tag_in_comment == 1)&&($form=~ /body/i)&&($FORM{$form}=~ /application\/x-shockwave-flash/i)){ if(&check_youTube_tag("$FORM{$form}","$yt_check_level")==1){ # チェック免除 }else{ $FORM{$form} =~ s/<(\/?)OBJECT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use OBJECT tag in comment./ig; # OBJECT(ActiveX) 除去 $FORM{$form} =~ s/<(\/?)EMBED(.+)SRC(.|\n)*>(\s*)(\n?)/ Sorry..You can not use EMBED tag in comment./ig; # EMBEDタグ 除去 } # 基本は禁止 }else{ $FORM{$form} =~ s/<(\/?)OBJECT(.|\n)*>(\s*)(\n?)/ Sorry..You can not use OBJECT tag in comment./ig; # OBJECT(ActiveX) 除去 $FORM{$form} =~ s/<(\/?)EMBED(.+)SRC(.|\n)*>(\s*)(\n?)/ Sorry..You can not use EMBED tag in comment./ig; # EMBEDタグ 除去 } #$use_stview_tag_in_comment=1; # 3=日本地域限定;2=日本+米国地域(推奨);1=地域限定なし; #$stview_check_level=1; # Google MAPのStreetview埋め込みで対応 # iframe とかは危険なので、チェックは厳密にする if(($use_stview_tag_in_comment == 1)&&($form=~ /body/i)&&(($FORM{$form}=~ /src\=\"http\:\/\/maps\.google\./i)||($FORM{$form}=~ /src\=\"http\:\/\/www\.google\.co\.jp\/maps/i))){ if(&check_stview_tag("$FORM{$form}","$stview_check_level")==1){ # チェック免除 }else{ $FORM{$form} =~ s/<(\/?)iframe(.|\n)*>(\s*)(\n?)/ Sorry..You can not use IFRAME tag in comment./ig; # IFRAMEタグ 除去 } # 基本は禁止 }else{ $FORM{$form} =~ s/<(\/?)iframe(.|\n)*>(\s*)(\n?)/ Sorry..You can not use IFRAME tag in comment./ig; # IFRAMEタグ 除去 } # ClipLife埋め込みで対応 # scriptは危険なので、チェックは厳密にする if(($use_cliplife_tag_in_comment == 1)&&($form=~ /body/i)&&($FORM{$form}=~ /src\=\"http\:\/\/(.+)\.goo\.ne\.jp\//i)){ if(&check_cliplife_tag("$FORM{$form}","$cliplife_check_level")==1){ # チェック免除 }else{ $FORM{$form} =~ s/<(\/?)script(.|\n)*>(\s*)(\n?)/ Sorry..You can not use SCRIPT tag in comment./ig; # Javascript,VBscript 除去 } # 基本は禁止 }else{ $FORM{$form} =~ s/<(\/?)script(.|\n)*>(\s*)(\n?)/ Sorry..You can not use SCRIPT tag in comment./ig; # Javascript,VBscript 除去 } $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")){ if($FORM{$form} =~ /style(\s*)=(.|\n)*font\-size:(\s*)(\d+)px/){ if($3 > 48){ $FORM{$form} =~ s/style(\s*)=(.|\n)*/ Sorry..You can not use style in tag on comment./ig; # Style指定 禁止 } } if($FORM{$form} =~ /style(\s*)=(.|\n)*script/){ $FORM{$form} =~ s/style(\s*)=(.|\n)*script/ Sorry..You can not use style in tag on comment./ig; # Style指定 禁止 } # visibility悪用等 if($FORM{$form} =~ /style(\s*)=(.|\n)*bility/){ $FORM{$form} =~ s/style(\s*)=(.|\n)*bility/ Sorry..You can not use style in tag on comment./ig; # Style指定 禁止 } $FORM{$form} =~ s/(.|\n)*(onClick|onblur|onchange|onmouse|onError|onload|onfocus|onmoveover|onselect|onsubmit|onunload)(\s*)\=/ (imgboardセキュリティ保護システム)Sorry..You can not use char $2<\/font><\/B> in comment./ig; # onClick等javascriptイベントを除去(クロスサイトスクリプティング対策) #} #危険タグ除去ここまで # IMGタグの埋込みを可否? if($use_img_tag_in_comment !=1){ # $FORM{$form} =~ s/(\s*)(\n?)/Sorry..You can not use IMG tag in comment./gi;#IMGタグ除去 $FORM{$form} =~ s//Sorry..You can not use IMG tag in comment./gi;#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'}"; $rmkey = "$FORM{'rmkey'}"; $imgtitle = "$FORM{'imgtitle'}"; $img_location = "$img_dir/$new_fname" if $new_fname ne ''; #<フォームの有無のチェック> # 基本的にチェックする。ただし、プロファイル登録だけを行う # ユーザの場合は名前やemailをチェックしない。 if($FORM{'bbsaction'} ne 'pf_change'){ &check_form_data_exist; } #<総改行のチェック> 2004.05 # 無意味な連続改行対策で、総行数をチェックする。 if($limit_body_cols_flag ==1){ # &check_max_cols($body,$body_text_max_cols); } $name =' 無名 ' if $name eq ''; $email =' no_email' if $email eq ''; $subject =' 無題 ' if $subject eq ''; $body =' 本文なし ' if $body eq ''; $rmkey ='no_key' if $rmkey eq ''; # 追加項目に未記入の場合のデフォルト値は以下の書き方を参考にしてください # $FORM{'optA'} =' 無題 ' if $FORM{'optA'} eq ''; # 本文にユーザ情報を含める # 暗号化 if($crypt_RH ne ""){ $crypt_RH=&tiny_encode("$crypt_RH"); } $body = "$body"; # いたずら防止 (99/12/01 追加分) $email =~ s/"/"/g; $email =~ s/style(\s*)=(.|\n)*//ig; if($PM{'use_trip_flag'}==1){ # 修正記事選択画面なら偽判定しない if(($FORM{'amode'} eq "select_edit")&&($FORM{'bbsaction'} ne "edit_form")){ # 通常なら偽判定する }else{ $name =~ s/◆/◇偽/g; # 偽物は白◇にする } #2010.02 trip機能(なりすまし防止)をつける if($name=~ /^(.+)\#(.+)$/g){ $name =$1; $trip_plain =$2; $trip_plain =~ s/ //g;# 全角フィルタ $trip_plain =~ s/\s//g; if($trip_plain ne ""){ $trip_plain=substr($trip_plain,1,8); $salt=substr($trip_plain,2,2); $salt =~ s/[^\.-z]/\./go; $salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/; $trip = crypt($trip_plain,$salt); $trip = substr($trip,-5); $trip = '◆'."$trip"; $name="$name"."$trip"; #&error("$name"); } } } undef $p_key; foreach $p_key(keys %FORM){ if($p_key=~ /^opt/){ $FORM{$p_key}=~ s/style(\s*)=(.|\n)*//ig; $FORM{$p_key}=~ s/"/"/g; } } } # #========================# # 暗号化パスワードを作成 #========================# # sub make_pass{ local($plain) = @_;# 引数 local($salt); local($tmp_pass); # 2002.02 UPDATE if($PM{'use_crypt'} != 1){ return($plain); } $salt="$ENV{'PROCESSOR_REVISION'}"."$plain"; if($plain=~ /^ZzZ/){ # 2重暗号化を防ぐ $tmp_pass = "$plain"; }elsif($plain=~ /^(\s*)$/){ $tmp_pass = ""; }else{ $tmp_pass = crypt($plain, $salt); $tmp_pass = "ZzZ"."$tmp_pass"; } return ($tmp_pass); } # sub tiny_encode{ local($plain) = @_;# 引数 return($plain) if($plain=~ /\,/); $plain =~ s/n/\,/ig; $plain =~ tr/a-m/b-n/; $plain =~ tr/A-M/B-N/; # 2002.12 自宅サーバ対応で追加 $plain =~ s/\,/a/ig; $plain =~ s/4/\,/g; $plain =~ tr/0-3/1-4/; $plain =~ s/\,/0/g; $plain ="T-Enc"."$plain"; return($plain); } sub tiny_decode{ local($plain) = @_;# 引数 if($plain=~ /T-Enc(.*)$/){ $plain = $1; $plain =~ s/a/\,/ig; $plain =~ tr/b-n/a-m/; $plain =~ tr/B-N/A-M/; # 2002.12 自宅サーバ対応で追加 $plain =~ s/\,/n/ig; $plain =~ s/0/\,/g; $plain =~ tr/1-4/0-3/; $plain =~ s/\,/4/g; } return($plain); } #===============================# # フォームの入力項目のチェック #===============================# # 2001.03.11 返信に対応 # 2001.09.20 エラーメッセージを設定エリアへ移動 # 2002.06.07 画像を必須にした時に、記事の修正でエラーが出るバグに対処 # sub check_form_data_exist{ # # 予備パラメータを必須にした場合のためのエラー local($tmp_p_key); foreach $p_key(keys %CHECK){ if($CHECK{$p_key} == 1 ){ if($p_key=~ /opt(.+)$/){ $tmp_p_key="opt"."$1"; if($FORM{$tmp_p_key} eq ''){ $error_message .= "$CHECK_E{$p_key}"; } # 添付画像のエラーは、必須設定なのに # 画像がなくて、親の時だけエラーを出す # 修正画面の時は、エラーを出さない(2002.06.07) }elsif($p_key eq "img"){ if(($img_data_exists != '1')&&($FORM{'parent'} eq "")&&($FORM{'prebbsaction'} ne 'edit_form')){ $error_message .= "$CHECK_E{'img'}"; } }else{ if($FORM{$p_key} eq ''){ $error_message .= "$CHECK_E{$p_key}"; } } } } } # #==========================================# # フォームの入力項目の省略可・必須を自動表示 #==========================================# # 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"; } } } } # #============================# # 登録会員パスワードチェック #============================# # 会員パスが一致しないときだけ、エラーを出してアボートする # 2002.03.24 update # 会員パスワードを複数設定できるようにした sub check_entry_passwd{ local($w_pattern); # 会員パスワードチェック if($use_passwd_flag==1){ # 管理者パスでも投稿できるようにした if(&check_passwd("$FORM{'entry_passwd'}","$admin_passwd","0")==1){ return; } if("$FORM{'entry_passwd'}" eq ""){ &error(" 会員パスワードを入力してください.投稿はキャンセルされました.","","1"); } if($member_passwd ne ""){ # 過去ルーチン互換にする push(@MEMBER_PASSWD,$member_passwd); } foreach (@MEMBER_PASSWD){ $w_pattern="$_"; if($w_pattern ne ""){ if(&check_passwd("$FORM{'entry_passwd'}","$w_pattern","0")==1){ return; } } } &error(" 会員パスワードが違います.投稿できませんでした.","","1"); } } # #============================# # パスワード照合 #============================# # 2002.04.01 UPDATE # 引数1,2を照合する。一致なら1,不一致なら2が返る sub check_passwd{ local($cp1_passwd)=$_[0]; # 引数1として取得 local($cp2_passwd)=$_[1]; # 引数2として取得 local($match_level)=$_[2]; # 厳密さ(1なら厳密) local($cpt_cp1_passwd); # 引数1を暗号化したもの local($cpt_cp2_passwd); # 引数2を暗号化したもの $cpt_cp1_passwd=&make_pass($cp1_passwd); $cpt_cp2_passwd=&make_pass($cp2_passwd); # パスワード照合 # 厳密 if($match_level == 1){ if($cp1_passwd eq "$cp2_passwd"){ return 1; }else{ return 2; } } # 普通 if($cp1_passwd eq "$cp2_passwd"){ return 1; }elsif($cp1_passwd eq "$cpt_cp2_passwd"){ return 1; }elsif($cpt_cp1_passwd eq "$cp2_passwd"){ return 1 ; }elsif($cpt_cp1_passwd eq "$cpt_cp2_passwd"){ return 1 ; }else{ return 2; } } # #=======================================# # 掲示板荒し対策2(1.22Rev6 機能強化版) #=======================================# sub protect_from_BBS_cracker{ # # (悪質掲示板荒らし対策です) # # 相手のプロバイダ名により登録を禁止.(悪質掲示板荒らし対策) # 禁止したいユーザのいるプロバイダ名の一部を,で区切って""で囲み、 # @BLACK_LISTに入力.(リストは初期設定のところにあります).マッ # チするとそのユーザは登録できなくなります. # # 禁止単語による制限機能を追加しました。ホスト名を頻繁に変更する # 相手等、高度な「荒し技」を持つ相手からのイタズラが続く場合に、これを # 使ってください。 リストは初期設定のところにあります。 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'); } #外部のブラックリストファイル(禁単語)を読込む if(($use_ext_blacklist ==1)&&($PM{'no_upload_by_black_word'}==1)){ $add_black_word_count=&load_ext_list('blkword.txt','BLACK_WORD'); } #外部のスパムリストファイル(ホスト名)を読込む if($use_ext_spamlist ==1){ $add_spam_count=&load_ext_list('spamlist.cgi','SPAM_HOSTS_IP'); } #外部のスパムリストファイル(禁単語)を読込む if($use_ext_spamlist ==1){ $add_spam_word_count=&load_ext_list('spamword.cgi','SPAM_WORD'); } foreach (@BLACK_LIST){ next if($_ eq ""); # 正規表現を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{'bbsaction'} eq 'post')&&($FORM{'amode'} ne "select_edit")){ # 2006.03 add 掲示板SPAM対策 # 2006.04 修正 if(($limit_bbs_spam_flag==1)&&($FORM{'amode'} eq "")){ if($FORM{'sf'} eq "$spam_keyword"){ # OK }else{ &error(" CGIエラー500.投稿できませんでした. "); } # 2010.02 onetime_tokenによるSPAM対策 if($FORM{'onetime_token'} eq "$uniq_token"){ #&error("同じtoken ttmp_uniq_char $ttmp_uniq_char--$FORM{'onetime_token'} - $uniq_token"); }elsif($FORM{'onetime_token'} eq "$uniq_token_old"){ #&error("一つ前token ttmp_uniq_char $ttmp_uniq_char--$FORM{'onetime_token'} - $uniq_token"); }else{ if($PM{'make_bbs_html_top'}!=1){ #&error("CGIエラー tokenが時間切れになりました。ttmp_uniq_char $ttmp_uniq_char--$FORM{'onetime_token'} - $uniq_token"); &error(" CGIエラー.tokenが時間切れになり、投稿できませんでした.SPAM対策のため投稿は、24時間以内に記入し、投稿してください "); } } } # 2006.03 add 掲示板SPAM対策 # 2006.04 修正 if(($filter_bbs_spam==1)&&($FORM{'amode'} eq "")){ $PM{'no_upload_by_black_word'}=1; push(@BLACK_WORD,"ttp:"); push(@BLACK_WORD,"\@"); push(@BLACK_WORD," ttp "); push(@BLACK_WORD,"\[url=");# 2007.05 追加 # push(@BLACK_WORD," @ "); } # 2007.06 # if($FORM{'body'}=~ /iframe src="http:\/\/([\-a-zA-Z0-9]+)\.nicovideo\.jp\/thumb\?v=([\-a-zA-Z0-9]+)"/i){ # 2008.06 ニコニコの仕様変更に対応 if($FORM{'body'}=~ /iframe.*src="http:\/\/([\-a-zA-Z0-9]+)\.nicovideo\.jp\/thumb\/([\-a-zA-Z0-9]+)"/i){ if($PM{'auto_nicovideo_find'}==1){ &error(" 操作エラー。IFRAMEタグはセキュリティ上問題あるため、本文中に使えません。なお、 ニコニコ動画のリンクはhttp://www.nicovideo.jp/watch/$2 と本文にURLを記載すると、自動的に埋め込み表\示\されます。","","1"); }else{ &error(" 操作エラー。IFRAMEタグはセキュリティ上問題あるため、本文中に使えません。","","1"); } } # 2009.12 if($FORM{'body'}=~ /src\=\"http\:\/\/www\.dailymotion\.com/i){ $PM{'spam_url_link_limit_2'}=0; $PM{'spam_url_link_limit_3'}=0; $PM{'spam_url_link_limit_4'}=0; $PM{'spam_url_link_limit_5'}=1; } # エラーで出る説明で誘導する if(($allow_nicovideo_in_res == 0)&&($FORM{'prebbsaction'} eq "disp_rep_form")){ if($FORM{'body'}=~ /ttp:\/\/([\-a-zA-Z0-9]+)\.nicovideo\.jp\/watch\//i){ &error(" ユーザー操作エラー。現在、返信記事にはニコニコ動画URLの埋め込みはできない設定になっています。
    動画埋め込みは、親記事でおこなってください。 ","","1"); } } if($PM{'no_upload_by_black_word'}==1){ foreach (@BLACK_WORD){ $w_pattern="$_"; $w_pattern=~ s/\s//g; $w_pattern=~ s/ //g; if($w_pattern ne ""){ $blkw_count++; #記事すべての項目をチェックする local(@ALL_ITEM)=('body','name','subject','email','imgtitle','optA'); local($ttt_form)=""; foreach $form(@ALL_ITEM){ $ttt_form = $FORM{"$form"}; $ttt_form =~ s/\s//g; $ttt_form =~ s/ //g; if (index($ttt_form,$w_pattern) >= 0){ $error_mes_type="black_word"; $bad_user_flag=1; last;# 検出したら抜ける } } } } } # 2006.04 SPAM対策 if(($PM{'no_upload_by_spam_word'}==1)&&($bad_user_flag != 1)){ # 2006.06 SPAM対策 URLリンク列挙型SPAM対策 # 2007.05 5,6まで指定できるようにした if($FORM{'body'}=~ /ttp(.*)/is){ if($1=~ /tp:(.*)/is){ if($PM{'spam_url_link_limit_1'}==1){ &error("URLリンクはひとつまでにしてください。"); } if($1=~ /tp:(.*)/is){ if($PM{'spam_url_link_limit_2'}==1){ &error("URLリンクはふたつまでにしてください。"); } if($1=~ /tp:(.*)/is){ if($PM{'spam_url_link_limit_3'}==1){ &error("URLリンクはみっつまでにしてください。"); } if($1=~ /tp:(.*)/is){ if($PM{'spam_url_link_limit_4'}==1){ &error("URLリンクはよっつまでにしてください。"); } } if($1=~ /tp:(.*)/is){ if($PM{'spam_url_link_limit_5'}==1){ &error("URLリンクはいつつまでにしてください。"); } } if($1=~ /tp:(.*)/is){ if($PM{'spam_url_link_limit_6'}==1){ &error("URLリンクはむっつまでにしてください。"); } } } } } } # 2007.05 英語のみの投稿を排除 if($PM{'spam_limit_non_japanese'}==1){ if($img_data_exists == 1){ }else{ if($FORM{'body'} eq ""){ &error(" スパム対策により、空文のみの投稿はできません。 "); }elsif($FORM{'body'}=~ /^[\x00-\x7f]+$/){ &error(" スパム対策により、英語のみの文字投稿はできません。 "); } } } #2007.05 タイトルなどにURLを埋め込むSPAM対策 if($PM{'no_upload_by_spam_word'} == 1){ local(@LINKCHK_ITEM)=('name','subject','email','imgtitle'); foreach $form(@LINKCHK_ITEM){ $ttt_form = $FORM{"$form"}; $ttt_form =~ s/\s//g; $ttt_form =~ s/ //g; if($ttt_form=~ /tp:\/\/(.*)/is){ &error("URLリンクはこの欄($form)には埋め込めません "); } # 2007.06.05 タグ埋め込みSPAM対策を追加 if($ttt_form=~ /<\//g){ &error("タグはこの欄($form)には埋め込めません "); } # XHTML対策 if($ttt_form=~ /\/>/g){ &error("タグはこの欄($form)には埋め込めません "); } # Webエスケープ対策 if($ttt_form=~ /&#\d+/g){ &error("Webエスケープ文字&#XXXはこの欄($form)には埋め込めません "); } } } #2007.05 SPAMによるメールアドレス投稿をブロック if(($PM{'no_upload_by_spam_word'} == 1)&&($PM{'no_upload_by_spam_country_mail'} == 1)){ local(@LINKCHK_ITEM)=('name','subject','email'); foreach $form(@LINKCHK_ITEM){ $ttt_form = $FORM{"$form"}; $ttt_form =~ s/\s//g; $ttt_form =~ s/ //g; if(($ttt_form=~ /\@/g)||($ttt_form=~ /@/g)){ foreach (@SPAM_MAIL_COUNTRY){ $w_pattern="$_"; $w_pattern=~ s/\s//g; $w_pattern=~ s/ //g; if($ttt_form=~ /$w_pattern/ig){ &error("スパムフィルター設定により、このメールアドレスは($form)欄に書き込めません。 "); } } } } } # 2010.02 #2010.02 kisaragi-SPAM対策 if($FORM{'body'} ne ""){ $ttmp2_form_data="$FORM{'body'}"; $ttmp2_form_data=~ s/\s//g; $ttmp2_form_data=~ s/ //g; # 新kisaragi-SPAM対策 # Webエスケープ対策をする if($ttmp2_form_data=~ /&#\d+/g){ &error("SPAM対策により、Webエスケープ文字&#XXXは本文には埋め込めません "); } # 2010.07 if($ttmp2_form_data=~ /&#x/gi){ &error("SPAM対策により、Webエスケープ文字&#xは本文には埋め込めません "); } $ttmp_host_addr=""; $ttmp_host_ip=""; # 2010.09 update SPAM業者ドメインの多様化に対処 if (@URL_HOST_LINKS = $ttmp2_form_data =~ /\/+(.+?[\.com|\.net|\.org|\.info|\.biz|\.uk|\.name|\.in|\.tk|\.be|\.mobi|\.asia|\.jp])\//) { foreach (@URL_HOST_LINKS) { next if($_ eq ""); # ドメインからIPアドレスを得る(API非公開プロバイダを配慮) $ttmp_host_addr = gethostbyname($_); $ttmp_host_ip = join('.', unpack("C*", $ttmp_host_addr)); push(@URL_IP_LINKS, $ttmp_host_ip); # IPアドレスを配列に保存する。 #&error("SPAM = URL_IP_LINKS - @URL_IP_LINKS - URL_HOST_LINKS - @URL_HOST_LINKS"); } } foreach (@URL_IP_LINKS){ next if($_ eq ""); $ttmp_link_url_ip="$_"; foreach (@SPAM_HOSTS_IP){ next if($_ eq ""); # 正規表現をPerlパターンマッチへ変換 $ip_pattern=&change_pattern_match($_); if ($ttmp_link_url_ip =~ /^$ip_pattern/i){ $error_mes_type="black_word"; $bad_user_flag=1; #2008.08.08 temp あとで必ず削除 #&error("SPAM検出 = URL_IP_LINKS - @URL_IP_LINKS - URL_HOST_LINKS - @URL_HOST_LINKS - ttmp_link_url_ip $ttmp_link_url_ip ip_pattern $ip_pattern -"); last;# 検出したら抜ける } } last if($bad_user_flag==1); } } foreach (@SPAM_WORD){ $w_pattern="$_"; $w_pattern=~ s/\s//g; $w_pattern=~ s/ //g; if($w_pattern ne ""){ $blkw_count++; #記事すべての項目をチェックする local(@ALL_ITEM)=('body','name','subject','email','imgtitle','optA'); local($ttt_form)=""; $spam_link_find_flag=0;# URLリンクがあるかどうか(グローバル) foreach $form(@ALL_ITEM){ $spam_link_find_flag=0; # 初期化 $ttt_form = $FORM{"$form"}; $ttt_form =~ s/\s//g; $ttt_form =~ s/ //g; if($ttt_form=~ /tp:/i){ $spam_link_find_flag=1; }elsif($ttt_form=~ /ttp/i){ $spam_link_find_flag=1; }elsif($ttt_form=~ /\@/i){ $spam_link_find_flag=1; # }elsif($ttt_form=~ /@/i){ # $spam_link_find_flag=1; # 2007.05 修正 }elsif($ttt_form=~ /\[url=/i){ $spam_link_find_flag=1; }else{ $spam_link_find_flag=0; next; # URLリンクがない場合はチェックしない } if (index($ttt_form,$w_pattern) >= 0){ $error_mes_type="black_word"; $bad_user_flag=1; #2008.08.08 temp あとで必ず削除 #&error("SPAM = $w_pattern"); last;# 検出したら抜ける } } } } } # 問題点を検出した場合の処理 if($bad_user_flag==1){ # ダミーのエラーメッセージを出す if($error_mes_type eq "black_word"){ # 設定で指定している場合はそれを使う。ないならデフォルト if($PM{'error_message_to_black_word'} ne ""){ $error_mes_bl="$PM{'error_message_to_black_word'}"; } } # 2007.06.05 SPAMワードにより内容が消えてしまう問題に対処 &error("$error_mes_bl $blkw_count","","1"); } } # 投稿時以外(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\"を読込めません.処理は中断されました."); eval "flock(IN,1);" if($PM{'flock'} == 1 ); 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 'SPAM_HOSTS_IP'){ push(@SPAM_HOSTS_IP, $2); }elsif($array_name eq 'SPAM_WORD'){ push(@SPAM_WORD, $2); } $add_count++; } } } eval "flock(IN,8);" if($PM{'flock'} == 1 ); 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=~ /-KSN-/i){ # 数字を隠す。 $other_ip=~ tr/0-4/\?/; # リモートホストが論理ホスト名の場合 }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/\?/; # 会社から掲示板にアクセスしていることがバレるといやな人は多いと # 思われるので、会社の場合は社名を削る。しかし、あんまり削ると # イタズラ予防効果がなくなるので、お尻を2文字だけ削ることにする if($other_ip=~ /^(.*)(\.?)([^\.]+)\.(co)\.(jp)$/){ $company_name="$3"; # $company_name=substr($company_name,1); chop($company_name); 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"; } # 大学は、悪い人?がよくJUMPに使い、悪用されることが多いので、 # 下部はそのまま削らない・・・(^_^) if($other_ip=~ /ac\.jp$/){ $other_ip="$org_other_ip"; } if(($other_ip=~ /ne\.jp$/)||($other_ip=~ /or\.jp$/)){ # プロバイダは、もともと匿名性が高いので、最初の1文字削りと # 数字消しで充分かな・・・ということだったが、 # サードドメインの数字だけ消しておく $other_ip=~ tr/0-9/\?/; } $user_IP="$local_ip"."\."."$other_ip"; } } } #============================# # JUMP用HTML #============================# sub jump_html{ # $gvar_cgi_add_url; # URLに足すべきもの(グローバル変数) local($tmp_cgi_add_url) = $_[0]; # URLに足すべきもの(将来拡張用) local($mes_01); if($SERVER_NAME=~ /tok2\.com/){ $mes_01=qq||; }else{ undef $mes_01; } print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; if(($form_disp_on_board==0)&&($FORM{'bbsaction'} eq 'post')&&($FORM{'prebbsaction'} ne "disp_rep_form")&&($FORM{'prebbsaction'} ne "edit_form")){ # フォーム別ウィンド時のためのメニュー print< Imgboard - Message $mes_01
    Imgboard - Message


      処理中......

      10秒間このままお待ちください.
    EOF }else{ # 引数で指定された場合はそれを使う if($tmp_cgi_add_url ne ""){ $cgi_add_url="$tmp_cgi_add_url"; # グローバル変数で指定された場合はここで拾う }elsif($gvar_cgi_add_url ne ""){ $cgi_add_url="$gvar_cgi_add_url"; # 引数で指定されない場合はケース別にここで対処を分岐 }else{ $cgi_add_url=""; # 返信時にページを記憶する if(($FORM{'bbsaction'} eq "post")&&($FORM{'prebbsaction'} eq "disp_rep_form")){ if($FORM{'page'} ne ""){ $cgi_add_url="\?page=$FORM{'page'}&p1=$FORM{'p1'}&p2=$FORM{'p2'}&amode=$FORM{'amode'}"; } # レスを上に持って行く設定の場合スレッドが先頭へ行くので、先頭へジャンプ if($PM{'res_go_up'} == 1){ $cgi_add_url="\?page=1&p1=$FORM{'p1'}&p2=$FORM{'p2'}&amode=$FORM{'amode'}"; } # 削除時 / ページ変更時 }elsif(($FORM{'bbsaction'} eq "remove")||($FORM{'bbsaction'} eq "pf_change")){ # 2003.06 変更 # 削除、表示モード変更時の飛び先PAGEを計算 if($FORM{'page'}>1){ $tmp_jump_page=$FORM{'page'}; }else{ $tmp_jump_page=1; } $cgi_add_url="\?page=$tmp_jump_page&p1=$FORM{'p1'}&p2=$FORM{'p2'}&amode=$FORM{'amode'}"; # WebParts情報修正時 }elsif(($FORM{'prebbsaction'} eq "edit_form")&&(($FORM{'amode'} ne "post_webparts"))){ $cgi_add_url="\?page=$FORM{'page'}&p1=$FORM{'p1'}&p2=$FORM{'p2'}&amode=$FORM{'amode'}" } } print< wait.. $mes_01
    Imgboard - Message

      処理中......

      3秒間このままお待ちください.
    EOF } } # #================================================# # オリジナルファイル名使用希望者用追加サブルーチン #================================================# # sub use_orig_name{ &error("オリジナルファイル名で保存する機能はimgboardから削除されました。
    同機能は、今後は e_FTPboardでサポートします "); } # #============================# # エラーの出力 #============================# sub error{ local($error_message) = $_[0];# メッセージを引数として取得 local($error_message2) = $_[1];# メッセージを引数として取得 local($js_back_flag) = $_[2];# Javascriptで戻るボタンを出したい場合は1に #for Form window if(($form_disp_on_board ==0)&&($FORM{'bbsaction'} ne 'remove' )){ $error_bbsaction="disp_form_only"; } print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; print< Error Message from Imgboard
    Imgboard - Error Message

      $error_message

      $error_message2

      EOF # 返信の時、修正の時、アイコン登録時に記入ミスがあると戻れないバグに対応 if((($FORM{'bbsaction'} eq 'post')&&(($FORM{'prebbsaction'} eq 'disp_rep_form')||($FORM{'prebbsaction'} eq 'edit_form')))||($FORM{'amode'} eq "icon_admin")||($js_back_flag == 1 )||($FORM{'amode'} eq "post_webparts")){ print< EOF }else{ print< EOF } print< EOF &rm_tmp_uploaded_files; # 一時保存された画像データを削除 exit; } # #===================================# # 一時登録された画像ファイルの削除 #===================================# sub rm_tmp_uploaded_files{ if($img_data_exists==1){ foreach $fname_list(@NEWFNAMES){ if(-e "$img_dir/$fname_list"){ unlink("$img_dir/$fname_list"); # メタファイルも削除する &rm_meta_file("$img_dir/$fname_list"); } # 携帯用ファイルも削除する if($fname_list=~ /\.(jpe?g|gif|png|bmp|mng)$/i){ &rm_snl_file("$unq_id","$img_dir","$existing_snl_type_list"); } } } } # #=============================# # 携帯用ファイルの削除(R7) #=============================# # # 将来の全携帯対応を考えて拡張子は # いろいろできるようにしておく # sub rm_snl_file{ local($tmp_rm_snl_unq_id) =$_[0]; # 引数1はUID local($tmp_rm_snl_dir) =$_[1]; # 引数2はパス local($tmp_rm_snl_exist_type) =$_[2]; # 引数3はSNL存在リスト local($snl_future_bit); # 携帯用ファイル名の将来拡張ビット local($snl_ext); # 携帯用ファイルの実際の拡張子 $tmp_rm_snl_unq_id="snl"."$tmp_rm_snl_unq_id"; @SNL_TYPE=split(/\//,$tmp_rm_snl_exist_type); if($tmp_rm_snl_exist_type ne ""){ foreach $snl_type(@SNL_TYPE){ ($snl_ext,$snl_future_bit,$dummy)=split(/\-/,$snl_type); if(-e "$tmp_rm_snl_dir/$tmp_rm_snl_unq_id$snl_future_bit\.$snl_ext"){ unlink("$tmp_rm_snl_dir/$tmp_rm_snl_unq_id$snl_future_bit\.$snl_ext"); } } } } # #============================# # Webスライスの出力 #============================# sub output_webslice{ local($error_message) = $_[0];# メッセージを引数として取得 local($error_message2) = $_[1];# メッセージを引数として取得 local($js_back_flag) = $_[2];# Javascriptで戻るボタンを出したい場合は1に print "Content-type: application/xml "."charset=Shift_JIS"."\n\n"; print< imgboard 更新情報 WebSlice Feed $cgi_url? imgboard Webslices Feeds $title 60 更新情報($title)

      imgboard Webスライス(β)60 分 自動更新. 板名( $title
      カウンタ情報: $PM{'counter_main_html'}
      EOF &output_html("$file"); # &output_webslice_html("$file"); # &output_html("$file"); print<   [FREE imgboard v1.22 R6.1m for youTube!! ]

      ]]>
      EOF exit; } # #====================================================# # imgtitleから、$IMG_PARAMETERS{name}情報を抜き出す #====================================================# # 引数はコメントアウト付きの$tmp_imgtitle # 返値はコメントアウトなしの$tmp_imgtitleと連想配列 $IMG_PARAMETERS{$name} sub parse_img_param{ local($ttmp_imgtitle)= $_[0]; # 引数として取得 # imgtitleの中にsize,height,width等のパラメータを格納 # 書式 # を除きパラメータ部を抽出 if($ttmp_imgtitle ne ''){ ($ttmp_imgtitle,$img_parameters)=split(/<\!--/,$ttmp_imgtitle); $img_parameters=~ s/-->//g; } # パラメータ$img_parametersが追加されている場合. if($img_parameters ne ''){ foreach ( split(/;/,$img_parameters)){ local($name,$value) = split(/\=/); $IMG_PARAMETERS{$name} = $value; } } return($ttmp_imgtitle); } # #===================================# # ASX メタファイルの削除 #===================================# # Winodows Mediaのストリーム再生やeggy/FOMAのストリーム再生対応のために # 機能拡張した。 削除するファイルがメタファイルを持っていそうな # 名前だったらメタファイルらしきファイルを探し、もしあれば消しておく sub rm_meta_file{ local($tmp_rm_meta_file)=$_[0]; # 引数は削除するファイル名本体(パス付き) # asx等に対応 if($tmp_rm_meta_file=~ /^(.*)\.(asf|wma|wmv?)$/){ if(-e "$1\.asx"){ unlink("$1\.asx");# ASF(古い表記の仕方) } if(-e "$1\.wax"){ unlink("$1\.wax");# ASF&WinMediaAudio(一時的に使われた) } if(-e "$1\.wvx"){ unlink("$1\.wvx");# ASF&WinMediaAudio/Video(現在はこれが推奨らしい) } } } # #=======================# # 投稿ブラウザチェック #=======================# # sub check_post_browser_type{ if($HTTP_USER_AGENT=~ /icab/i){ &error(" エラー このブラウザでは記事の投稿はできません "); } } # #====================# # ブラウザチェック #====================# # sub check_browser_type{ # Apache 1.3.12 以降で発生する、Netscape 4.x文字化け問題対策 if($HTTP_USER_AGENT!~ /compatible/i){ if($HTTP_USER_AGENT=~ /Mozilla\/4\.(\d)/i){ if( $use_sjis_header_for_Netscape4X == 1){ if( $1 >= 5 ){ $Netscape4x_ch_set="; charset=Shift_JIS"; # $Netscape4x_ch_set="; charset=ISO-2022-JP"; } } } } #ipod/iPhone文字化け対策 2008.06.20 update 2009.12.07 if($HTTP_USER_AGENT=~ /ipod|iPhone|safari/i){ $Netscape4x_ch_set="; charset=Shift_JIS"; } } # #=====================# # iモードチェック(R6) #=====================# # 2010.01.23 アンドロイド対応で小修正 # 2001.05.25 (iモード以外もリダイレクトするようにした) sub check_imode{ if($imode_redirect==1){ if(-e "$imode_cgi_name"){ # 2010.01 android新ファーム1.6のUSER_AGENTにdocomoの文字が!!(従来はFullブラウザ系にはDoCoMoの文字はないのが通例だった)。 if($HTTP_USER_AGENT=~ /^docomo/i){ print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &simple_HTML(""," 転送 "," iモードユーザ専用アクセスページ をどうぞご利用ください "); $keitai_flag="imode"; }elsif($HTTP_USER_AGENT=~ /^kddi/i){ print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &simple_HTML(""," 転送 "," au ユーザ専用アクセスページ をどうぞご利用ください "); $keitai_flag="imode"; # 2006.10.20 Update }elsif(($ENV{'HTTP_X_JPHONE_MSNAME'} ne "")||($HTTP_USER_AGENT=~ /Vodafone/i)||($HTTP_USER_AGENT=~ /^SoftBank/i)){ print "Content-type: text/html"."$Netscape4x_ch_set"."\n\n"; &simple_HTML(""," 転送 "," SoftBankユーザ専用アクセスページ をどうぞご利用ください "); $keitai_flag="J-PHONE"; }else{ $keitai_flag="pc"; } } } } sub simple_HTML{ local($tmp_tm) =$_[0]; local($tmp_mes01) =$_[1]; local($tmp_mes02) =$_[2]; local($tmp_exit_f) =$_[3]; print< $tmp_tm $tmp_mes01

      $tmp_mes02

      HTML_END print "$output_simple_block01_HTML\n"; if($tmp_exit_f == 1){ print< [$tmp_tm 終了]
      HTML_END } print< HTML_END undef $output_simple_block01_HTML; # 初期化 exit; } # #====================# # プロバイダチェック #====================# sub check_ISP{ if($SERVER_NAME=~ /bekkoame\./){ &error(" CGI設定エラー。imgboardがサポート外サイトを検出しました。
      「$SERVER_NAME」は、CGIに関して特殊な制約があるため、残念ながらimgboardを利用することができません。他のプロバイダをご利用ください "); } if($SERVER_NAME=~ /prohosting\.com/){ &error(" CGI設定エラー。imgboardが非推奨サイトを検出しました。
      「$SERVER_NAME」は、広告挿入用のJavascriptに特殊な制約があり、残念ながらR6以降のimgboardを利用することができません。freeweb,トクトク等、他の無料プロバイダをご利用ください "); } if(($SERVER_NAME=~ /hi\-ho\.ne\.jp/)||($SERVER_NAME=~ /\.nifty\.com/)||($SERVER_NAME=~ /\.wakwak\.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.99 (R6 NEW) #=====================================# # 2001.09.27 update # セキュリティ上の理由とダイアルアップユーザ減少の # 昨今のネット事情より、PCからのtel自動リンクは廃止。 # telリンクはiアクセスの方だけ実装すれば十分だろう。 # 2007.08 Secondlife対応 # 2008.06 iPod/iPhone対応 # sub set_auto_url_link{ # 引数1は処理したいデータ; # 返値は処理後のデータ; local($tmp_data)=@_; local($tmp_yb_url)=""; local($no_object_to_text_link)=0;# OBJECTをテキストリンクにするかどうか # アンカータグを書くユーザなら自動リンクをオフにする # ない場合のみ処理 $PM{'auto_mail_find'}=1; # 上で1を選択した場合,その埋め込みサイズを選択。 # (0=iconサイズ,1=auto,2=横固定,3=原寸サイズ,5=極端に大きな画像のみ縮小) #$on_board_img_size=5; # デフォルトは5 # 外部サムネイルの埋込サイズ $tmp_snl_url_imgsize=""; # objectタグを使うかどうかと、外部サムネイルのサイズを決めておく if($user_selected_view_mode == 1){ if($COOKIE{'view_mode'} eq '1-text_only'){ $no_object_to_text_link=1; $tmp_snl_url_imgsize=""; }elsif($COOKIE{'view_mode'} eq 'text_img_type1'){ $no_object_to_text_link=1; $tmp_snl_url_imgsize=" height=\"98\" width=\"120\" border=5"; }else{ # 2008.08 PSPの画面サイズを考慮 if($HTTP_USER_AGENT=~ /PSP/i){ $tmp_snl_url_imgsize=" height=\"120\" width=\"160\" border=5"; }else{ $tmp_snl_url_imgsize=" height=\"334\" width=\"415\" border=5"; } } }else{ # 管理者設定 if($show_img_on_board==0){ $no_object_to_text_link=1; }else{ # if(($on_board_img_size==0)||($on_board_img_size==11)||($on_board_img_size==12)||($on_board_img_size==13)){ if($on_board_img_size==0){ # iconサイズ $no_object_to_text_link=1; $tmp_snl_url_imgsize=" height=\"98\" width=\"120\" border=5"; }else{ # 2008.08 PSPの画面サイズを考慮 if($HTTP_USER_AGENT=~ /PSP/i){ $tmp_snl_url_imgsize=" height=\"120\" width=\"160\" border=5"; }else{ $tmp_snl_url_imgsize=" height=\"334\" width=\"415\" border=5"; } } } } if($MYCGI_ENV{'flash_object_tag_support'} ne 'true'){ $no_object_to_text_link=1; } # 余計なものをフィルタ # dailymotionの付録を削除 $tmp_data =~ s/\(.|\n)*(\//ig; # 2008.08 PSPがIFRAMEで固まる現象に対処 if($HTTP_USER_AGENT=~ /PSP/i){ $tmp_data =~ s/<(\/?)iframe(.|\n)*iframe>(\s*)(\n?)/ \[PSPでは表\示できないHTML記述です\]./ig; # IFRAMEタグ 除去 } # フィルタここまで $DAILYMOTION_VIDEO{'id'} =""; local($tmp_dailymotion_snl_url)=""; $USTREAM_VIDEO{'id'} =""; local($tmp_ustream_snl_url)=""; # クラウドサービスのURLを短くする 2009.12 local($tmp_google_ap)=""; if($tmp_data=~ /\"http\:\/\/www\.google\.co\.jp\/(\S*)\?/i){ # iframe埋込とかなので、何もしない }elsif($tmp_data=~ /http\:\/\/www\.google\.co\.jp\/(\S*)\?/i){ $tmp_google_ap="$1"; if($tmp_google_ap=~ /maps/i){ $tmp_data =~ s/(https?\:\/\/www\.google\.co\.jp\/maps)([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/[google地図\]<\/A>/ig; } }elsif($tmp_data=~ /http\:\/\/maps\.google\.co\.jp\/(\S*)\?/i){ $tmp_data =~ s/(https?\:\/\/maps\.google\.co\.jp\/maps)([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/[google地図\]<\/A>/ig; } # youTube/dailymotion/ustream等のアドレスを取得 if($tmp_data=~ /)(\s*)(\n?)/$tmp_yb_url /ig; if(($DAILYMOTION_VIDEO{'id'} ne "")&&($COOKIE{'view_mode'} ne '1-text_only')){ # サムネイル表示(DAILYMOTIONのサムネイル画像のURLは適宜アップデートしてください) $tmp_dailymotion_snl_url="\"; $tmp_data =~ s/(\)/$1 $tmp_dailymotion_snl_url/ig; } # 2010.05 ustream対応(TODO 未完成) if(($USTREAM_VIDEO{'id'} ne "")&&($COOKIE{'view_mode'} ne '1-text_only')){ # サムネイル表示(USTREAMのサムネイル画像のURLは適宜アップデートしてください) # liveはサムネイル推測可能。videoは推測不能 if($USTREAM_VIDEO{'vmode'} eq "live"){ $tmp_ustream_snl_url="\"; $tmp_data =~ s/(\)/$1 $tmp_ustream_snl_url/ig; } } # MP4変換サイトのアドレスへ if($MYCGI_ENV{'flash_object_tag_support'} ne 'true'){ # 2008.05 番組IDに _ が含まれると視聴できなかった点を修正 # 2008.07 記事が表示されなかった点を修正 if($tmp_data=~ /http\:\/\/www\.youtube\.com\/v\//i){ # $tmp_data =~ s/http\:\/\/www\.youtube\.com\/v\/([\-_\.a-zA-Z0-9]+)(\&*)([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#\n]*)/youTube Video for iPod\/iPhone\/PSP\/Android \ http\:\/\/www\.4youtubemp4\.com\/video\/$1\.mp4/ig; # 2010.02.01 youtubemp4不調によりyoutube純正に修正 $tmp_data =~ s/http\:\/\/www\.youtube\.com\/v\/([\-_\.a-zA-Z0-9]+)(\&*)([\-_\a-zA-Z0-9\/\?\&\=\%\n]*)/http\:\/\/m\.youtube\.com\/\?gl\=JP\&hl\=ja\#\/watch\?v\=$1\&client\=mv\-google
      /ig; }else{ return($tmp_data); } } # objectタグで埋め込む場合 }else{ # youTubeでidがある場合 if($YOUTUBE_VIDEO{'id'} ne ""){ $YOUTUBE_VIDEO{'mp4_dl_url'} ="http\:\/\/www\.youtubemp4\.com\/video\/$YOUTUBE_VIDEO{'id'}\.mp4"; # $tmp_data ="[
      MP4 for iPod/iPhone/Android/PSP]"."$tmp_data"; } } # return($tmp_data); } if($PM{'auto_nicovideo_find'}==1){ if($tmp_data!~ /iframe対応ブラウザでご覧下さい。<\/iframe>

      /; $tmp_data =~ tr/\x01//d; } } } $CLIPLIFE_VIDEO{'id'} =""; # ClipLife埋め込み(idを取得) if($tmp_data=~ /http\:\/\/cliplife\.goo\.ne\.jp\/embed\/([a-zA-Z0-9]+)(.|\n)*/ig){ if($1 ne ""){ $CLIPLIFE_VIDEO{'id'} ="$1"; } }elsif($tmp_data=~ /http\:\/\/cliplife\.goo\.ne\.jp\/play\/clip\/([a-zA-Z0-9]+)(.|\n)*/ig){ if($1 ne ""){ $CLIPLIFE_VIDEO{'id'} ="$1"; } } # ClipLife対応 # 通常はそのままスクリプトタグでスルーで出す if($CLIPLIFE_VIDEO{'id'} ne ""){ if(($COOKIE{'view_mode'} eq '1-text_only')||($COOKIE{'view_mode'} eq 'text_img_type20')){ $tmp_data =~ s/\