#!/usr/bin/perl #┌───────────────────────────────── #│ JOYFUL NOTE v1.95 (2005/11/20) #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #│ #│ Modified by isso. Sep, 2006 #│ http://swanbay-web.hp.infoseek.co.jp/index.html #└───────────────────────────────── $ver = 'JoyfulNote v1.95 Rev1.94'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 改変版CGI設置に関するご質問は設置URLを明記のうえ、下記までお願いします。 #│ http://swanbay-web.hp.infoseek.co.jp/index.html #│ お問い合わせ前に、「このサイトについて」 #│ http://swanbay-web.hp.infoseek.co.jp/about.html #│ 「よくあるご質問」 #│ http://swanbay-web.hp.infoseek.co.jp/faq.html #│ 「お問い合わせに関する注意事項」 #│ http://swanbay-web.hp.infoseek.co.jp/mail.html #│ に必ず目を通してください。 #│ #│ 最新のNGワードデータファイルは下記よりダウンロードしてください。 #│ http://swanbay-web.hp.infoseek.co.jp/spamdata.html #│ #│ アクセス制限IPアドレスファイル下記よりダウンロードしてください。 #│ http://swanbay-web.hp.infoseek.co.jp/accessdeny.html #│ #│ 掲示板へのリンク方法をJavascript表示する方法は下記を参照下さい。 #│ http://swanbay-web.hp.infoseek.co.jp/cgi-bin/javascript.html #│ #│ 自動アクセス制限の利用方法は下記サイトを参照下さい。 #│ http://swanbay-web.hp.infoseek.co.jp/accesstrap/index.html #│__________________________________ #│本改造スクリプトに関してはKENT氏に問い合わせしないようお願いします。 #│ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ #│ 3. このスクリプトは、method=POST 専用です。 #│ 4. 同梱のアイコンで、以下のファイルの著作権者は以下のとおりです。 #│ home.gif : mayuRinさん #│ clip.gif : 牛飼いとアイコンの部屋さん #└───────────────────────────────── # # 【ファイル構成例】 # # public_html (ホームディレクトリ) # | # +-- joyful / joyful.cgi [705] # | joyfullog.cgi [606] # | count.dat [606] # | jcode.pl [604] # | cgi-lib.pl [604] # | pastno.dat [606] # | spamdata.cgi [606] # | mimew.pl [604]...WebMail用 # | keitai.pl [604]...携帯用 # | imagemagick.pl [604]...サムネイル画像用 # | # +-- img [707] / home.gif, bear.gif, ... # | # +-- lock [707] / # | # +-- past [707] / 1.dat [606] ... # | # +-- mailchk [707] /...WebMail用 #------------------------------------------------- # 設定項目 #------------------------------------------------- # ライブラリ取込 require './jcode.pl'; require './cgi-lib.pl'; require './mimew.pl'; # MIMEエンコード # タイトル名 $title = "フィリピーナ体験談集 "; # タイトルの文字色 $t_color = "#804040"; # タイトルの文字サイズ $t_size = '26px'; # 本文の文字フォント $face = '"MS UI Gothic", "MS Pゴシック", Osaka'; # 本文の文字サイズ $b_size = '13px'; # 壁紙を指定する場合(http://から指定) $bg = "joyfulmiwaku-kabe.jpg"; # 背景色を指定 $bc = "#000000"; # 文字色を指定 $tx = "#000000"; # リンク色を指定 $lk = "#0000FF"; # 未訪問 $vl = "#800080"; # 訪問済 $al = "#FF0000"; # 訪問中 # 戻り先のURL (index.htmlなど) $homepage = "http://www.miwakubiz.com/index775.htm"; # 最大記事数 (親記事+レス記事も含めた数) $max = 40; # 返信がつくと親記事をトップへ移動 (0=no 1=yes) $topsort = 1; # 返信にも添付機能を許可する (0=no 1=yes) $res_clip = 1; # 画像と記事の位置 # 1 : 画像が左。記事は右から回り込む # 2 : 画像が下。記事は画像の上に表示。 $imgpoint = 2; # タイトルにGIF画像を使用する時 (http://から記述) $t_img = "taiken.gif"; $t_w = 570; # GIF画像の幅 (ピクセル) $t_h = 106; # 〃 高さ (ピクセル) # ファイルロック形式 # → 0=no 1=symlink関数 2=mkdir関数 $lockkey = 0; # ロックファイル名 $lockfile = './lock/joyful.lock'; # ミニカウンタの設置 # → 0=no 1=テキスト 2=GIF画像 $counter = 0; # ミニカウンタの桁数 $mini_fig = 6; # テキストのとき:ミニカウンタの色 $cnt_color = "#BB0000"; # GIFカウンタのとき:画像までのディレクトリ # → 最後は必ず / で閉じる $gif_path = './img/'; $mini_w = 8; # 画像の横サイズ $mini_h = 12; # 画像の縦サイズ # カウンタファイル $cntfile = './count.dat'; # スクリプトのURL $script = './joyful.cgi'; # ログファイルを指定 # → フルパスで指定する場合は / から記述 $logfile = './joyfullog.cgi'; # アップロードディレクトリ # → パスの最後は / で終わること # → フルパスだと / から記述する $imgdir = './img/'; # アップロードディレクトリのURLパス # → パスの最後は / で終わること $imgurl = 'http://www.miwakuyomi.com/taiken-keijiban/joyful-taiken/img/'; # 添付ファイルのアップロードに失敗したとき # 0 : 添付ファイルは無視し、記事は受理する # 1 : エラー表示して処理を中断する $clip_err = 0; # 記事 [タイトル] 部の長さ (全角文字換算) $sub_len = 15; # メールアドレスの入力必須 (0=no 1=yes) $in_email = 0; # 記事の [タイトル] 部の色 $sub_color = "#880000"; # 記事表示部の下地の色 $tbl_color = "#FFFFFF"; # 同一IPアドレスからの連続投稿時間(秒数) # → 連続投稿などの荒らし対策 # → 値を 0 にするとこの機能は無効になります $wait = 100; # 1ページ当たりの記事表示数 (親記事) $p_log = 5; # 投稿があるとメール通知する (sendmail必須) # 0 : 通知しない # 1 : 通知するが、自分の投稿記事はメールしない。 # 2 : 通知する。自分の投稿記事も通知する。 $mailing = 1; # メールアドレス(メール通知する時) $mailto = 'fwjb3300@mb.infoweb.ne.jp'; # sendmailパス(メール通知する時) $sendmail = '/usr/sbin/sendmail'; # 他サイトから投稿排除時に指定 (http://から書く) $base_url = ""; # 文字色の設定(半角スペースで区切る) $colors = '#800000 #DF0000 #008040 #0000FF #C100C1 #FF80C0 #FF8040 #000080'; # URLの自動リンク (0=no 1=yes) $autolink = 1; # タグ広告挿入オプション # → の代わりに「広告タグ」を挿入する。 # → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。 $banner1 = ''; # 掲示板上部に挿入 $banner2 = ''; # 掲示板下部に挿入 # ホスト取得方法 # 0 : gethostbyaddr関数を使わない # 1 : gethostbyaddr関数を使う $gethostbyaddr = 0; # アクセス制限(半角スペースで区切る、アスタリスク可) # → 拒否ホスト名を記述(後方一致)【例】*.anonymizer.com $deny_host = ''; # → 拒否IPアドレスを記述(前方一致)【例】210.12.345.* $deny_addr = ''; # アップロードを許可するファイル形式 # 0:no 1:yes $jpg = 1; # jpgファイル $gif = 1; # GIFファイル $jpeg = 1; # JPEGファイル $png = 1; # PNGファイル $text = 1; # TEXTファイル $lha = 0; # LHAファイル $zip = 0; # ZIPファイル $pdf = 1; # PDFファイル $midi = 1; # MIDIファイル $word = 1; # WORDファイル $excel = 1; # EXCELファイル $ppt = 0; # POWERPOINTファイル $ram = 1; # RAMファイル $rm = 0; # RMファイル $mpeg = 1; # MPEGファイル $mp3 = 1; # MP3ファイル # 投稿受理最大サイズ (bytes) # → 例 : 102400 = 100KB $cgi_lib'maxdata = 1024000; # 1回当りの最大投稿サイズ (bytes) $maxData = $cgi_lib'maxdata; # 画像ファイルの最大表示の大きさ(単位:ピクセル) # → これを超える画像は縮小表示します $MaxW = 240; # 横幅 $MaxH = 320; # 縦幅 # 家アイコンの使用 (0=no 1=yes) $home_icon = 1; # アイコン画像ファイル名 (ファイル名のみ) $IconHome = "home.gif"; # ホーム $IconClip = "clip.gif"; # クリップ $IconSoon = "soon.gif"; # COMINIG SOON # 画像管理者チェック機能 (0=no 1=yes) # → アップロード「画像」は管理者がチェックしないと表示されない機能です # → チェックされるまで「画像」は「COMMING SOON」のアイコンが表示されます $ImageCheck = 0; # 投稿後の処理 # → 掲示板自身のURLを記述しておくと、投稿後リロードします # → ブラウザを再読み込みしても二重投稿されない措置。 # → Locationヘッダの使用可能なサーバのみ $location = ''; # 禁止ワード # → コンマで区切って複数指定する(例)$deny_word = 'アダルト,出会い,カップル'; $deny_word = 'http'; #---(以下は「過去ログ」機能を使用する場合の設定です)---# # # 過去ログ生成 (0=no 1=yes) $pastkey = 1; # 過去ログ用NOファイル $nofile = './pastno.dat'; # 過去ログのディレクトリ # → フルパスなら / から記述(http://からではない) # → 最後は必ず / で閉じる $pastdir = './past/'; # 過去ログ1ファイルの行数 # → この行数を超えると次ページを自動生成します $log_line = 600; #------------------------------------------------- # 追加設定項目 by isso #------------------------------------------------- #------------------------------------------------- # 管理者設定 #------------------------------------------------- # # 管理者用マスタパスワード (英数字で8文字以内) $pass = '7804'; # 下記の設定は管理者詐称チェックをする場合のみ必要に応じて変更して下さい。 # 管理者詐称チェック機能に関しては、使い方がわかる方のみ使ってください。 # 使い方がわからないという問い合わせにはお答え致しません。 # # 0 : 管理者詐称チェックをしない # 1 : 管理者詐称チェックをする $adminchk = 0; # 一般利用者が使用できない投稿者名(使用を禁止する名前)を指定 # たとえば、$a_nameで指定した管理者の掲示板表示名を記入します $AdminName = "管理人,管理者"; # 管理者用の入力ハンドル、管理者表示を設定します。 # 管理者用ユーザーID、管理者用マスタパスワードで書き込みした場合のみ、 # 投稿者名を「管理者の掲示板表示名(管理人)」で掲示板上に表示します。 # $admin_idは$AdminNameで指定した名前以外の適当なものに変更して下さい $admin_id = "webmaster"; # 管理者用のユーザーID $a_color = "#FF0000"; # 管理者表示色 $a_name = "管理人"; # 管理者の掲示板表示名 #------------------------------------------------- # 投稿設定 #------------------------------------------------- # # 投稿許可モード設定 # 投稿許可モードにすると全ての投稿を許可制にすることができます。 # 全ての投稿は管理モードから投稿許可されるまで公開されません。 # 0 : 通常投稿モードにする # 1 : 投稿許可モードにする $allowmode = 0; # 投稿制限 # 登録されたアドレスからの投稿は、書き込みされずに拒否ログに記録されます。 # 投稿を公開する場合には管理モードから迷惑投稿を閲覧し再投稿処理をして下さい。 # # 投稿制限ホスト名を記述 # (後方一致、半角カンマで区切る、アスタリスク可) # $dhost = '*-osaka.nttpc.ne.jp,*.o-tokyo.nttpc.ne.jp'; $dhost = ''; # 投稿制限IPアドレスを記述 # (前方一致、半角カンマで区切る、アスタリスク可) # $daddr = '210.12.345.*,203.232.235.*'; $daddr = ''; # 投稿制限時に表示するメッセージ $denymsg = 'このメッセージは管理者による公開許可待ちです。'; #------------------------------------------------- # 掲示板表示設定 #------------------------------------------------- # # 機種依存文字使用時のエラーメッセージ $pdcerror = "機種依存文字は文字化けするためご利用になれません。"; # 機種依存文字の強調表示 $pdch = ""; $pdcf = ""; # 添付ファイルサイズ表示 $imagesize = int($maxData/10000)*10; if ($imagesize<1000) { $imagesize .="kB"; } else { $imagesize =(int(($imagesize+50)/100)/10)."MB";} # 過去ログの添付ファイル処理 # 0 : 過去ログの添付ファイルを削除する # 1 : 過去ログの添付ファイルを残す $pastlogfile = 0; # 掲示板の利用形式が質問受付形式の場合 # 共通の入力フォームを挿入できます。 # # (例) # $inputtext = < HEAD # 表示フッタ(掲示板最下部)の内容設定(タグ利用可能) $footer = < FOOT #------------------------------------------------- # メールアドレス入力設定 #------------------------------------------------- # # WebMail機能を利用すると、投稿者がメールアドレスを公開することなく # 掲示板訪問者からのメールを受け取ることができます(sendmail必須)。 # # WebMailの利用 # 0 : 利用しない # 1 : 利用する (sendmail必須です) $webmail = 0; $usewebmail = "非公開" ; if ( $webmail ) { $usewebmail = "非公開(WebMail利用)" ; } if ($in_email) { $mailopt = "公開" } else { $mailopt = "公開または未記入";} # Webmail認証用ディレクトリ $mailchk = "./mailchk/"; # Webmail送信ログファイル $sendmaillog = './sendmaillog.cgi'; #------------------------------------------------- # 携帯用設定 #------------------------------------------------- # # 携帯からの閲覧や投稿、管理モードによる削除に対応していますが、 # 全ての携帯での動作を保証しているわけではありません。 # 携帯用スクリプト $kscript = './keitai.pl'; # 携帯のUSER_AGENT @keitai = ('DoCoMo','KDDI','J-PHONE','Vodafone','UP.Browser','MOT-','DDIPOCKET','ASTEL','PDXGW','L-mode','Mozilla'); @type = ('i','e','j','v','e','v','d','a','h','l','p'); # 携帯投稿色 $kcolor = "#5000B0"; # 1ページ表示記事数 $keitai_page = 10; # 親記事の先頭記号 $treehead = "□"; # コメント先頭記号 $cohead = "・"; # スレッド内コメント先頭記号 $thcohead = "└"; # 携帯管理モード時の表示 $keitai_mode = "■■管理モード■■"; # Vodafone/J-PHONEのMethod=GET設定 # Vodafone/J-PHONEで投稿できない場合には'POST'に設定します $v_method = 'GET'; # 携帯閲覧用サムネイル画像 # サムネイル画像を作成すると携帯から閲覧できます。 # サムネイル画像を作成するには、ご利用サーバーにて # Image Magickおよびuse File::Copy;を利用できる必用があります。 # 対応しているかどうかはご利用サーバー管理者か # ご利用プロバイダにお問い合わせ下さい。 # 0 : サムネイル画像を作成しない # 1 : サムネイル画像を作成する $thumbnail = 0; # サムネイル画像圧縮率(%) # 0 <- 20 <- 40 <- 50 -> 60 -> 80 ->100 # 悪 <----------- 画質 ----------- > 良 # 小 <----------- 容量 ----------- > 大 $quality = '60'; #------------------------------------------------- # ログファイル消失防止 #------------------------------------------------- # ログファイル消失防止機能の利用 # Write Errorになる場合は掲示板設置ディレクトリの # パーミッションを(707や777に)変更してください # 0 : 利用しない # 1 : 利用する【推奨】 $logbackup = 1; # 一時ログファイル $tempfile = './jy_temp.cgi'; #------------------------------------------------- # スパム投稿(宣伝投稿)拒否設定 #------------------------------------------------- # 通常は設定変更の必用はありません(特に秒数設定)。 # そのままで運用して頂き、拒否できない投稿が多いか # あるいは誤処理が多い場合にのみ設定を変更して下さい。 # [基本設定] のみの設定でほとんど全てのスパムを排除できます。 # 通常 [拡張オプション] を使用しないで(ゼロに設定して)下さい。 # _______________________ # [基本設定] (ゼロにはせず、必ず設定して下さい) #  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ # フォーム投稿確認用 # 削除すると動作しませんので絶対に削除しないで下さい。(変更は可) # 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。 # # 変更する場合は意味不明な文字列にすることをお薦めします。 # (例) $bbscheckmode = 'L4g_Ks16_4Nd9c'; $bbscheckmode = 'JOYFUL_NOTE'; # 削除すると動作しませんので絶対に削除しないで下さい。(変更は可) # 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。 # 特に必用がなければ、変更せずに初期設定のまま運用してください。 # # 変更する場合は意味不明な文字列かあるいは # cancel,clear,delete,reject,reset,erase,annul,effase # などの語句(を含む文字列)にして下さい。 # ただし、下で設定する$postvalueとは違う文字列にしてください。 # (例) $writevalue = 'k9SL0sv_3rk_wq2'; # (例) $writevalue = 'cancel'; $writevalue = 'cancel'; # 削除すると動作しませんので絶対に削除しないで下さい。(変更は可) # 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。 # 特に必用がなければ、変更せずに初期設定のまま運用してください。 # # 変更する場合は意味不明な文字列かあるいは # cancel,clear,delete,reject,reset,erase,annul,effase # などの語句(を含む文字列)にして下さい。 # ただし、上で設定した$writevalueとは違う文字列にしてください。 # (例) $postvalue = 'x2oMw7fepc_7ge3'; # (例) $postvalue = 'clear'; $postvalue = 'clear'; # 削除すると動作しませんので絶対に削除しないで下さい。(変更は可) # 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。 # 特に必用がなければ、変更せずに初期設定のまま運用してください。 $formcheck = 'formcheck'; # チェックデータの符号化処理 # (スパム判定精度にはほとんど影響はありません。) # 0 : 符号化しない # 1 : 符号化する(解析対策) $fcencode = 1; # ハッシュキーの変換設定 # 通常は1に設定しておいて下さい。 # 0 : ハッシュキー変換しない # 1 : ハッシュキー変換をする(スパム対策) $keychange = 1; # 掲示板アクセスからの経過時間(秒) # 投稿フォームを使わないプログラム投稿対策です。 # 投稿者が掲示板を開いて投稿完了するまでの最小時間間隔です。 # 通常は数秒程度に設定しておきます。 # 初期設定は10秒で、ゼロにするとこのチェックは行いません。 $mintime = 5; # 投稿者が掲示板を開いて投稿完了するまでの最長時間間隔です。 # 通常は7200秒(2時間)〜90000秒(25時間)程度に設定しておきます。 # 初期設定は18,000秒(5時間)で、ゼロにするとこのチェックは行いません。 $maxtime = 18000; # 投稿までの間隔がグレーゾーンの場合には # プレビューを表示してから投稿 # 0 : プレビューを表示しない # 1 : プレビューを表示する【推奨】 $previewtime = 1; # プレビュー非表示の最小時間 # アクセスから投稿までの時間間隔が設定秒数以下の場合、 # 投稿内容をプレビュー表示し、クリック後に書き込み処理をします。 # 通常は初期設定のままで問題ありません。 # 拒否されないスパムが多くなるようでしたら長く設定してください。 # 推奨値10〜60(秒)、初期設定は 15(秒)。 $previewmin = 15; # プレビュー非表示の最大時間 # アクセスから投稿までの時間間隔が設定秒数以上の場合、 # 投稿内容をプレビュー表示し、クリック後に書き込み処理をします。 # 通常は初期設定のままで問題ありません。 # 拒否されないスパムが多くなるようでしたら短く設定してください。 # 推奨値1000〜10000(秒)、初期設定は5000秒(約80分)。 $previewmax = 5000; # ____________________________________ # [投稿拒否ログ設定] (スパム投稿として拒否された書き込みに関する設定です) #  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ # 掲示板スパムの投稿拒否ログ # 数ヶ月間はログを記録し、 # 誤処理がなければ「記録しない」にして下さい。 # 0 : 記録しない # 1 : 記録する【推奨】 $spamlog = 1; # 投稿拒否ログファイル $spamlogfile = './spamlog.cgi'; # 投稿拒否ログ1ページあたりの表示数 # 20に設定すると、拒否ログ閲覧の1ページに20件の拒否ログを表示します $spamlog_page = 20; # 投稿拒否ログファイル設定 # 投稿拒否ログファイル容量が大きくなり設定容量を超過すると # 警告を出すか古い拒否ログから順番に削除するかを選択します。 # 0 : 掲示板に警告メッセージをを出す # 1 : 古い拒否ログから順に自動削除する $spamlog_max = 1; # 投稿拒否ログファイルの最大容量 # この許容量を超過すると上記の設定に従って # 「投稿拒否ログファイルを削除」するよう警告を出すか、 # 古い拒否ログから順番にログを削除します。 # 初期値は 1000000 (1MB)。 $spamlog_maxfile = 1E06; # 投稿拒否ログに残すURL許容数 # スパム投稿に、この設定値以上のURLが書き込まれていた場合、 # 拒否ログにはメッセージ本文を省略して記録します。 # 推奨値は20〜50、初期値は40。 $maxurl = 40; # _________________________ # [オプション設定] (必用があれば設定変更して下さい) #  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ # スパムチェック緩和設定 # クッキーデータがある場合(常連投稿者)には # スパムチェックを緩和し投稿しやすくします。 # 0 : 通常通りスパムチェックをする # 1 : スパムチェックを緩和する【推奨】 $cookiecheck = 1; # URL重複書き込み設定 # URL欄に記入したURLと同一URLがメッセージ内に書かれている場合 # スパム投稿と見なし書き込みを拒否します。 # 日本語のアダルト・出会い系・ワンクリック詐欺スパムに # この傾向が多く見られます。 # # 0 : URLの重複書き込みを許可する # 1 : 新規投稿の場合のみURLの重複書き込みを拒否する【推奨】 # 2 : 返信でもURLの重複書き込みを拒否する $urlcheck = 1; # 禁止語句(NGワード、URL)登録ファイル # 書き込み禁止語句を登録するファイルです。 # このファイルに登録された語句、URLを本文やURL欄に書き込むと投稿拒否されます。 # このファイルを削除すると、禁止語句のチェックは行いません。 $spamdata = './spamdata.cgi'; # 最新の禁止語句(NGワード、URL)登録ファイルは下記よりダウンロードしてください。 # http://swanbay-web.hp.infoseek.co.jp/spamdata.html # 禁止語句(NGワード、URL)チェック設定 # 0 : 新規投稿の場合のみ禁止語句(NGワード、URL)チェックをする # 1 : 返信でも禁止語句(NGワード、URL)チェックをする $spamdatacheck = 0; # 0 : メールアドレス欄は禁止語句チェックをしない # 1 : メールアドレス欄も禁止語句チェックをする $ngmail = 1; # 0 : タイトル欄は禁止語句チェックをしない # 1 : タイトル欄も禁止語句チェックをする $ngtitle = 1; # ここでは、多数のURL書き込みを禁止することができます。 # URLの直接書き込みを許可する場合($comment_url = 0; に設定)は # URLを書き込める限度数を設定します。 # 10に設定すると、http://〜を10以上書き込んだ投稿を拒否します。 # ゼロにするとこのチェックは行いません。初期設定は5(推奨値5〜10)。 $spamurlnum = 5; # 掲示板スパム投稿時の処理 # 0 : 書き込み拒否のみ(下記のメッセージを表示) # 1 : 即時エラー表示 # それ以外の数値 : 数値秒後にエラー表示 # 3600に設定すると3600秒(60分)後にエラー表示 $spamresult = 0; # スパムと判断された場合の表示メッセージ # $spammsg = '投稿は正常に受理されました'; # と設定すると通常の書き込みと投稿拒否を区別できなくすることができます。 # スパム業者に投稿拒否を知られづらくなります。(日本語スパムが多い掲示板向け) # $spammsg = ''; # とメッセージを設定しない場合には「404 Not Found」エラーを返して # 掲示板が削除されたかのように振る舞います。 # 初期設定は # $spammsg = '迷惑投稿として正常に処理されました'; $spammsg = '迷惑投稿として正常に処理されました'; # チェックデータのJavascript表示化 # 1に設定するとJavascript表示に対応していない # プログラムからの投稿を排除することができます。 # 0 : チェックデータのJavascript表示しない # 1 : チェックデータのJavascript表示化する(スパム対策) $javascriptpost = 0; # タイトル入力チェック # 0 : タイトル未入力のときは「無題」にする # 1 : タイトル未入力のときはエラー表示する # 2 : 半角数字のみのタイトルやhttp://を含むタイトルのときはエラー表示する $suberror = 0; # メッセージ内の日本語をチェック # メッセージ内にひらがな、あるいはカタカナが含まれているかをチェックします。 # 0 : メッセージに日本語が含まれていなくても投稿を許可する # 1 : メッセージに日本語が含まれていない場合は投稿を拒否する $asciicheck = 0; # メッセージ文字数のチェック設定 # 20に設定すると、URLの記載がある場合に限り # URL以外の文字数が半角文字で20文字未満、 # 全角文字で10文字未満の場合に投稿を拒否します。 # ゼロにするとこのチェックは行いません。 $characheck = 0; # 投稿用の合い言葉設定 # 合い言葉の入力を必須とする場合に設定してください。 # (合い言葉設定例) # $aikotoba = 'ほげほげ'; # 合い言葉を利用しない場合には何も書かないでください。 $aikotoba = ''; # 合い言葉を設定する場合、合い言葉のヒントを書いてください。 # (例) 合い言葉には○○○をひらがなで書いてください $hint = "合い言葉欄には$aikotobaと書いてください"; # ___________________________________ # [拡張オプション設定] (非常用/特に必要性のある場合のみ設定して下さい。) #  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ # この [拡張オプション] は基本的には設定せず、全てゼロのままご利用下さい。 # この項目を設定しなくてもスパム投稿は排除できます。 # 設定してスパムチェックを厳しくするとスパム投稿は全く無くなりますが、 # それと同時に、投稿時の制限が多いと通常の投稿も減ります。 # # # [拡張オプション] URLの直接書き込みを禁止する # URL(http://〜)のメッセージ内への直接書き込みを禁止し、 # ttp://〜と書き込んだときだけ、URLの書き込みを許可します。 # 0 : URLの直接書き込みを許可する # 1 : URLの直接書き込みを禁止する(URLを書き込む場合には ttp://〜と記述) $comment_url = 0; # [拡張オプション] 掲示板への直接アクセス投稿制限 # 掲示板へ直接アクセスした場合に投稿を禁止させることができます。 # 掲示板リストを作成して自動投稿をするようなスパムを排除できますが、 # ブックマークから直接掲示板にアクセスした場合も投稿制限を受けます。 # 0 : 投稿を許可する # 1 : 投稿を禁止する(閲覧は可能) # 2 : 「404 Not Found」エラーを返す $referercheck = 1; # [拡張オプション] URL転送・短縮URLの掲載禁止設定 # URL転送サービスおよび短縮URLサービスの疑いのあるURLを # 本文かURL欄に掲載した場合、投稿を禁止させることができます。 # (例) http://symy.jp/ http://xrl.us/ http://jpan.jp/ # http://urlsnip.com/ http://tinyurl.com/ http://204.jp/ など # # 0 : 投稿を許可する # 1 : 投稿を禁止する $shorturl = 1; # [拡張オプション] メールアドレスの入力を禁止できます # 0 : メールアドレスの入力を自由にする # 1 : メールアドレスの入力を禁止する # 2 : メールアドレスの入力はアットマークを全角入力「 @ 」に限定する $no_email = 0; if ($no_email) { $in_email = 0; } # [拡張オプション] 投稿端末 # 0 : 携帯からの投稿はスパムチェックをしない【推奨】 # 1 : 携帯からの投稿でもスパムチェックをする $keitaicheck = 0; # [拡張オプション] 投稿IPアドレスチェック設定 # アクセスIPアドレスと投稿IPアドレスが一致しない場合、 # 投稿を拒否することができます。 # 0 : IPアドレスが一致しなくても投稿許可する # 1 : IPアドレスが一致しない場合は投稿拒否する $ipcheckmode = 0; # [拡張オプション] 日本語環境チェック # ブラウザの言語コード設定に日本語(ja)がある場合のみ # 投稿を許可させることができます。 # 0 : 日本語環境以外からの投稿を許可する # 1 : 日本語環境以外からの投稿は拒否する $japanese = 1; # 投稿許可モード設定 # (設定変更不要) $postmode = '迷惑投稿'; $alreason = '投稿拒否理由'; if($allowmode) { $previewtime = 0; $spamresult = 1; $spammsg = '正常に処理されました。なお、投稿は管理者の許可後に公開されます。'; $postmode = '公開許可待ち投稿'; $alreason = '状態'; } # _________________________________ # [自動アクセス制限設定] (下記の利用方法をお読み下さい) #  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ # 自動アクセス制限の利用方法は下記サイトを参照下さい。 # http://swanbay-web.hp.infoseek.co.jp/accesstrap/index.html # # [自動アクセス制限設定] 制限ファイル # 変更しないでください。 $denyfile = './denyaddress.cgi'; # アクセス制限IPアドレスファイル(外国からのスパム拒否用) $deny_addr_file = './deny_addr_file.cgi'; # アクセス拒否IP追加 @denyaddr= split(/\s+/, $deny_addr); if (-e $deny_addr_file) { open(IN," $deny_addr_file"); $deny_addr2 = ; close(IN); @deny_addr2 = split(/\s+/, $deny_addr2); push(@denyaddr, @deny_addr2); } #------------------------------------------------- # 設定完了 #------------------------------------------------- if($writevalue eq $postvalue) { &error("\$writevalueと\$postvalueの文字は同じにしないでください"); } # メイン処理 &agent; &decode; &axscheck; &previewcheck; if ($mode eq "howto") { &howto; } elsif ($mode eq "find") { &find; } elsif ($mode eq "usr_del") { &usr_del; } elsif ($mode eq "usr_edt") { &usr_edt; } elsif ($mode eq "$writevalue" && $in{'pview'} ne "on") { ®ist; } elsif ($mode eq "$postvalue" && $in{'pview'} eq "on") { ®ist; } elsif ($mode eq "$writevalue" && $in{'pview'} eq "on") { &error("$spammsg"); } elsif ($mode eq "previewmode") { &previewmode("$timecheck"); } elsif ($mode eq "res") { &res_form; } elsif ($mode eq "admin") { &admin; } elsif ($mode eq "past") { &past; } elsif ($mode eq "check") { ✓ } elsif ($mode eq "writemail") { &writemail; } elsif ($mode eq "sendmail") { &sendmail; } elsif ($mode eq "sendmaillog") { &sendmaillog; } elsif ($mode eq "maillogclear") { &maillogclear; } elsif ($mode eq "spam") { &spam; } elsif ($mode eq "spammsg") { &spammsg; } elsif ($mode eq "spamclear") { &spamclear; } elsif ($mode eq "spamdata") { &spamdata; } elsif ($mode eq "editspam") { &editspam; } elsif ($mode eq 'noscript') { &noscript; } elsif ($mode eq "admin_repost_form") { &admin_repost_form; } elsif ($in{'pass'} eq $pass && $mode eq "admin_repost") { ®ist; } elsif ($mode eq "search") { &search; } elsif ($mode eq "psearch") { &psearch; } # 携帯対応改造 elsif ($keitai ne 'p' && $mode eq "knew") { &keitai_new_list; } elsif ($keitai ne 'p' && $mode eq "klist") { &keitai_list_view; } elsif ($keitai ne 'p' && $mode eq "klview") { &keitai_log_list; } elsif ($keitai ne 'p' && $mode eq "kaview") { &keitai_msg_view; } elsif ($keitai ne 'p' && $mode eq "kmsgview") { &keitai_msg_view; } elsif ($keitai ne 'p' && $mode eq "k_admin") { &keitai_new_list; } elsif ($keitai ne 'p' && $mode eq "dele" && $in{'no'}) { &k_dele; } elsif ($keitai ne 'p' && $mode eq "newpost") { &k_msg_form; } &html_log; #------------------------------------------------- # アクセス制限 #------------------------------------------------- sub axscheck { # IP&ホスト取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr && ($host eq "" || $host eq $addr)) { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } # IPチェック local($flg); foreach (@denyaddr) { s/\./\\\./g; s/\*/\.\*/g; if ($addr =~ /^$_/i) { $flg = 1; last; } } if ($flg) { &error("アクセスを許可されていません"); # ホストチェック } elsif ($host) { foreach ( split(/\s+/, $deny_host) ) { s/\./\\\./g; s/\*/\.\*/g; if ($host =~ /$_$/i) { $flg = 1; last; } } if ($flg) { &error("アクセスを許可されていません"); } } if ($host eq "") { $host = $addr; } if (-e "$denyfile") { &spambot; } if ($keitai eq "p") { if ($referercheck==2 && !$ENV{'HTTP_REFERER'}) { &access_error; } } } #------------------------------------------------- # 携帯機種チェック #------------------------------------------------- sub agent { # 携帯機種設定 local($agent) = $ENV{'HTTP_USER_AGENT'}; $method = 'POST'; $keitai = 'p'; local ($i) = 0; foreach (@keitai) { if ($agent =~ /^\Q$_\E/i) { $keitai = $type[$i]; last; } $i++; } # Vodafone/J-PHONEのMethod if ($keitai eq 'v' || $keitai eq 'j') { $method = $v_method; } # 携帯モードテスト用 # $keitai = 'i'; # 携帯モード if (-e "$kscript" && $keitai ne 'p') { require "$kscript"; } } #------------------------------------------------- # 記事表示部 #------------------------------------------------- sub html_log { local($ipt,$wh,$i,$flag,$author); local($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba) = &get_cookie; &set_cookie($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba); # 携帯モード if (-e "$kscript" && $keitai ne 'p') { &keitai_list_view; } # ヘッダを出力 &header; print "$header
\n"; # カウンタ処理 if ($counter) { &counter; } # タイトル部 print "
\n"; if ($banner1 ne "") { print "$banner1

\n"; } if ($t_img eq '') { print "$title\n"; } else { print "\"$title\"\n"; } if ( (-s $spamlogfile) > $spamlog_maxfile ) { print "
\n
\n$postmodeログ(スパムログ)のファイルサイズが大きくなりました。
", "至急、管理モードから$postmodeログを削除して下さい。

\n
\n"; } # メニュー部 print "


\n"; print "[トップに戻る]\n"; print "[留意事項]\n"; print "[ワード検索]\n"; print "[過去ログ]\n" if ($pastkey); print "[管理用]\n"; print "
\n"; # 投稿フォーム &form(); print "

\n"; # 記事展開 $i=0; $flag=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { chomp; ($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$tail,$w,$h,$chk,$tm,$sml) = split(/<>/); if ($reno eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $p_log) { next; } # 題名の長さ if (length($sub) > $sub_len*2) { $sub = substr($sub,0,$sub_len*2); $sub .= "..."; } # if ($mail) { $name = "$name"; } $author = $name; if ($sml) { if ($webmail) { $name0 = $name; $nam = "$name0"; $namlength = length($nam); $spnum = int($namlength/4); $nam0= substr ($nam, 0, $spnum); $nam1= substr ($nam, $spnum, $spnum); $nam2= substr ($nam, $spnum+$spnum, $spnum); $nam3= substr ($nam, $spnum+$spnum+$spnum); $name="\n\n"; } } elsif ($keitai eq "p" && $mail) { ($em0,$em1) = split(/\@/,$mail); $em1 =~ s/\./&\#46\;/g; $name = "\n". "\n"; } if ($home_icon && $url) { if ($url !~ /^http\:\/\//) { $url = "http://$url"; } $url = "HomePage"; } elsif (!$home_icon && $url) { if ($url !~ /^http\:\/\//) { $url = "http://$url"; } $url = "<HOME>"; } if (!$reno && $flag) { print "

\n"; $flag=1; } if (!$reno) { print "
\n"; $flag=1; } if ($reno) { print "
\n"; } print "\n"; if ($reno) { print ""; } print ""; print "\n"; } else { print "
\n"; } print "

$sub "; if (!$reno) { print "投稿者:$name 投稿日:$date "; } else { print "$name - $date "; } print "No.$no   $url \n"; if (!$reno) { print "
\n"; print "\n"; print "\n"; print "
\n"; if ($reno) { print "\n"; } print "

"; if (!$reno) { print "
\n"; } # 自動リンク if ($autolink) { &auto_link($comment); } if ($imgpoint == 1) { $ipt="align=left hspace=18"; } else { $ipt=""; print "$comment"; } # 添付ファイルが存在する場合 if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") { if ($ImageCheck && $chk != 1) { print "

\n"; } else { if ($w && $h) { $wh="width=$w height=$h"; } else { $wh=""; } print "

\n"; } } elsif ($tail) { print "

Download:$no$tail $no$tail\n"; } print "$comment
" if ($imgpoint == 1); if (!$reno) { print "

\n"; } print "
\n"; # 投稿者編集フォーム if ($cnam) { if ($cnam =~ /\Q$author\E/i || $author =~ /\Q$cnam\E/i) { print "
\n
\n", "
\n", "投稿者 \n", "\n ", "暗証キー \n", "
\n"; print "
\n
\n"; } } } close(IN); print "
\n"; $next = $page + $p_log; $back = $page - $p_log; $p_flag=0; print "

\n"; if ($back >= 0) { $p_flag=1; print "\n"; } if ($next < $i) { $p_flag=1; print "\n"; } # ページ移動ボタン表示 if ($p_flag) { print "\n"; } print "
\n"; print "\n"; print "
\n"; print "\n"; print "
\n"; $x=1; $y=0; while ($i > 0) { if ($page == $y) { print "[$x]\n"; } else { print "[$x]\n"; } $x++; $y = $y + $p_log; $i = $i - $p_log; } print "
\n"; print "
\n"; print "
\n"; print "- 以下のフォームから自分の投稿記事を修正・削除することができます -
\n"; print "処理 \n"; print "記事No \n"; print "暗証キー \n"; print "
\n"; # 著作権表示部(削除改変不可) print "$banner2

\n"; print "\n"; print "- Joyful Note -\n"; print "
Modified by isso\n"; print "
\n
\n"; print "$footer"; print "

\n\n"; exit; } #------------------------------------------------- # 投稿記事受付 #------------------------------------------------- sub regist { local($top,$ango,$f,$match,$tail,$W,$H,@lines,@new,@tmp); local($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba) = &get_cookie; # 拡張オプションチェック if ($mode ne "admin_repost") { &option_check($in{'pwd'},$in{'email'},$in{'comment'},$in{'url'}); } if ($in{'email'} && $in{'email'} =~ /@/) { $in{'email'} =~ s/@/\@/; } # 合い言葉をチェック if ($aikotoba) { if ($in{'aikotoba'} ne $aikotoba) { &error("合い言葉が不正です"); } } # フォーム入力チェック &form_check; # URL if ($in{'url'} eq "http://") { $in{'url'} = ""; } # タイトルチェック if (!$in{'sub'}) { if ($suberror) { &error("タイトルが入力されていません"); } else { $in{'sub'} = "無題"; } } elsif ($suberror == 2) { if ($in{'sub'} !~ /[^0-9]/ || $in{'sub'} =~ /http\:\/\//i) { &error("タイトルが不正です"); } } # 管理者詐称チェック local($acflag)=0; foreach (split(/\,/, $AdminName)) { if ($in{'name'} =~ /\Q$_\E/i) { $acflag=1; last; } } if ($adminchk && $acflag) { &error("$in{'name'}を名乗ることはできません。"); } $aflag = 0; if ($in{'name'} eq $admin_id && $in{'pwd'} eq $pass) { $in{'name'} = $a_name; $in{'color'} = $a_color; $aflag = 1; } # 禁止ワードチェック if ($deny_word) { &deny_word($in{'name'}); &deny_word($in{'comment'}); } # 時間を取得 &get_time; # ファイルロック if ($lockkey) { &lock; } # ログを開く open(IN,"$logfile") || &error("Open Error: $logfile"); @lines = ; close(IN); # 記事NO処理 $top = shift(@lines); local($no,$ip,$time2) = split(/<>/, $top); $no++; # 連続投稿チェック if ($mode ne "admin_repost") { if ($addr eq $ip && $wait > $times - $time2) { &error("連続投稿はもうしばらく時間をおいて下さい"); } } # 暗証キーを暗号化 if ($mode ne "admin_repost") { if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); } } # ファイル添付処理 if ($in{'pview'} ne "on") { if ($in{'upfile'}) { if (!$aflag && $allowmode) { $no = $in{"$bbscheckmode"}; } ($tail,$W,$H) = &upload; } } elsif ($in{'tail'}) { $tail = $in{'tail'}; $W = $in{'W'}; $H = $in{'H'}; rename ("$imgdir$in{\"$bbscheckmode\"}$tail","$imgdir$no$tail"); if ($thumbnail) { $thumbnailfile = "$imgdir$no"."s"."$tail"; rename ("$imgdir$in{\"$bbscheckmode\"}s$tail","$thumbnailfile"); } } # 改行・ダブルクオート復元 if ($in{'pview'} eq "on") { $in{'comment'} =~ s/<br>/
/g; $in{'comment'} =~ s/"/"/g; } # スパム投稿チェック ($spam,$reason) = &spam_check($in{'name'},$in{'url2'},$in{"$bbscheckmode"},$in{'comment'}, $in{'reno'},$in{'url'},$in{'email'},$in{'sub'},$in{'mail'},$in{"$formcheck"},$cnam, $in{'subject'},$in{'title'},$in{'theme'},$ENV{'HTTP_ACCEPT_LANGUAGE'},$ENV{'HTTP_USER_AGENT'}); # プレビュー&スパムログの削除 if ($in{'pview'} eq "on" || $mode eq "admin_repost") { if ($spamlog) { &del_spamlog("$in{\"$bbscheckmode\"}"); } } # スパム投稿処理 if ($spam && $mode ne "admin_repost") { # 投稿拒否ログの記録 if ($spamlog && !$allowmode) { &write_spamlog; } if ($spamresult) { # エラー表示 if ($spamresult eq '1') { &error("迷惑投稿のため処理を中断しました"); } else { sleep($spamresult); &error("迷惑投稿のため処理を中断しました"); } } elsif ($spammsg) { &message("$spammsg"); } else { &access_error; } } # 復活処理 if ($mode eq "admin_repost") { $date = $in{'date'}; $host = $in{'host'}; $ango = $in{'ango'}; if ($in{'tail'}) { $tail = $in{'tail'}; $W = $in{'W'}; $H = $in{'H'}; $times= $in{'tim'}; rename ("$imgdir$in{'uploadtime'}$tail","$imgdir$no$tail"); if ($thumbnail) { $thumbnailfile = "$imgdir$no"."s"."$tail"; if (-s "$imgdir$in{'uploadtime'}s$tail") { rename ("$imgdir$in{'uploadtime'}s$tail","$thumbnailfile"); } } } } # 投稿制限 &post_check; # クッキーを発行(復活処理を除く) if ($mode ne "admin_repost") { if ($sameurl) { $in{'url'} = ""; } if ($aflag) { if ($no_email == 2) { $in{'email'} =~ s/\@/@/; } &set_cookie($admin_id,$in{'email'},$in{'url'},$in{'pwd'},$in{'icon'},$in{'color'},$in{'smail'},$in{'aikotoba'}); if ($no_email == 2) { $in{'email'} =~ s/@/\@/; } } else { if ($no_email == 2) { $in{'email'} =~ s/\@/@/; } &set_cookie($in{'name'},$in{'email'},$in{'url'},$in{'pwd'},$in{'icon'},$in{'color'},$in{'smail'},$in{'aikotoba'}); if ($no_email == 2) { $in{'email'} =~ s/@/\@/; } } } # 投稿非公開処理 if (!$aflag && $allowmode && $mode ne "admin_repost") { &write_spamlog; &message("$spammsg"); } # 親記事の場合 if ($in{'reno'} eq "") { $i=0; $stop=0; foreach (@lines) { ($no2,$reno2,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$tail2,$w,$h,$chk,$tm,$sml) = split(/<>/); $i++; if ($i > $max-1 && $reno2 eq "") { $stop=1; } if (!$stop) { push(@new,$_); } else { if ($pastkey) { push(@data,$_); } # 過去ログの添付ファイル処理 if (!$pastlogfile){ if (-e "$imgdir$no2$tail2") { unlink("$imgdir$no2$tail2"); } $thumbnailfile = "$imgdir$no2"."s"."$tail2"; if (-e "$thumbnailfile") { unlink("$thumbnailfile"); } } } } unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>$times<>$in{'smail'}<>\n"); unshift(@new,"$no<>$addr<>$times<>\n"); # 過去ログ更新 if ($data[0]) { &pastlog; } # 一時ファイルを作成 if (!$logbackup) { $tempfile = $logfile; } open(OUT,">$tempfile") || &error("Write Error : ログファイルに書き込みができません。
掲示板設置ディレクトリのパーミッション設定を変更してください。"); chmod (0606,$tempfile); print OUT @new; close(OUT); # 一時ファイル正常更新時にログファイルにリネーム if ( $logbackup && (-s $tempfile) > 100 ) { rename ($tempfile,$logfile) || &error("Rename Error"); } # レス記事の場合:トップソートあり } elsif ($in{'reno'} && $topsort) { $f=0; $match=0; @new=(); @tmp=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($in{'reno'} eq $no2) { if ($reno2) { $f++; last; } $match=1; push(@new,$_); } elsif ($in{'reno'} eq $reno2) { push(@new,$_); } elsif ($match == 1 && $in{'reno'} ne $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>$times<>$in{'smail'}<>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($f || !$match) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>$times<>$in{'smail'}<>\n"); } push(@new,@tmp); # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); # 一時ファイルを作成 if (!$logbackup) { $tempfile = $logfile; } open(OUT,">$tempfile") || &error("Write Error : ログファイルに書き込みができません。
掲示板設置ディレクトリのパーミッション設定を変更してください。"); chmod (0606,$tempfile); print OUT @new; close(OUT); # 一時ファイル正常更新時にログファイルにリネーム if ( $logbackup && (-s $tempfile) > 100 ) { rename ($tempfile,$logfile) || &error("Rename Error"); } # レス記事の場合:トップソートなし } else { $f=0; $match=0; @new=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($match == 0 && $in{'reno'} eq $no2) { if ($reno2) { $f++; last; } $match=1; } elsif ($match == 1 && $in{'reno'} ne $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>$times<>$in{'smail'}<>\n"); } push(@new,$_); } if ($f || !$match) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>$times<>$in{'smail'}<>\n"); } # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); # 一時ファイルを作成 if (!$logbackup) { $tempfile = $logfile; } open(OUT,">$tempfile") || &error("Write Error : ログファイルに書き込みができません。
掲示板設置ディレクトリのパーミッション設定を変更してください。"); chmod (0606,$tempfile); print OUT @new; close(OUT); # 一時ファイル正常更新時にログファイルにリネーム if ( $logbackup && (-s $tempfile) > 100 ) { rename ($tempfile,$logfile) || &error("Rename Error"); } } # ロック解除 if ($lockkey) { &unlock; } # メール処理 if ($mailing == 1 && $in{'email'} ne $mailto) { &mail_to; } elsif ($mailing == 2) { &mail_to; } # リロード if ($location) { if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $location?\n\n"; } else { &message("投稿は正常に処理されました"); } } #------------------------------------------------- # メッセージ #------------------------------------------------- sub message { local($msg) = @_; &header; print "

\n"; print "

$msg

\n"; print "
\n"; print "
\n"; print "
\n\n"; exit; } #------------------------------------------------- # 画像アップロード #------------------------------------------------- sub upload { local($macbin,$fname,$flag,$upfile,$imgfile,$tail,$W,$W2,$H,$H2); # 画像処理 $macbin=0; foreach (@in) { if (/(.*)Content-type:(.*)/i) { $tail=$2; } if (/(.*)filename=\"(.*)\"/i) { $fname=$2; } if (/application\/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; # ファイル形式を認識 $flag=0; if ($tail =~ /image\/gif/i && $gif) { $tail=".gif"; $flag=1; } if ($tail =~ /image\/p?jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; } if ($tail =~ /image\/x-png/i && $png) { $tail=".png"; $flag=1; } if ($tail =~ /text\/plain/i && $text) { $tail=".txt"; $flag=1; } if ($tail =~ /lha/i && $lha) { $tail=".lzh"; $flag=1; } if ($tail =~ /zip/i && $zip) { $tail=".zip"; $flag=1; } if ($tail =~ /pdf/i && $pdf) { $tail=".pdf"; $flag=1; } if ($tail =~ /audio\/.*mid/i && $midi) { $tail=".mid"; $flag=1; } if ($tail =~ /msword/i && $word) { $tail=".doc"; $flag=1; } if ($tail =~ /ms-excel/i && $excel) { $tail=".xls"; $flag=1; } if ($tail =~ /ms-powerpoint/i && $ppt) { $tail=".ppt"; $flag=1; } if ($tail =~ /audio\/.*realaudio/i && $ram) { $tail=".ram"; $flag=1; } if ($tail =~ /application\/.*realmedia/i && $rm) { $tail=".rm"; $flag=1; } if ($tail =~ /video\/.*mpeg/i && $mpeg) { $tail=".mpg"; $flag=1; } if ($tail =~ /audio\/.*mpeg/i && $mp3) { $tail=".mp3"; $flag=1; } if (!$flag) { if ($fname =~ /\.gif$/i && $gif) { $tail=".gif"; $flag=1; } if ($fname =~ /\.jpe?g$/i && $jpeg) { $tail=".jpg"; $flag=1; } if ($fname =~ /\.png$/i && $png) { $tail=".png"; $flag=1; } if ($fname =~ /\.lzh$/i && $lha) { $tail=".lzh"; $flag=1; } if ($fname =~ /\.txt$/i && $text) { $tail=".txt"; $flag=1; } if ($fname =~ /\.zip$/i && $zip) { $tail=".zip"; $flag=1; } if ($fname =~ /\.pdf$/i && $pdf) { $tail=".pdf"; $flag=1; } if ($fname =~ /\.mid$/i && $midi) { $tail=".mid"; $flag=1; } if ($fname =~ /\.doc$/i && $word) { $tail=".doc"; $flag=1; } if ($fname =~ /\.xls$/i && $excel) { $tail=".xls"; $flag=1; } if ($fname =~ /\.ppt$/i && $ppt) { $tail=".ppt"; $flag=1; } if ($fname =~ /\.ram$/i && $ram) { $tail=".ram"; $flag=1; } if ($fname =~ /\.rm$/i && $rm) { $tail=".rm"; $flag=1; } if ($fname =~ /\.mpe?g$/i && $mpeg) { $tail=".mpg"; $flag=1; } if ($fname =~ /\.mp3$/i && $mp3) { $tail=".mp3"; $flag=1; } } # アップロード失敗処理 if (!$flag || !$fname) { if (!$clip_err) { return; } else { &error("アップロードできません"); } } $upfile = $in{'upfile'}; # マックバイナリ対策 if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } # 添付データを書き込み $imgfile = "$imgdir$no$tail"; open(OUT,">$imgfile") || &error("アップロード失敗"); binmode(OUT); binmode(STDOUT); print OUT $upfile; close(OUT); chmod (0666, $imgfile); # 画像サイズ取得 if ($tail eq ".jpg") { ($W, $H) = &JpegSize($imgfile); } elsif ($tail eq ".gif") { ($W, $H) = &GifSize($imgfile); } elsif ($tail eq ".png") { ($W, $H) = &PngSize($imgfile); } # 画像表示縮小 if ($W > $MaxW || $H > $MaxH) { $W2 = $MaxW / $W; $H2 = $MaxH / $H; if ($W2 < $H2) { $key = $W2; } else { $key = $H2; } $W = int ($W * $key) || 1; $H = int ($H * $key) || 1; } # サムネイル作成 if ($thumbnail) { # use File::Copy; # $thumfile = "$imgdir$no"."s"."$tail"; # copy($imgfile,$thumfile) || die "ファイルのコピーに失敗しました : $!"; # &JPEGCommentCut($thumfile); require './imagemagick.pl'; &thumbnail($imgdir,$no,$tail,$imgfile); &ImageMagick($imgdir,$no,$tail,$thumfile,$W,$H); } return ($tail,$W,$H); } #------------------------------------------------- # 返信フォーム #------------------------------------------------- sub res_form { local($f,$no,$reno,$date,$name,$mail,$sub,$com,$url); # ヘッダを出力 &header; # ログを読み込み $f=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; # 関連記事出力 print "[戻る]

\n"; print "- 以下は、記事NO. $in{'no'} に関する 返信フォーム です -


\n"; $flag=0; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url) = split(/<>/); if (!$reno) { $com = "
$com
"; } if ($in{'no'} == $no && $reno) { $f++; } if ($in{'no'} == $no || $in{'no'} == $reno) { if ($in{'no'} == $no) { $resub = $sub; } if ($url) { if ($url !~ /^http\:\/\//) { $url = "http://$url"; } $url = "<HOME>"; } if ($reno && !$flag) { print "
\n"; $flag=1; } print "$sub 投稿者:$name 投稿日:$date $url No.$no
$com

\n"; } } close(IN); if ($f) { &error("不正な返信要求です"); } if ($flag) { print "

\n"; } print "
\n"; # タイトル名 if ($resub !~ /^Re\:/) { $resub = "Re\: $resub"; } print "\n"; &form("res","","","","","",$resub,"","","","",""); print "\n\n"; exit; } #------------------------------------------------- # デコード処理 #------------------------------------------------- sub decode { local($key, $val, $buf); $post_flag = 0; if ($ENV{'REQUEST_METHOD'} eq "$method") { if ($keitai eq 'p' && $mode ne "admin") { &ReadParse(*in); } $post_flag = 1; if ($ENV{'CONTENT_LENGTH'} > $maxData) { &error("投稿量が大きすぎます"); } read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } # undef(%in); foreach ( split(/&/, $buf) ) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; next if ($key eq "upfile"); # シフトJISコード変換 &jcode'convert(*val, "sjis", "", "z"); # タグ処理 $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; # 改行処理 $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; $in{$key} .= "\0" if (defined($in{$key})); $in{$key} .= $val; } $mode = $in{'mode'}; $page = $in{'page'}; if ($keychange) { if ($mode eq "$writevalue" || $mode eq "sendmail") { ($in{'email'},$in{'url'})=($in{'url'},$in{'email'}); ($in{'comment'},$in{'name'}) = ($in{'name'},$in{'comment'}); } } # 改行コード処理 $in{'comment'} =~ s/
/\r\n/g; $in{'comment'} =~ s/
/\r/g; $in{'comment'} =~ s/
/\n/g; # タグ処理 $in{'comment'} =~ s/>/>/g; $in{'comment'} =~ s//>/g; $in{'name'} =~ s//g; $in{'comment'} =~ s/\r/
/g; $in{'comment'} =~ s/\n/
/g; while ($in{'comment'} =~ /
$/) { $in{'comment'} =~ s/
$//g; } } #------------------------------------------------- # 留意事項 #------------------------------------------------- sub howto { if ($in_email) { $eml_msg = "記事を投稿する上での必須入力項目は「おなまえ」「Eメール」「メッセージ」です。URL、題名、暗証キーは任意です。"; } else { $eml_msg = "記事を投稿する上での必須入力項目は「おなまえ」「メッセージ」です。Eメール、URL、題名、暗証キーは任意です。"; } $maxkb = int ($cgi_lib'maxdata / 1024); if ($gif) { $FILE .= "GIF, "; } if ($jpeg) { $FILE .= "JPEG, "; } if ($png) { $FILE .= "PNG, "; } if ($text) { $FILE .= "TEXT, "; } if ($lha) { $FILE .= "LHA, "; } if ($zip) { $FILE .= "ZIP, "; } if ($pdf) { $FILE .= "PDF, "; } if ($midi) { $FILE .= "MIDI, "; } if ($word) { $FILE .= "WORD, "; } if ($excel) { $FILE .= "EXCEL, "; } if ($ppt) { $FILE .= "POWERPOINT, "; } if ($rm) { $FILE .= "RM, "; } if ($ram) { $FILE .= "RAM, "; } if ($mpeg) { $FILE .= "MPEG, "; } if ($mp3) { $FILE .= "MP3, "; } $FILE =~ s/\, $//; &header; print <<"HTML"; [掲示板にもどる]
掲示板の利用上の注意

  1. この掲示板はクッキー対応です。1度記事を投稿いただくと、おなまえ、Eメール、URL、暗証キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)

  2. 画像などのバイナリーファイルをアップロードすることが可能\です。

    • 添付可能\ファイル : $FILE
    • 最大投稿データ量 : $maxkb KB
    • 画像は横$MaxWピクセル、縦$MaxHピクセルを超えると縮小表\示されます。

  3. 投稿内容には、タグは一切使用できません。

  4. $eml_msg

  5. 記事には、半角カナは一切使用しないで下さい。文字化けの原因となります。

  6. 記事の投稿時に「暗証キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回暗証キーによって削除することができます。

  7. 記事の保持件数は最大 $max件です。それを超えると古い順に自動削除されます。

  8. 既存の記事に「返信」をすることができます。各記事の上部にある「返信」ボタンを押すと返信用フォームが現れます。

  9. 過去の投稿記事から「キーワード」によって簡易検索ができます。トップメニューの「ワード検索」のリンクをクリックすると検索モードとなります。

  10. 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。
HTML exit; } #------------------------------------------------- # ワード検索処理 #------------------------------------------------- sub find { &header; print <<"EOM"; [掲示板に戻る]

  • 検索したいキーワードを入力し、「条件」「表\示」を選択して検索ボタンを押して下さい。
  • キーワードは「半角スペース」で区切って複数指定することができます。

    キーワード: 条件:\n"; print "表\示:\n"; print "
    \n
\n"; # ワード検索の実行と結果表示 if ($in{'word'} ne "") { # 入力内容を整理 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); # 検索終了 $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; $enwd = &url_enc($in{'word'}); if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } print "[検索やり直し]\n"; foreach ($page .. $page_end) { ($no,$reno,$date,$name,$email,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk,$tm,$sml) = split(/<>/, $new[$_]); # if ($email) { $name = "$name"; } if ($sml) { if ($webmail) { $name0 = $name; $nam = "$name0"; $namlength = length($nam); $spnum = int($namlength/4); $nam0= substr ($nam, 0, $spnum); $nam1= substr ($nam, $spnum, $spnum); $nam2= substr ($nam, $spnum+$spnum, $spnum); $nam3= substr ($nam, $spnum+$spnum+$spnum); $name="\n\n"; } } elsif ($email) { ($em0,$em1) = split(/\@/,$email); $em1 =~ s/\./&\#46\;/g; $name = "\n". "\n"; } if ($url) { if ($url !~ /^http\:\/\//) { $url = "http://$url"; } $url = "<HOME>"; } $num = $no; if ($reno) { $no = "$renoへのレス"; } if ($imgpoint == 1) { $ipt="align=left hspace=18"; } else { $ipt=""; } # 結果を表示 print "
[$no] $sub"; print " 投稿者:$name 投稿日:$date $url
\n"; print "\n
\n"; print "
\n"; # 添付ファイルが存在する場合 if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") { if ($ImageCheck && $chk != 1) { print "

\n"; } else { if ($w && $h) { $wh="width=$w height=$h"; } else { $wh=""; } print "

\n"; } } elsif ($tail) { print "

Download:$num$tail $num$tail\n"; } print "$com

\n"; print "
"; } print "
\n"; } print "\n"; exit; } #------------------------------------------------- # クッキー発行 #------------------------------------------------- sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 60*24*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 国際標準時を定義 $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); # 保存データをURLエンコード foreach (@cook) { s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $cook .= "$_<>"; } # 格納 print "Set-Cookie: JoyfulNote=$cook; expires=$gmt\n"; } #------------------------------------------------- # クッキー取得 #------------------------------------------------- sub get_cookie { local($key, $val, *cook); # クッキーを取得 $cook = $ENV{'HTTP_COOKIE'}; # 該当IDを取り出す foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } # データをURLデコードして復元 foreach ( split(/<>/, $cook{'JoyfulNote'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; push(@cook,$_); } return (@cook); } #------------------------------------------------- # エラー処理 #------------------------------------------------- sub error { &unlock if ($lockflag); &header if (!$headflag); print "

ERROR !

\n"; print "$_[0]\n"; print "


\n"; print "\n"; exit; } #------------------------------------------------- # 管理モード #------------------------------------------------- sub admin { if ($in{'pass'} eq "") { &header; print "

パスワードを入力して下さい

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n\n"; exit; } if ($in{'pass'} ne $pass) { &error("パスワードが違います"); } &header; print "[掲示板に戻る]\n"; print "
\n"; print "管理モード\n"; print "
\n"; # 画像許可 if ($in{'chk'}) { @CHK = split(/\0/, $in{'chk'}); # ロック処理 if ($lockkey) { &lock; } # 許可情報をマッチングし更新 @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$t,$w,$h,$chk,$tm,$sm) = split(/<>/); foreach $xx (@CHK) { if ($no eq $xx) { $_ = "$no<>$reno<>$d<>$n<>$m<>$s<>$com<>$u<>$ho<>$p<>$c<>$t<>$w<>$h<>1<>$tm<>$sm<>\n"; last; } } push(@new,$_); } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 削除処理 if ($in{'del'}) { @DEL = split(/\0/, $in{'del'}); # ロック処理 if ($lockkey) { &lock; } # 削除情報をマッチングし更新 @new=(); open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { $flag=0; ($no,$reno,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$tail,$w,$h,$chk,$t,$sm) = split(/<>/); foreach $del (@DEL) { if ($no eq $del || $reno eq $del) { if (-e "$imgdir$no$tail") { unlink("$imgdir$no$tail"); $thumbnailfile = "$imgdir$no"."s"."$tail"; if (-e "$thumbnailfile") { unlink("$thumbnailfile"); } } $flag=1; last; } } if ($flag == 0) { push(@new,$_); } } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } print "
\n"; if (-e $spamdata) { print <
  • NGワードの一括編集

EOM } if(-e $spamlogfile && -s $spamlogfile) { print <
  • $postmodeを閲覧できます。
EOM } if($webmail && (-e "$mailchk$sendmaillog")) { print <
  • Webmailの送信履歴を閲覧できます。
EOM } print "

"; # 管理を表示 if ($page eq "") { $page = 0; } print "

\n
    \n"; print "
  • 記事を削除する場合は「削除」のチェックボックスにチェックを入れ「送信する」を押して下さい。\n"; print "
  • 画像許可を行なう場合は「画像許可」のチェックボックスにチェックを入れ「送信する」を押して下さい。\n"; print "
\n
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "\n"; print "

\n"; print ""; print ""; print "\n"; $line=9; if ($ImageCheck) { print ""; $line=10; } print "\n"; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; $i=0; while () { $img_flag=0; ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk,$t,$sm) = split(/<>/); if ($mail) { $name="$name"; } ($date) = split(/\(/, $date); if ($url) { if ($url !~ /^http\:\/\//) { $url = "http://$url"; } $url = "<Home>"; } else { $url = '-'; } $com =~ s/
//ig; $com =~ s//>/g; if (length($com) > 40) { $com = substr($com,0,38); $com .= "..."; } if (-e "$imgdir$no$tail") { if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") { $img_flag = 1; $File = "画像"; } else { $File = "File"; } $clip = "$File"; $size = -s "$imgdir$no$tail"; $all += $size; } else { $clip = ""; $size = 0; } if ($reno eq "") { print "
\n"; } # チェックボックス print ""; print ""; print ""; print ""; print "\n"; # 画像許可 if ($ImageCheck) { if ($img_flag == 1 && $chk == 1) { print ""; } elsif ($img_flag == 1 && $chk != 1) { print ""; } else { print ""; } } print "\n"; } close(IN); print "\n"; print "
削除記事NO投稿日タイトル投稿者URL体験談ホスト名画像
(bytes)
画像
許可

$no$date$sub$name$url$com$host$clip
($size)
OK

\n"; $all = int ($all / 1024); print "【添付データ総数 : $all KB】\n"; print "
\n"; print "\n"; exit; } #------------------------------------------------- # ユーザ記事削除 #------------------------------------------------- sub usr_del { if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたは暗証キーが入力モレです"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); $top = shift(@lines); $flag=0; foreach (@lines) { ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk,$tm,$sml) = split(/<>/); if ($flag == 0 && $in{'no'} eq "$no") { if ($pw eq '') { &error("該当記事には暗証キーが設定されていません"); } # 暗証キーを照合 $match = &decrypt("$in{'pwd'}","$pw"); if ($match ne 'yes') { &error("暗証キーが違います"); } # 添付ファイル削除 if (-e "$imgdir$no$tail") { unlink("$imgdir$no$tail"); } $thumbnailfile = "$imgdir$no"."s"."$tail"; if (-e "$thumbnailfile") { unlink("$thumbnailfile"); } if ($reno eq "") { $flag=2; } else { $flag=1; } } elsif ($flag == 2 && $in{'no'} eq $reno) { if (-e "$imgdir$no$tail") { unlink("$imgdir$no$tail"); } $thumbnailfile = "$imgdir$no"."s"."$tail"; if (-e "$thumbnailfile") { unlink("$thumbnailfile"); } next; } else { push(@new,$_); } } if ($flag == 0) { &error("該当記事が見当たりません"); } # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } #------------------------------------------------- # 記事修正処理 #------------------------------------------------- sub usr_edt { local ($tail2,$W2,$H2); if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたはパスワードが入力モレです"); } if ($in{'action'} eq "edit" || $in{'kaction'} eq "edit") { # フォーム入力チェック &form_check; # 禁止ワードチェック if ($deny_word) { &deny_word($in{'name'}); &deny_word($in{'comment'}); } # 管理者詐称チェック local($acflag)=0; foreach (split(/\,/, $AdminName)) { if ($in{'name'} =~ /\Q$_\E/i) { $acflag=1; last; } } if ($adminchk && $acflag) { &error("$in{'name'}を名乗ることはできません。"); } $aflag = 0; if ($in{'name'} eq $admin_id && $in{'pwd'} eq $pass) { $in{'name'} = $a_name; $in{'color'} = $a_color; $aflag = 1; } # ファイル添付処理 if ($in{'upfile'}) { ($tail2,$w2,$h2) = &upload; } # ロック処理 &lock if ($lockkey); } $flag=0; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk,$tm,$sml) = split(/<>/); if ($in{'no'} == $no) { $pw2 = $pw; $flag=1; if ($in{'action'} ne "edit" && $in{'kaction'} ne "edit") { last; } else { # ファイル添付処理 if ($in{'upfile'}) { $tail = $tail2; $w = $w2; $h = $h2; } $_ = "$no<>$reno<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pw<>$in{'color'}<>$tail<>$w<>$h<>$chk<>$tm<>$in{'smail'}<>\n"; } } if ($in{'action'} eq "edit" || $in{'kaction'} eq "edit") { push(@new,$_); } } close(IN); if (!$flag) { &error("該当の記事が見当たりません"); } if ($pw2 eq "") { &error("パスワードが設定されていません"); } $check = &decrypt($in{'pwd'}, $pw2); if ($check ne "yes") { &error("パスワードが違います"); } if ($in{'action'} eq "edit" || $in{'kaction'} eq "edit") { unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); &unlock if ($lockkey); if ($in{'url'}) { if ($in{'url'} !~ /^http\:\/\//) { $in{'url'} = "http://$in{'url'}"; } $in{'url'} = "$in{'url'}"; } if ($in{'email'}) { $in{'email'} = "$in{'email'}"; } if($keitai ne 'p') { &k_after; } else { &header; print "

- 以下のとおり修正が完了しました -

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
名前$in{'name'}
e-mail: $in{'email'}"; if($in{'smail'}) { print " (非公開)"; } print "
題名$in{'sub'}
URL: $in{'url'}
\n"; print "
$in{'comment'}\n"; print "
\n"; print "
\n"; print "
\n"; print "\n\n"; exit; } } $com =~ s/
/\r/g; if($keitai ne 'p') { &k_msg_form("edit",$no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color); } else { &header; print "[戻る]\n"; print "

- 変更する部分のみ修正して送信ボタンを押して下さい -
\n"; &form("edit",$no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail); print "\n\n"; exit; } } #------------------------------------------------- # フォーム入力チェック #------------------------------------------------- sub form_check { # 他サイトからのアクセスを排除 if ($base_url) { $baseUrl =~ s/(\W)/\\$1/g; $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref && $ref !~ /$base_url/i) { &error("不正なアクセスです"); } } # URL if ($in{'url'} eq "http://") { $in{'url'} = ""; } # methodプロパティはPOST限定 if ($ENV{'REQUEST_METHOD'} ne "$method") { &error("不正な投稿です"); } # 入力項目のチェック if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("体験談が入力されていません"); } # 機種依存文字チェック $pdcnam = &find_mdc( $in{'name'}, $pdch, $pdcf ); if($pdcnam) { &error("$pdcerror『 $pdcnam 』"); } $pdcsub = &find_mdc( $in{'sub'}, $pdch, $pdcf ); if($pdcsub) { &error("$pdcerror『 $pdcsub 』"); } $pdcmsg = &find_mdc( $in{'comment'}, $pdch, $pdcf ); if($pdcmsg) { &error("$pdcerror

$pdcmsg
"); } # メールアドレスのチェック if (!$in{'email'}) { $in{'smail'} = 0; } if ($in_email && $in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,5}$/) { &error("E-Mailの入力が不正です"); } if (!$in_email && $in{'email'}) { if ($in{'email'} !~ /https?\:\/\//i) { if ($in{'email'} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) { &error("E-Mailの入力が不正です"); } } } } #------------------------------------------------- # 機種依存文字検出 #------------------------------------------------- # 機種依存文字検出+ハイライト表示追加関数 # Check platform dependent characters / Thanks to carmine # [Usage] $result = &find_mdc( $buf, '', '' ); sub find_mdc { local( $buf, $prefix, $postfix ) = @_; local( $len, $c1, $c2, $o1, $o2, $i, $k, $pdc, $result ); $k = 0; $pdc = 0; $result = ""; $len = length( $buf ); for( $i = 0; $i < $len; ++$i ){ if( $k ){ $k = 0; $c2 = substr( $buf, $i, 1 ); $o2 = ord( $c2 ); if( ( $o1 >= 0x85 && $o1 <= 0x88 ) && ( $o2 >= 0x40 && $o2 <= 0x9e ) ){ $result .= $prefix . $c1 . $c2 . $postfix; $pdc = 1; } else { $result .= $c1 . $c2; } $k = 0; } else { $c1 = substr( $buf, $i, 1 ); $o1 = ord( $c1 ); if( ( $o1 > 0x80 && $o1 <= 0x9F ) || ( $o1 >= 0xE0 && $o1 <= 0xFC ) ){ $k = 1; } else { $result .= $c1; } } } if ($pdc) { return $result; } else {return $pdc; } } #------------------------------------------------- # 時間を取得 #------------------------------------------------- sub get_time { $times = shift; if (!$times) { $ENV{'TZ'} = "JST-9"; $times = time; } ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime($times))[0..6]; @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min,$sec); } #------------------------------------------------- # カウンタ処理 #------------------------------------------------- sub counter { # 閲覧時のみカウントアップ if ($mode eq '') { $cntup=1; } else { $cntup=0; } # カウントファイルを読みこみ open(IN,"$cntfile") || &error("Open Error: $cntfile"); eval "flock(IN, 1);"; $data = ; close(IN); # IPチェックとログ破損チェック ($cnt, $ip) = split(/:/, $data); if ($addr eq "$ip" || $cnt eq "") { $cntup=0; } # カウントアップ if ($cntup) { $cnt++; open(OUT,"+< $cntfile") || &error("Write Error: $cntfile"); eval "flock(OUT, 2);"; truncate(OUT, 0); seek(OUT, 0, 0); print OUT "$cnt\:$addr"; close(OUT); } # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . $cnt; } @cnts = split(//, $cnt); # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#cnts) { print "\"$cnts[$_]\""; } } # テキストカウンタ表示 else { print "$cnt
\n"; } } #------------------------------------------------- # ロック処理 #------------------------------------------------- sub lock { # 古いロックは削除する if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time - 30) { &unlock; } } local($retry) = 5; # symlink関数式ロック if ($lockkey == 1) { while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } # mkdir関数式ロック } elsif ($lockkey == 2) { while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } } $lockflag=1; } #------------------------------------------------- # ロック解除 #------------------------------------------------- sub unlock { if ($lockkey == 1) { unlink($lockfile); } elsif ($lockkey == 2) { rmdir($lockfile); } $lockflag=0; } #------------------------------------------------- # メール送信 #------------------------------------------------- sub mail_to { local($mcom,$hp,$msub,$mbody); # メールタイトルを定義 $msub = &base64("[$title : $no] $in{'sub'}"); # 記事を復元 $mcom = $in{'comment'}; $mcom =~ s/
/\n/g; $mcom =~ s/<//g; $mcom =~ s/"/"/g; $mcom =~ s/&/&/g; # URL情報 if ($in{'url'}) { if ($in{'url'} !~ /^http\:\/\//) { $hp = "http://$in{'url'}"; } else { $hp = "$in{'url'}"; } } else { $hp = ""; } # メール本文を定義 $mbody = < $title EOM if ($bg) { print "\n"; } else { print "\n"; } } else { # 携帯用ヘッダ print "Content-type: text/html\n\n"; print "\n\n"; print "\n"; print "\n"; print "\n"; print "$title\n\n\n"; } } #------------------------------------------------- # 自動URLリンク #------------------------------------------------- sub auto_link { if ($comment_url) { $_[0] =~ s/http/ttp/g; $_[0] =~ s/([^=^\"]|^)(ttps?\:[\w\.\~\-\/\?\&\=\+\@\;\#\:\%\,]+)/$1h$2<\/a>/g; } else { $_[0] =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\+\@\;\#\:\%\,]+)/$1$2<\/a>/g; } # $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1$2<\/a>/g; } #------------------------------------------------- # 過去ログ生成 #------------------------------------------------- sub pastlog { local($past_flag)=0; # 過去NOを開く open(NO,"$nofile") || &error("Open Error : $nofile"); $count = ; close(NO); # 過去ログのファイル名を定義 $pastfile = "$pastdir$count\.dat"; # 過去ログを開く open(IN,"$pastfile") || &error("Open Error : $pastfile"); @past = ; close(IN); # 規定の行数をオーバーすると次ファイルを自動生成 if ($#past > $log_line) { $past_flag=1; # カウントファイル更新 $count++; open(NO,">$nofile") || &error("Write Error : $nofile"); print NO $count; close(NO); $pastfile = "$pastdir$count\.dat"; @past=(); } @temp=(); foreach (@data) { $pfile = ""; ($pno,$preno,$pdate,$pname,$pmail,$psub,$pcom,$purl,$pho,$ppw,$pcol,$ptail,$pw,$ph,$pchk,$ptm,$psml) = split(/<>/); if ($pmail && !$psml) { $pname = "$pname"; } if ($purl) { if ($purl !~ /^http\:\/\//) { $purl = "http://$purl"; } $purl = "<HOME>"; } $pnum = $pno; if ($preno) { $pno = "Res: $preno"; } if ($pastlogfile) { if (-e "$imgdir$pno$ptail") { $pfile = "

添付ファイル"; } } # 保存記事をフォーマット push(@temp,"


[$pno] $psub 投稿者:$pname 投稿日:$pdate $purl
$pcom$pfile
\n"); } # 過去ログのパーミッション設定 unless (-r $pastfile && -w $pastfile) { chmod(0666, $pastfile); } # 過去ログを更新 unshift(@past,@temp); open(OUT,">$pastfile") || &error("Write Error : $pastfile"); print OUT @past; close(OUT); if ($past_flag) { chmod(0666,$pastfile); } } #------------------------------------------------- # 過去ログ #------------------------------------------------- sub past { open(IN,"$nofile") || &error("Open Error : $nofile"); $pastno = ; close(IN); if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; } &header; print <<"EOM"; [掲示板に戻る]
過去ログ[$in{'pastlog'}]

\n"; print "\n"; print "
過去ログ:\n
\n"; print "
\n"; print "\n"; print "\n"; print "ワード検索:\n"; print "条件:\n"; print "表\示:\n
\n"; # 表示ログを定義 $in{'pastlog'} =~ s/\D//g; $file = "$pastdir$in{'pastlog'}\.dat"; # ワード検索処理 if ($in{'word'} ne "") { $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); @new=(); open(IN,"$file") || &error("Open Error : $file"); while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; $enwd = &url_enc($in{'word'}); if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } # 表示開始 # foreach ($page .. $page_end) { print $new[$_]; } foreach ($page .. $page_end) { # メールアドレスのJavascript表示 $new[$_] =~ s/()(.+)(<\/a><\/b>)/\n"; } else { print "\n"; } ## フォーム種別を判別 # 修正 if ($type eq "edit") { print "\n"; print "\n"; print "\n"; print "\n"; $cnam = $name; $ceml = $mail; $curl = $url; $ccol = $color; # 返信 } elsif ($type eq "res") { print "\n"; print "\n"; ($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba) = &get_cookie; if ($curl && $curl !~ /^http\:\/\//) { $curl = "http://$curl"; } # 新規 } else { print "\n"; ($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba) = &get_cookie; if ($curl && $curl !~ /^http\:\/\//) { $curl = "http://$curl"; } $com = "$inputform"; } print <<"EOM"; EOM if ($aikotoba) { print "\n \n \n"; if ($caikotoba ne $aikotoba) { print "\n \n\n"; } } print < EOM # 添付フォーム # if ($type eq "" || ($type eq "res" && $res_clip)) { # print "\n"; # print "\n"; # } if (!$tail || ($type eq "res" && $res_clip)) { print "\n", "\n"; } # パスワード欄 if ($type ne "edit") { print ""; print "\n"; } # 色指定 print "\n
おなまえ
合い言葉", "", "※必須
$hint
Eメール EOM print "\n"; if ($in_email) { print "必須\n"; } elsif ($no_email eq '1') { print "メールアドレスは入力禁止\n"; } elsif ($no_email eq '2') { print "入力する場合には必ず@を全角で書いて下さい\n"; } print <
タイトル
体験談 EOM if ($comment_url) { print "【コメント内のURLは先頭のhを抜いて書き込んで下さい。】"; } print <
EOM $f_c_d = int(rand(5E07)) + 11E08; if ($urlcheck) { print " 体験談内には下記と同じURLを書き込まないで下さい\n"; } print <
URL
添付File
添付File ($imagesizeまで)
暗証キー "; print "(英数字で8文字以内)
文字色\n"; @col = split(/\s+/, $colors); if ($ccol eq "") { $ccol = $col[0]; } foreach (@col) { if ($ccol eq $_) { print "\n"; } else { print "\n"; } } print "
\n"; if (!$referercheck || $ENV{'HTTP_REFERER'}) { if ($type ne "edit") { print " \n"; } if ($javascriptpost) { print "\n\n"; } else { print ""; } } else { print "
\n掲示板へ直接アクセスした場合には投稿できません。", "トップページから入り直してください。\n"; } print "
\n"; if ($ImageCheck) { print "・画像は管理者が許可するまで「COMING SOON」のアイコンが表\示されます。
\n"; } print "\n"; } #------------------------------------------------- # 禁止ワード #------------------------------------------------- sub deny_word { local($word) = @_; local($flg); foreach ( split(/,+/, $deny_word) ) { if (index($word,$_) >= 0) { $flg=1; last; } } if ($flg) { &error("不適切な投稿のため受理できません"); } } #------------------------------------------------- # スパム拡張オプションチェック #------------------------------------------------- sub option_check { local ($pw,$em,$cm,$ur) = @_; # メールアドレスをチェック if ($no_email == 1 && $em) { &error("メールアドレスは入力禁止です。"); } if ($no_email == 2 && $em && $em!~ /^[\w\.\-]+@[\w\.\-]+\.[a-zA-Z]{2,6}$/) { &error("アットマーク @ は全角で入力して下さい。"); } # URLの直接書き込みをチェック if ($comment_url) { $urlnum = ($cm =~ s/http/http/i); if ($urlnum) { &error("URLは先頭のhを抜いて書き込んで下さい。"); } } # URL転送・短縮URLをチェック $shorturlcheck = 0; if ($shorturl) { if ($cm =~ /https?\:\/\/[\w\-]{1,10}?\.[\w\-]{2,5}?\//i || $ur =~ /https?\:\/\/[\w\-]{1,10}?\.[\w\-]{2,5}?\//i) { local($html) = $'; if ($html =~ /^[\w\?]+?/) { if ($html !~ /^index\.htm/i) { $shorturlcheck = 1; } } } if (!$shorturlcheck) { if ($cm =~ /https?\:\/\/([\w\-]{1,5}\.)?(\d+)\.[a-z]{2,4}\/?/i || $ur =~ /https?\:\/\/([\w\-]{1,5}\.)?(\d+)\.[a-z]{2,4}\/?/i) { $shorturlcheck = 2; } } if ($shorturlcheck) { &error("URLの記載は禁止されています。"); } } } #------------------------------------------------- # スパムチェック #------------------------------------------------- sub spam_check{ local ($na,$u2,$bt,$cm,$re,$ur,$em,$sb,$ad,$fc,$cn,$sb2,$sb3,$sb4,$lng,$ua) = @_; $reason = "公開許可待ち"; $spam = 0; if ($u2 || $sb2 || $sb3 || $sb4) { $spam=1; $reason = "プログラム投稿(非ブラウザ)"; } if (!$spam) { if (!$bt || !$fc || !$ad) { $spam=1; $reason = "プログラム投稿(非フォーム投稿)"; } } if(!$spam) { if($ipcheckmode) { local($enadr) = &encode_addr($addr); if ($ad ne $enadr) { $spam=1; $reason = "プログラム投稿(IP不一致)"; } } else { if ($ad =~ /\@/) { $spam=1; $reason = "プログラム投稿(IPデータ不正)"; } } } if (!$spam) { local($posttime2) = time; local($timecheck2) = $posttime2 - $bt; if ($timecheck2 < 0) { $timecheck2 = 0 - $timecheck2; } if ($mintime && $timecheck2 < $mintime) { $spam=1; $reason = "プログラム投稿(投稿まで$timecheck2秒)"; } if (!$cn || !$cookiecheck) { if ($maxtime && $timecheck2 > $maxtime) { $spam=1; $reason = "プログラム投稿(投稿まで$timecheck2秒)"; } } } # 日本語環境チェック if (!$spam) { if ($japanese) { if ($lng !~ /ja/i && $ua !~ /ja/i) { $spam=1; $reason = "不正ブラウザ(非日本語環境)"; } } } # 携帯除外 if(!$keitaicheck && $keitai ne 'p') { $spam = 0; } if(!$spam) { if ($em && $em =~ /https?\:\/\//) { $spam=1; $reason = "プログラム投稿(email/URL不正)"; } } if(!$spam) { if ($ur && $ur =~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) { $spam=1; $reason = "プログラム投稿(email/URL不正)"; } } if(!$spam) { if (length($cm)*2 < length($na)) { &error("コメント・メッセージが短すぎます。"); } } if(!$spam) { if ($na =~ /https?\:\/\//i) { $spam=1; $reason = "プログラム投稿(name/comment不正)"; } } # スパム投稿チェック(多数URL記述対応) if (!$spam) { $urlnum = ($cm =~ s/http/http/ig); if ($spamurlnum && ($urlnum >= $spamurlnum)) { $spam=1; $reason = "URLの書き込みが$urlnum個"; } } # URL以外の文字数をチェック if(!$spam) { if ($characheck) { if ($cm =~ /(https?\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+\@\,]+)/ || $ur) { local($charamsg) = $cm; $charamsg =~ s/(https?\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+\@\,]+)//g; $charamsg =~ s/[\s\n\r\t]//g; $charamsg =~ s/
//ig; $msgnum = length($charamsg); if ($msgnum < $characheck) { $spam=1; $reason = "コメントの文字数が$msgnumバイトと少ない"; } } } } # 全角文字(日本語)チェック if(!$spam) { if ($asciicheck) { if ($cm !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) { $spam=1; $reason = "コメントに日本語(ひらがな/カタカナ)がない"; } } } if(!$spam) { if (-e $spamdata) { if ($spamdatacheck || !$re) { # 禁止URLデータをロード open(SPAM,"$spamdata") || &error("Open Error : $spamdata"); $SPM = ; close(SPAM); # 禁止URLの書き込みをチェック foreach (split(/\,/, $SPM)) { if(length($_) > 1) { if ($cm =~ /\Q$_\E/i) { $spam=1; $reason = "名前/コメント内に禁止語句$_を含む投稿"; last; } if (!$spam && $na =~ /\Q$_\E/i) { $spam=1; $reason = "名前/コメント内に禁止語句$_を含む投稿"; last; } if (!$spam && $ur =~ /\Q$_\E/i) { $spam=1; $reason = "URLに禁止語句$_を含む投稿"; last; } if (!$spam && $ngmail && $em =~ /\Q$_\E/i) { $spam=1; $reason = "メールアドレスに禁止語句$_を含む投稿"; last; } if (!$spam && $ngtitle && $sb =~ /\Q$_\E/i) { $spam=1; $reason = "タイトルに禁止語句$_を含む投稿"; last; } } } } } } if(!$spam) { if ($urlcheck) { if ($urlcheck eq 2 || !$re) { # URLのコメントへの重複書き込みをチェック if($ur) { $ur =~ s/\/$//; if ($cm =~ /\Q$ur\E/i) { if ($' !~ /(^\/?[\w\?]+?)/) { $spam=1; $reason = "コメント内にURL欄と同じURLを含む投稿"; } } } } } } return ($spam,$reason); } #------------------------------------------------- # スパムログ記録 #------------------------------------------------- sub write_spamlog { local($log_times,$num); local($log_comment) = $in{'comment'}; local($log_name) = $in{'name'}; local($log_email) = $in{'email'}; local($log_url) = $in{'url'}; if (length($log_comment) < length($log_name)) { ($log_comment,$log_name) = ($log_name,$log_comment); } if ($log_url =~ /\@/ || $log_email && $log_email !~ /\@/) { ($log_email,$log_url)=($log_url,$log_email); } $num = ($log_comment =~ s/http/http/ig); if($num >= $maxurl) { $log_comment ="メッセージ内のURL数が$num個と多いため、メッセージ本文削除"; } $log_comment =~ s/"/"/g; $times = time; if (!$in{"$bbscheckmode"}) { $log_times = $times; } else { $log_times = $in{"$bbscheckmode"}; } push (@spamlog,"$no<>$in{'reno'}<>$date<>$log_name<>$log_email<>$in{'sub'}<>$log_comment<>$log_url<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>$times<>$in{'smail'}<>$reason<>$log_times<>$ENV{'HTTP_REFERER'}<>$ENV{'HTTP_USER_AGENT'}<>$ENV{'HTTP_ACCEPT'}<>$ENV{'HTTP_ACCEPT_CHARSET'}<>$ENV{'HTTP_ACCEPT_ENCODING'}<>$ENV{'HTTP_ACCEPT_LANGUAGE'}<>$in{'mail'}<>$times<>\n"); if($tail) { rename ("$imgdir$no$tail","$imgdir$in{\"$bbscheckmode\"}$tail"); } if (-e $spamlogfile) { open(OUT,">>$spamlogfile") || &error("Write Error"); print OUT @spamlog; close(OUT); } else { open(OUT,">$spamlogfile"); chmod (0606,"$spamlogfile"); print OUT @spamlog; close(OUT); } # 古いスパムログを削除 if ($spamlog_max) { while ((-s $spamlogfile) > $spamlog_maxfile ) { open(IN,"$spamlogfile") || &error("Open Error : >$spamlogfile"); @spamlog = ; close(IN); shift(@spamlog); open(OUT,">$spamlogfile") || &error("Write Error : $spamlogfile"); print OUT @spamlog; close(OUT); } } # ロック解除 &unlock if ($lockkey); } #------------------------------------------------- # スパムログ削除 #------------------------------------------------- sub del_spamlog { local($checktime) = shift; $i=0; $flag=0; @newspm = (); open(IN,"$spamlogfile") || &error("Open Error: $spamlogfile"); while () { chomp; $i++; local ($no,$reno,$date,$name,$email,$sub,$msg,$url,$host,$ango,$color,$tail,$W,$H,$chk, $tim,$sml,$reason,$fcheck,$referer,$useragent) = split(/<>/); if ($fcheck eq $checktime) { $flag=1; $_ = ""; } else { $_ = "$no<>$reno<>$date<>$name<>$email<>$sub<>$msg<>$url<>$host<>$ango<>$color<>$tail<>$W<>$H<>$chk<>$tim<>$sml<>$reason<>$fcheck<>$referer<>$useragent<>\n"; } push(@newspm,"$_"); } close(IN); open(OUT,">$spamlogfile") || &error("Write Error : $spamlogfile"); print OUT @newspm; close(OUT); } #------------------------------------------------- # プレビューチェック #------------------------------------------------- sub previewcheck { $in{"$bbscheckmode"} = &decode_bbsmode($in{"$bbscheckmode"}); if ($mode eq "$writevalue") { # if ($keychange) { ($in{'email'},$in{'url'})=($in{'url'},$in{'email'}); # ($in{'comment'},$in{'name'}) = ($in{'name'},$in{'comment'}); } if ($previewtime) { if ($in{'pview'} ne "on") { local($posttime) = time; $timecheck = $posttime - $in{"$bbscheckmode"}; if ($timecheck < 0) { $timecheck2 = 0 - $timecheck; } if ($timecheck <= $maxtime) { if ($timecheck > $previewmax) { $mode = "previewmode"; } } if ($timecheck >= $mintime) { if ($timecheck < $previewmin) { $mode = "previewmode"; } } } } } } #------------------------------------------------- # プレビュー画面 #------------------------------------------------- sub previewmode { local($timecheck) = shift; $time = time; $date = &get_time($time); if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); } $reason = "プレビューモードトラップ($timecheck秒)"; # プレビューログの記録 if ($spamlog) { &write_spamlog; } # ファイル添付処理 if ($in{'upfile'}) { $no = $in{"$bbscheckmode"}; ($tail,$W,$H) = &upload; } $in{"$bbscheckmode"} = &encode_bbsmode($in{"$bbscheckmode"}); &header; print < EOM $in{'name'} =~ s/"/"/g; $in{'sub'} =~ s/"/"/g; $in{'comment'} =~ s/"/"/g; # URL if ($in{'url'} eq "http://") { $in{'url'} = ""; } # 日本語チェック if ($in{'comment'} =~ /(\x82[\x9F-\xF2])/) { $checked0 = "checked"; $checked1 = ""; $in{'url'} =~ s/\/$//; $in{'email'} =~ s/\/$//; # URL重複チェック if ($in{'url'} && $in{'comment'} =~ /\Q$in{'url'}\E/i || $in{'email'} && $in{'comment'} =~ /\Q$in{'email'}\E/i) { if ($' !~ /(^\/?[\w\?]+?)/) { $checked0 = ""; $checked1 = "checked"; } } } else { $checked0 = ""; $checked1 = "checked"; } if ($keitai eq 'p') { print < ▼ 内容を確認し、"投稿する"をチェックして投稿して下さい。

お名前 $in{'name'}
Eメール $in{'email'}
タイトル $in{'sub'}
参照先 $in{'url'}
メッセージ
$in{'comment'}

投稿する   投稿をやめる
EOM } else { print < おなまえ: $in{'name'}
題名: $in{'sub'}
Eメール: $in{'email'}
体験談
$in{'comment'}


投稿する
投稿をやめる
EOM } exit; } #------------------------------------------------- # フォームチェックデータ符号化 #------------------------------------------------- sub encode_bbsmode { local($fck) = shift; if(!$fck) { $fck = time; } if($fcencode) { srand; local($en) = rand(4); $en++; $en = int($en); if ($en%2) { $fck = sprintf("%X", $fck); } else { $fck = sprintf("%x", $fck); } if ($en == 1) { $fck =~ tr/[0-9]/[g-p]/; } elsif ($en == 2) { $fck =~ tr/[0-9]/[q-z]/; } elsif ($en == 3) { $fck =~ tr/[0-9]/[G-P]/; } elsif ($en == 4) { $fck =~ tr/[0-9]/[Q-Z]/; } $fck = reverse($fck); } return $fck; } #------------------------------------------------- # フォームチェックデータ復号 #------------------------------------------------- sub decode_bbsmode { local($fck) = shift; $fck2 = $fck; if ($fck =~ /[a-z]/i) { $fck = reverse($fck); $fck =~ tr/[g-p]/[0-9]/; $fck =~ tr/[q-z]/[0-9]/; $fck =~ tr/[G-P]/[0-9]/; $fck =~ tr/[Q-Z]/[0-9]/; $fck = sprintf("%d", hex($fck)); } if($fck < 0) { $fck = $fck2; } return $fck; } #------------------------------------------------- # アドレス暗号化 #------------------------------------------------- sub encode_addr { local ($adr,$i); $adr = shift; if (!$adr) { $adr = $addr; } $i=0; foreach (split(/\./, $adr)) { $addr[$i] = sprintf("%02x", $_); $i++; } $enadr = substr(crypt(join('',@addr), $addr[0]), 2); return $enadr; } #------------------------------------------------- # スパムログ #------------------------------------------------- sub spam { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } &header; print <
  • $postmodeログ
    「投稿処理」をクリックすると投稿を公開することができます。
    必用な投稿を復活させたあとは、「$postmodeログを全て削除」しておいて下さい。
    EOM open(IN,"$spamlogfile") || &error("Open Error : $spamlogfile"); $i=0; while () { local ($no,$reno,$date,$name,$email,$sub,$msg,$url,$host,$ango,$color,$tail,$W,$H,$chk, $tim,$sml,$reason,$fcheck,$referer,$useragent) = split(/<>/); $reno{$i} = $reno; $date{$i} = $date; $pdate{$i} = &get_time($tim); $name{$i} = $name; $email{$i} = $email; $sub{$i} = $sub; $msg{$i} = $msg; $url{$i} = $url; $host{$i} = $host; $ango{$i} = $ango; $color{$i} = $color; $tail{$i} = $tail; $W{$i} = $W; $H{$i} = $H; $chk{$i} = $chk; $sml{$i} = $sml; $reason{$i} = $reason; $tim{$i} = $tim; $uploadtime{$i} = $fcheck; $timecheck{$i} = &encode_bbsmode($fcheck); if ($fcheck) { $fcheck{$i} = &get_time($fcheck); } else { $fcheck{$i} = "アクセス記録なし"; } $useragent{$i} = $useragent; if ($keychange) { if ($url{$i} && $url{$i} =~ /\@/) { ($email{$i},$url{$i})=($url{$i},$email{$i}); } elsif ($email{$i} && $email{$i} !~ /\@/) { ($email{$i},$url{$i})=($url{$i},$email{$i}); } } $i++; } close(IN); # ソート処理 $j=0; $x=0; $page = $in{'page'}; foreach (sort { ($date{$b} cmp $date{$a}) } keys(%date)) { $j++; if ($j < $page + 1) { next; } if ($j > $page + $spamlog_page) { next; } $useragent = "$useragents"; print "

    \n"; print "", "", "", "", "
    投稿日時$pdate{$_}タイトル$sub{$_}
    アクセス日時$fcheck{$_}$alreason$reason{$_}
    投稿者名$name{$_}URL$url{$_}
    ホストアドレス$host{$_}ブラウザ$useragent{$_}
    メールアドレス$email{$_}投稿内容 "; print <
    (上記の投稿を公開することができます)
    EOM } print "
    \n"; $next = $page + $spamlog_page; $back = $page - $spamlog_page; print "\n"; if ($back >= 0) { print "\n"; } if ($next < $i) { print "\n"; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print < EOM exit; } #------------------------------------------------- # 投稿拒否ログ初期化 #------------------------------------------------- sub spamclear { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } # 添付ファイルの削除 open(IN,"$spamlogfile") || &error("Open Error : $spamlogfile"); while () { local ($no,$reno,$date,$name,$email,$sub,$msg,$url,$host,$ango,$color,$tail,$W,$H,$chk, $tim,$sml,$reason,$fcheck,$referer,$useragent) = split(/<>/); if ($tail) { if (-e "$imgdir$fcheck$tail") { unlink("$imgdir$fcheck$tail"); } if (-e"$imgdir$fcheck"."s"."$tail") { unlink("$imgdir$fcheck"."s"."$tail"); } } } close(IN); # 投稿拒否ログの初期化 open(OUT,">$spamlogfile"); chmod (0606,"$spamlogfile"); print OUT ""; close(OUT); &header(); print <

    $postmodeログを削除しました

    EOM exit; } #------------------------------------------------- # 投稿拒否コメント #------------------------------------------------- sub spammsg { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } # エスケープ $in{'msg'} =~ s/"/"/g; $in{'msg'} =~ s//>/g; # 改行処理 $in{'msg'} =~ s/<br>/
    /ig; &header(); print <

    コメント

    $in{'msg'}

    EOM exit; } #------------------------------------------------- # NGワード編集 #------------------------------------------------- sub spamdata { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } &header; print <

  • NGワードを一括登録できます(半角のカンマで区切る)。
    たとえば http://www.example.com/sample/inde.cgi?mode=test
    拒否したい場合は www.example.com を登録します。
    EOM if (-e $spamdata) { open(IN,"$spamdata"); $SPMLST = ; close(IN); } print <$SPMLST

EOM exit; } #------------------------------------------------- # NGワード更新 #------------------------------------------------- sub editspam { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } $SPMLST = $in{"SPMLST"}; # 空データ・改行・空白を削除 $SPMLST =~ s/,/\,/g; $SPMLST =~ s/
//ig; $SPMLST =~ s/\n//g; $SPMLST =~ s/\r//g; $SPMLST =~ s/ //g; $SPMLST =~ s/\,{2,}/\,/g; $SPMLST =~ s/^\,{1,}//; open(OUT,">$spamdata") || &error("Write Error"); print OUT $SPMLST; close(OUT); &header; print <

NGワードを更新しました


EOM exit; } #------------------------------------------------- # 管理者再投稿画面 #------------------------------------------------- sub admin_repost_form { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } $in{'msg'} =~ s/
/\n/g; $in{'msg'} =~ s/<br>/\n/g; $in{"$bbscheckmode"} = &encode_bbsmode($in{"$bbscheckmode"}); $f_c_d = int(rand(5E07)) + 11E08; &header; print <下記の投稿を公開処理できます。
$alreason : $in{'reason'}

お名前 : 
Eメール : 
タイトル : 
メッセージ
参照先 : 
EOM exit; } #------------------------------------------------- # アクセス制限チェック #------------------------------------------------- sub spambot { open(IN, "$denyfile"); local($deny) = ; close (IN); local($flag) = 0; local(@denyip) = split(/\,/, $deny); foreach $denyip (@denyip) { if(length($denyip) > 7) { $denyip =~ s/\./\\\./g; $denyip =~ s/\*/\.\*/g; if ($addr =~ /^$denyip/) { $flag = 1; last; } } } if($flag) { &access_error; } } #------------------------------------------------- # アクセストラップエラー #------------------------------------------------- sub access_error { $script =~ s/^\.//; print "Content-type: text/html\n\n"; print < 404 Not Found

Not Found

The requested URL $script was not found on this server.


Apache/1.3.34 Server at $ENV{'HTTP_HOST'} Port 80
EOM exit; } #------------------------------------------------- # 投稿制限 #------------------------------------------------- sub post_check { # IPチェック local($flg); foreach ( split(/\,/, $daddr) ) { s/\./\\\./g; s/\*/\.\*/g; if ($addr =~ /^$_/i) { $flg = 1; last; } } if (!$flg) { # hostチェック foreach ( split(/\,/, $dhost) ) { s/\./\\\./g; s/\*/\.\*/g; if ($host =~ /$_$/i) { $flg = 1; last; } } } if ($flg) { &write_spamlog; &message("$denymsg"); } } #------------------# # JavaScript無効 # #------------------# sub noscript { &header; print <<"EOM";
JavaScriptを利用したメールアドレス表\示について

スパム(一方的迷惑メール)およびウイルス対策のため、JavaScriptを利用したメールアドレス表\示を採用しています。
お手数をおかけしますが、投稿者のメールアドレスを表\示させるためには、JavaScriptを有効にしてください。



EOM exit; } # Exif情報の削除--------------------- # http://cachu.xrea.jp/index.html # ImgResize.pm より引用 Added by isso sub JPEGCommentCut{ my ( $out ) = @_; my ( $tmp, $mark, $buf, $type1, $type2, $fpos, $f_size ); my $id = 0; $tmp = $out . '_tmp'; $mark = pack( "C", 0xFF ); open( IN, $out ); open( OUT, ">$tmp" ); binmode( IN ); binmode( OUT ); read( IN, $buf, 2 ); print OUT $buf; ( $type1, $type2 ) = unpack( "C*", $buf ); $fpos = 2; if( $type1 == 0xFF && $type2 == 0xD8 ){ JPEG: while( read( IN, $type1, 1 ) ){ $fpos++; if( ( $type1 eq $mark ) && read( IN, $buf, 3 ) ){ $fpos += 3; $type2 = unpack( "C*", substr( $buf, 0, 1 ) ); $f_size = unpack( "n*", substr( $buf, 1, 2 ) ); # カットするマーカー。現在は APP1, APP2 if( $type2 == 0xE1 || $type2 == 0xE2 ){ seek( IN, $f_size-2, 1); $id = 1; # FFDA が来たら後は全部書出す }elsif( $type2 == 0xDA ){ print OUT $type1; print OUT $buf; print OUT $buf while( read( IN, $buf, 16384 ) ); # 単独のマーカー }elsif( $type2 == 0xD0 || $type2 == 0xD1 || $type2 == 0xD2 || $type2 == 0xD3 || $type2 == 0xD4 || $type2 == 0xD5 || $type2 == 0xD6 || $type2 == 0xD7 || $type2 == 0x01 ){ print OUT $type1; print OUT $buf; }else{ print OUT $type1; print OUT $buf; read( IN, $buf, $f_size-2 ); print OUT $buf; } }else{ print OUT $type1; } } } close( IN ); close( OUT ); if( $id == 1 ){ rename( $tmp, $out ); } unlink( $tmp ); } #----------------------# # メール作成フォーム # #----------------------# sub writemail { # クッキーを取得 local($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba) = &get_cookie; $flag=0; @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$date,$name,$mail,$sub,$comment,$url,$ho,$pw,$color,$tail,$w,$h,$chk,$tm,$sml) = split(/<>/); if ($in{'oya'} == $oya) { push(@new,$_); } elsif ($flag && $in{'oya'} != $oya) { last; } if ($in{'no'} == $no) { $flag=1; $s_name = $name; $s_email = $mail; $s_smail = $sml; $s_msg = $comment; $s_sub = $sub; $s_no = $no; } } close(IN); if (!$webmail || $s_smail ne "1" || $s_email eq "") { &error("不正なアクセスです。"); } $in{'no'} = $s_no; # コメントメッセージ $res_msg = "\n\> $s_msg"; $res_msg =~ s/&/&/g; $res_msg =~ s/
/\r> /g; # コメントタイトル $res_sub = $s_sub; $res_sub =~ s/<([^>]|\n)*>//g; $in{'sub'} = $res_sub; $in{'comment'} = $res_msg; # sendmailチェック open(OUT,">$mailchk$host") || &error("$mailchkディレクトリを作成してください。"); print OUT $host; close(OUT); # HTMLを出力 &header; print "
\n"; if ($t_img) { print "\"$title\"\n"; } else { print "$title\n"; } my $access = &encode_bbsmode(); my $enaddress = &encode_addr(); if ($keychange) { $url_key = 'email'; $mail_key = 'url'; $name_key = 'comment'; $comment_key = 'name'; } else { $url_key = 'url'; $mail_key = 'email'; $name_key = 'name'; $comment_key = 'comment'; } print <<"EOM";



- 下記の内容で投稿者 $s_name さんにメールを送信します。 -
なお、いたずらメール防止のため、メール本文以外の送信情報を記録しております。

タイトル
おなまえ ※必須
Eメール ※必須
メッセージ   
入力禁止欄  (スパム対策)



EOM exit; } #----------------------# # メール送信ルーチン # #----------------------# sub sendmail { $s_smail = ""; $s_email = ""; # POST限定 if ($MethPost && !$post_flag) { &error("不正なアクセスです"); } if ( (-e "$mailchk$host") ) { unlink("$mailchk$host") ;} else { &error("送信できません。"); } $flag=0; @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$date,$name,$mail,$sub,$comment,$url,$ho,$pw,$color,$tail,$w,$h,$chk,$tm,$sml) = split(/<>/); if ($in{'oya'} == $oya) { push(@new,$_); } elsif ($flag && $in{'oya'} != $oya) { last; } if ($in{'no'} == $no) { $flag=1; $s_email = $mail; $s_smail = $sml; $s_name = $name; } } close(IN); if (!$webmail || $s_smail ne "1" || $s_email eq "") { &error("送信できません。"); } if ($in{'email'} eq "" || $in{'name'} eq "") { &error("E-Mailとおなまえの入力は必須です。"); } # E-Mail入力 if ($in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,3}/) { &error("E-Mailの入力が不正です"); } # スパム送信対策 $in{"$bbscheckmode"} = &decode_bbsmode($in{"$bbscheckmode"}); my $enadr = &encode_addr($addr); if($ipcheckmode) { if ($in{'mail'} ne $enadr) { &error("接続ホスト情報が不正なため送信できませんでした。"); } } else { if ($in{'mail'} =~ /\@/) { &error("入力内容が不正なため送信できませんでした。"); } } my $posttime2 = time; my $timecheck2 = abs($posttime2 - $in{"$bbscheckmode"}); if ($timecheck2 < 5) { &error("不正な送信は禁止されています。"); } if ($timecheck2 > 18000) { &error("不正な送信は禁止されています。"); } if ($in{'url'} || $in{'subject'} || $in{'title'} || $in{'name'} =~ /https?\:\/\//i) { &error("入力内容が不正なため送信できませんでした。"); } if (length($in{'comment'}) < length($in{'name'})) { &error("メッセージが短すぎるため送信できませんでした。"); } if ($in{'comment'} !~ /(\x82[\x9F-\xF2])/) { &error("日本語での入力が必須です。(Japanese Only)"); } # メール送信ログ $times = time; push (@maillog,"$times<>$in{'name'}<>$in{'email'}<>$s_name<>$s_email<>$host<>\n"); if (-e "$mailchk$sendmaillog") { open(OUT,">>$mailchk$sendmaillog") || &error("Write Error"); print OUT @maillog; } else { open(OUT,">$mailchk$sendmaillog"); chmod (0606,"$mailchk$sendmaillog"); print OUT @maillog; } # メールタイトル $MailSub = "$in{'sub'}"; #メール受信者アドレス $s_email = "$s_name <$s_email>"; #メール送信者アドレス $Mailfrom = "$in{'name'} <$in{'email'}>"; # メール本文のタグ・改行を復元 $comment = $in{'comment'}; $comment =~ s/<//g; $comment =~ s/&/&/g; $comment =~ s/
/\n/g; # メール本文 $MailBody = <<"EOM"; 「$title」の投稿に対する $in{'name'} さんから のメールです。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ $comment ____________________________________ EOM &jcode'convert(*MailSub,'jis'); &jcode'convert(*MailBody,'jis'); $s_email = &mimeencode($s_email); $Mailfrom = &mimeencode($Mailfrom); open(MAIL,"| $sendmail -t") || &error("メール送信に失敗しました"); print MAIL "Received: from Joyful Note.$mode ($host [$addr]) by $ENV{'SERVER_NAME'} ($ver)\n"; print MAIL "To: $s_email\n"; print MAIL "From: $Mailfrom\n"; print MAIL "Errors-To: $mailto\n"; print MAIL "Subject: $MailSub\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "$MailBody\n"; close(MAIL); &header; print "
\n"; if ($t_img) { print "\"$title\"\n"; } else { print "$title\n"; } print <<"EOM";


$s_name さんへ宛にメールが送信されました






EOM exit; } #-------------------# # Webmail送信ログ # #-------------------# sub sendmaillog { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } &header; print <Webmail送信ログ

Webmailを利用したメール送信記録です。 \n EOM if(-e "$mailchk$sendmaillog") { open(IN,"$mailchk$sendmaillog") || &error("Open Error : $mailchk$sendmaillog"); $i=0; while () { my ($dat,$nam,$em,$to,$sem,$hos) = split(/<>/); $dat{$i} = $dat; $nam{$i} = $nam; $em{$i} = $em; $to{$i} = $to; $sem{$i} = $sem; $hos{$i} = $hos; $date{$i} = &get_time($dat{$_}); $i++; } close(IN); foreach (sort { ($dat{$b} cmp $dat{$a}) } keys(%dat)) { print "", ""; } } print <
EOM exit; } #------------------# # 送信記録を削除 # #------------------# sub maillogclear { # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } unlink("$mailchk$sendmaillog"); &header; print <Webmail送信ログを削除しました。

日時送信者名送信者メールアドレス 送信元ホストアドレス受信者名受信者メールアドレス
$date{$_}$nam{$_}$em{$_}$hos{$_}$to{$_}$sem{$_}
EOM exit; } #------------------------------------------------- # 記事番号検索 #------------------------------------------------- sub search { local($ipt,$wh,$i,$flag,$author); local($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba) = &get_cookie; &set_cookie($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$csmail,$caikotoba); # ヘッダを出力 &header; # カウンタ処理 if ($counter) { &counter; } # タイトル部 print "

\n"; if ($banner1 ne "") { print "$banner1

\n"; } if ($t_img eq '') { print "$title\n"; } else { print "\"$title\"\n"; } # メニュー部 print "


\n"; print "[トップに戻る]\n"; print "[掲示板に戻る]\n"; print "[留意事項]\n"; print "[ワード検索]\n"; print "[過去ログ]\n" if ($pastkey); print "[管理用]\n"; print "
\n"; print "
\n"; print "[ 指定コメント(No\.$in{'num'})の関連スレッドを表\示しています。 ]\n"; # 記事親番号検索 open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { chomp; ($no,$reno) = split(/<>/); if ($in{'num'} eq $no) { if (!$reno) { $hitnum = $no; } else { $hitnum = $reno; } } } close(IN); # 記事スレッド検索 $i=0; $flag=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { chomp; ($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$tail,$w,$h,$chk,$tm,$sml) = split(/<>/); if ($no eq $hitnum || $reno eq $hitnum) { $no{$i} = $no; $reno{$i} = $reno; $date{$i} = $date; $name{$i} = $name; $mail{$i} = $mail; $sub{$i} = $sub; $comment{$i} = $comment; $url{$i} = $url; $host{$i} = $host; $pw{$i} = $pw; $color{$i} = $color; $tail{$i} = $tail; $w{$i} = $w; $h{$i} = $h; $chk{$i} = $chk; $tim{$i} = $tim; $sml{$i} = $sml; $i++; } } close(IN); # ソート処理 $j=0; foreach (sort { ($date{$a} cmp $date{$b}) } keys(%date)) { $j++; # 題名の長さ if (length($sub{$_}) > $sub_len*2) { $sub{$_} = substr($sub{$_},0,$sub_len*2); $sub{$_} .= "..."; } $author{$_} = $name{$_}; if ($sml{$_}) { if ($webmail) { $name0 = $name{$_}; $nam = "$name0"; $namlength = length($nam); $spnum = int($namlength/4); $nam0= substr ($nam, 0, $spnum); $nam1= substr ($nam, $spnum, $spnum); $nam2= substr ($nam, $spnum+$spnum, $spnum); $nam3= substr ($nam, $spnum+$spnum+$spnum); $name{$_}="\n\n"; } } elsif ($keitai eq "p" && $mail{$_}) { ($em0,$em1) = split(/\@/,$mail{$_}); $em1 =~ s/\./&\#46\;/g; $name{$_} = "\n". "\n"; } if ($home_icon && $url{$_}) { if ($url{$_} !~ /^http\:\/\//) { $url{$_} = "http://$url{$_}"; } $url{$_} = "HomePage"; } elsif (!$home_icon && $url{$_}) { if ($url{$_} !~ /^http\:\/\//) { $url{$_} = "http://$url{$_}"; } $url{$_} = "<HOME>"; } if (!$reno{$_}) { print "

\n"; $flag=1; } if (!$reno{$_}) { print "
\n"; $flag=1; } if ($reno{$_}) { print "
\n"; } print "\n"; if ($reno{$_}) { print ""; } print ""; print "\n"; } else { print "
\n"; } print "

$sub{$_} "; if (!$reno{$_}) { print "投稿者:$name{$_} 投稿日:$date{$_} "; } else { print "$name{$_} - $date{$_} "; } print "No.$no{$_}   $url{$_} \n"; if (!$reno{$_}) { print "
\n"; print "\n"; print "\n"; print "
\n"; if ($reno{$_}) { print "\n"; } print "

"; if (!$reno{$_}) { print "
\n"; } # 自動リンク if ($autolink) { &auto_link($comment{$_}); } if ($imgpoint == 1) { $ipt="align=left hspace=18"; } else { $ipt=""; print "$comment{$_}"; } # 添付ファイルが存在する場合 if ($tail{$_} eq ".gif" || $tail{$_} eq ".jpg" || $tail{$_} eq ".png") { if ($ImageCheck && $chk{$_} != 1) { print "

\n"; } else { if ($w{$_} && $h{$_}) { $wh="width=$w{$_} height=$h{$_}"; } else { $wh=""; } print "

\n"; } } elsif ($tail{$_}) { print "

Download:$no{$_}$tail{$_} $no{$_}$tail{$_}\n"; } print "$comment{$_}
" if ($imgpoint == 1); if (!$reno{$_}) { print "

\n"; } print "
\n"; # 投稿者編集フォーム if ($cnam) { if ($cnam =~ /\Q$author{$_}\E/i || $author{$_} =~ /\Q$cnam\E/i) { print "
\n
\n", "
\n", "投稿者 \n", "\n ", "暗証キー \n", "
\n"; print "
\n
\n"; } } } print "
\n"; # 著作権表示部(削除改変不可) print "

\n"; print "\n"; print "- Joyful Note -\n"; print "
Modified by isso\n"; print "
\n\n\n"; exit; } #------------------------------------------------- # 過去ログ記事番号検索 #------------------------------------------------- sub psearch { # ヘッダを出力 &header; print "[掲示板に戻る]\n"; print "  [過去ログ]\n" if ($pastkey); print <<"EOM";
過去ログ[$in{'pastlog'}]

EOM # 表示ログを定義 $in{'pastlog'} =~ s/\D//g; $file = "$pastdir$in{'pastlog'}\.dat"; open(IN,"$file") || &error("Open Error : $file"); while () { if ($_ =~ /(<\/b>\]\s)/i) { if ($in{'num'} eq $2) { $flag=0; if ($_ =~ /^\\[\\d+\<\/b\>\]/) { $flag=1; } # メールアドレスのJavascript表示(旧ログ対応) $_ =~ s/()(.+)(<\/a><\/b>)/