のgazou.phpを改造したものです。 配布条件はレッツPHP!に準じます。改造、再配布は自由にどうぞ。 このスクリプトに関する質問はレッツPHP!にしないようにお願いします。 最新版はで配布しています。 ご質問は準備板@ふたばまでどうぞ。 設置法: 所望のディレクトリのパーミッションを777にします。 srcディレクトリとthumbディレクトリを作り、パーミッションを777にします。
futaba.phpを置き、ブラウザから呼出します(必要なファイルが自動設定されます)。 */ extract($_POST,EXTR_SKIP); extract($_GET,EXTR_SKIP); extract($_COOKIE,EXTR_SKIP); $upfile_name=isset($_FILES["upfile"]["name"]) ? $_FILES["upfile"]["name"] : ""; $upfile=isset($_FILES["upfile"]["tmp_name"]) ? $_FILES["upfile"]["tmp_name"] : ""; define("LOGFILE", 'img.log'); //ログファイル名 define("TREEFILE", 'tree.log'); //ログファイル名 define("IMG_DIR", 'src/'); //画像保存ディレクトリ。futaba.phpから見て define("THUMB_DIR",'thumb/'); //サムネイル保存ディレクトリ define("TITLE", 'ジェイさんの掲示板'); //タイトル(とTOP) define("HOME", '../index.html'); //「ホーム」へのリンク define("MAX_KB", '200'); //投稿容量制限 KB(phpの設定により2Mまで define("MAX_W", '150'); //投稿サイズ幅(これ以上はwidthを縮小 define("MAX_H", '150'); //投稿サイズ高さ define("PAGE_DEF", '10'); //一ページに表示する記事 define("LOG_MAX", '500'); //ログ最大行数 define("ADMIN_PASS", 'passwordjay'); //管理者パス define("RE_COL", '789922'); //>が付いた時の色 define("PHP_SELF", 'futaba.php'); //このスクリプト名 define("PHP_SELF2", 'index.html'); //入り口ファイル名 define("PHP_EXT", '.html'); //1ページ以降の拡張子 define("RENZOKU", '360'); //連続投稿秒数 define("RENZOKU2", '600'); //画像連続投稿秒数 define("MAX_RES", '3'); //強制sageレス数 define("USE_THUMB", 1); //サムネイルを作る する:1 しない:0 define("PROXY_CHECK", 0); //proxyの書込みを制限する y:1 n:0 define("DISP_ID", 0); //IDを表示する 強制:2 する:1 しない:0 define("BR_CHECK", 15); //改行を抑制する行数 しない:0 define("IDSEED", 'idの種'); //idの種 define("RESIMG", 0); //レスに画像を貼る:1 貼らない:0 $path = realpath("./").'/'.IMG_DIR; $badstring = array("dummy_string","dummy_string2"); //拒絶する文字列 $badfile = array("dummy","dummy2"); //拒絶するファイルのmd5 $badip = array("west.flets.alpha-net.net.jp","addr.dummy.com","addr2.dummy.com","i218-47-218-194.s02.a013.ap.plala.or.jp","pl123.nas921.p-tokyo.nttpc.ne.jp","121.132.142.147","arnefranken.com","i220-108-138-50.s02.a013.ap.plala.or.jp","100.129.150.200.ap.yournet.ne.jp","ool-43568683.dyn.optonline.net","76.130.150.220.ap.yournet.ne.jp","nttkyo246228.tkyo.nt.adsl.ppp.infoweb.ne.jp","193.141.150.220.ap.yournet.ne.jp","230-100-st.zelcom.ru","customer-201-134-110-35.uninet-ide.com.mx","205.134.150.220.ap.yournet.ne.jp","37.177.177.60.broad.hz.zj.dynamic.163data.com.cn","110.173.176.60.broad.hz.zj.dynamic.163data.com.cn","163data.com.cn","ntoska343067.oska.nt.ftth4.ppp.infoweb.ne.jp","ntoska422161.oska.nt.ftth4.ppp.infoweb.ne.jp","oska.nt.ftth4.ppp.infoweb.ne.jp","p7033-ipbfp2603osakakita.osaka.ocn.ne.jp","osaka.ocn.ne.jp","60.190.240.73","FL1-122-131-166-128.osk.mesh.ad.jp","mesh.ad.jp","MK-ABA40C4ACC5E","ABA40C4ACC5E","p6e85c4.osaknt01.ap.so-net.ne.jp","osaknt01.ap.so-net.ne.jp","125.120.176.171","125.120.180.60","125.120.183.165","125.120.177.214","CZIDC213056","62.85.45.84","hosted-by.leaseweb.com","leaseweb.com","42.9e.374a.static.theplanet.com","theplanet.com","176.234.145.122.ap.gmo-access.jp","ap.gmo-access.jp","78.157.143.207","hpc.be.itu.edu.tr","118.175.255.10","n122z171l148.bb122100.ctm.net","cable201-233-15-220.epm.net.co","62.149.67.49","edu.tr","ctm.net","epm.net.co","h24-207-4-144.primesignal.com","primesignal.com","MONEYE","forumgelb.spree.de","spree.de","usr257-gle.cableinet.co.uk","co.uk","lhr63.pie.net.pk","net.pk","201-3-34-15.cbace702.dsl.brasiltelecom.net.br","net.br","usr257-gle.cableinet.co.uk","189.31.68.242","KM-SSA03","202.149.27.244","static.88-198-53-43.clients.your-server.de","your-server.de","80-240-215-147.dnat.migtel.ru","dnat.migtel.ru","client832.surehost.ru","surehost.ru","113.111.48.191","60.Red-83-61-161.dynamicIP.rima-tde.net","194.154.183.121","202.65.245.6","kakapo.island42.net","dsmdemo.lantronix.com","111.1.32.23","dsl-201-120-39-192-sta.prod-empresarial.com.mx","pc121227.kyunghee.ac.kr","mail2.itsp-inc.com","86.96.226.22","12.subnet118-97-32.static.astinet.telkom.net.id","184.171.162.114","203.140.36.34.ap.gmobb-fix.jp","198.185.241.254","asx005.melbourneit.com.au","165-122-35-84.infopact.nl","62.117.107.137","usmtp.hnair.com","109.234.194.233","help.upc.hu","211.137.73.116","202.108.5.35","194.154.183.121","208.94.245.106","77-224-120-190.serverpronto.com","41-133-101-149.dsl.mweb.co.za","rrcs-184-74-215-156.nyc.biz.rr.com","www2293u.sakura.ne.jp","110.55.105.103.BTI.NET.PH","12.107.176.81","pool-173-61-218-36.cmdnnj.east.verizon.net","fw.ltjhs.tyc.edu.tw","188-165-24-254.kimsufi.com","p18223-ipngn3201marunouchi.tokyo.ocn.ne.jp","41.190.16.17","220-128-183-247.HINET-IP.hinet.net","pc121227.kyunghee.ac.kr","62.189.102.229","77-224-120-190.serverpronto.com","dsl-201-120-39-192-sta.prod-empresarial.com.mx","dsl-201-120-39-192-sta.prod-empresarial.com.mx","12.168.203.132","79.135.195.238","p54AAB311.dip.t-dialin.net","69.169.174.7.provo.static.broadweavenetworks.net","213-145-147-131.static.ktnet.kg","static41-211-251-249-251.adsl41-16.iam.net.ma","static41-211-251-249-251.adsl41-16.iam.net.ma","ec2-184-73-182-88.compute-1.amazonaws.com","220.209.183.215","202.170.68.121","149.249.17.34","195.62.199.131","69.169.174.7.provo.static.broadweavenetworks.net","outside.gws-muenster.de","195.18.38.26","46.22.66-86.rev.gaoland.net","151.13.153.252","94.199.184.242","184.171.162.114","202.108.5.35","208-96-213-149.static.cimcoisp.net","fw.dsdf.org"); //拒絶するホスト $addinfo=''; /* ヘッダ */ function head(&$dat){ $dat.='<html><head> <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS"> <!-- meta HTTP-EQUIV="pragma" CONTENT="no-cache" --> <STYLE TYPE="text/css"> <!-- body,tr,td,th { font-size:12pt } a:hover { color:#DD0000; } span { font-size:20pt } small { font-size:10pt } --> </STYLE> <title>'.TITLE.'

[ホーム] [管理用]

'.TITLE.'

私のツアーにご参加いただいた方、ホームページにいらっしゃった方、一言メッセージをどうぞ!
旅行で撮影された写真等をアップロードしてください。
画像をアップされない場合は「画像なし」を必ずクリックしてください。でないとメッセージが消去されてしまいます。


'; } /* 投稿フォーム */ function form(&$dat,$resno,$admin=""){ global $addinfo; $msg=""; $hidden=""; $maxbyte = MAX_KB * 1024; $no=$resno; if($resno){ $msg .= "[掲示板に戻る]\n"; $msg .= "
\n"; $msg .= "レス送信モード\n"; $msg .= "
\n"; } if($admin){ $hidden = ""; $msg = "

タグがつかえます

"; } $dat.=$msg.'
'.$hidden.' '; if($no){$dat.=' ';} $dat.='
'; if(RESIMG || !$resno){ $dat.='
'; } } /* 記事部分 */ function updatelog($resno=0){ global $path;$p=0; $tree = file(TREEFILE); $find = false; if($resno){ $counttree=count($tree); for($i = 0;$i<$counttree;$i++){ list($artno,)=explode(",",rtrim($tree[$i])); if($artno==$resno){$st=$i;$find=true;break;} //レス先検索 } if(!$find) error("該当記事がみつかりません"); } $line = file(LOGFILE); $countline=count($line); for($i = 0; $i < $countline; $i++){ list($no,) = explode(",", $line[$i]); $lineindex[$no]=$i + 1; //逆変換テーブル作成 } $counttree = count($tree); for($page=0;$page<$counttree;$page+=PAGE_DEF){ $dat=''; head($dat); form($dat,$resno); if(!$resno){ $st = $page; } $dat.='
'; for($i = $st; $i < $st+PAGE_DEF; $i++){ if(empty($tree[$i])){continue;} $treeline = explode(",", rtrim($tree[$i])); $disptree = $treeline[0]; $j=$lineindex[$disptree] - 1; //該当記事を探して$jにセット if(empty($line[$j])){continue;} //$jが範囲外なら次の行 list($no,$now,$name,$email,$sub,$com,$url, $host,$pwd,$ext,$w,$h,$time,$chk) = explode(",", $line[$j]); // URLとメールにリンク if($email) $name = "$name"; $com = auto_link($com); $com = eregi_replace("(^|>)(>[^<]*)", "\\1\\2", $com); // 画像ファイル名 $img = $path.$time.$ext; $src = IMG_DIR.$time.$ext; // \"".$size.""; }else{ $imgsrc = "\"".$size.""; } }else{//それ以外 $imgsrc = "\"".$size.""; } $dat.="画像タイトル:$time$ext-($size B)
$imgsrc"; } // メイン作成 $dat.="$sub \n"; $dat.="Name $name $now No.$no   \n"; if(!$resno) $dat.="[返信]"; $dat.="\n
$com
"; // そろそろ消える。 if($lineindex[$no]-1 >= LOG_MAX*0.95){ $dat.="このスレは古いので、もうすぐ消えます。
\n"; } //レス作成 if(!$resno){ $s=count($treeline) - 10; if($s<1){$s=1;} elseif($s>1){ $dat.="レス". ($s - 1)."件省略。全て読むには返信ボタンを押してください。
\n"; } }else{$s=1;} for($k = $s; $k < count($treeline); $k++){ $disptree = $treeline[$k]; $j=$lineindex[$disptree] - 1; if($line[$j]=="") continue; list($no,$now,$name,$email,$sub,$com,$url, $host,$pwd,$ext,$w,$h,$time,$chk) = explode(",", $line[$j]); // URLとメールにリンク if($email) $name = "$name"; $com = auto_link($com); $com = eregi_replace("(^|>)(>[^<]*)", "\\1\\2", $com); // 画像ファイル名 $img = $path.$time.$ext; $src = IMG_DIR.$time.$ext; // \"".$size.""; }else{ $imgsrc = "\"".$size.""; } }else{//それ以外 $imgsrc = "\"".$size.""; } $imgsrc="
    $time$ext-($size B) $imgsrc"; } // メイン作成 $dat.="
\n"; $dat.="$sub \n"; $dat.="Name $name $now No.$no   \n"; $dat.="$imgsrc
$com
"; $dat.="
\n"; } $dat.="

\n"; clearstatcache();//ファイルのstatをクリア $p++; if($resno){break;} //res時はtree1行だけ } $dat.='
【記事削除】[画像だけ消す]
削除キー
'; if(!$resno){ //res時は表示しない $prev = $st - PAGE_DEF; $next = $st + PAGE_DEF; // 改ページ処理 $dat.=""; if($prev >= 0){ if($prev==0){ $dat.=""; }else{$dat.="";} $dat.=""; if($p >= PAGE_DEF && count($tree) > $next){ $dat.=""; }else{$dat.="";} $dat.="
"; }else{ $dat.=""; } $dat.=""; $dat.="最初のページ"; for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){ if($st==$i){$dat.="[".($i/PAGE_DEF)."] ";} else{ if($i==0){$dat.="[0] ";} else{$dat.="[".($i/PAGE_DEF)."] ";} } } $dat.="
"; $dat.=""; $dat.="最後のページ

\n"; } foot($dat); if($resno){echo $dat;break;} if($page==0){$logfilename=PHP_SELF2;} else{$logfilename=$page/PAGE_DEF.PHP_EXT;} $fp = fopen($logfilename, "w"); set_file_buffer($fp, 0); rewind($fp); fputs($fp, $dat); fclose($fp); chmod($logfilename,0666); } if(!$resno&&is_file(($page/PAGE_DEF+1).PHP_EXT)){unlink(($page/PAGE_DEF+1).PHP_EXT);} } /* フッタ */ function foot(&$dat){ $dat.='
'; } /* オートリンク */ function auto_link($proto){ $proto = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","\\1\\2",$proto); return $proto; } /* エラー画面 */ function error($mes,$dest=''){ global $upfile_name,$path; if(is_file($dest)) unlink($dest); head($dat); echo $dat; echo "




$mes

リロード



"; die(""); } function proxy_connect($port) { $a="";$b=""; $fp = @fsockopen ($_SERVER["REMOTE_ADDR"], $port,$a,$b,2); if(!$fp){return 0;}else{return 1;} } /* 記事書き込み */ function regist($name,$email,$sub,$com,$url,$pwd,$upfile,$upfile_name,$resto){ global $path,$badstring,$badfile,$badip,$pwdc,$textonly; $dest="";$mes=""; // 時間 $time = time(); $tim = $time.substr(microtime(),2,3); // アップロード処理 if($upfile&&file_exists($upfile)){ $dest = $path.$tim.'.tmp'; move_uploaded_file($upfile, $dest); //↑でエラーなら↓に変更 //copy($upfile, $dest); $upfile_name = CleanStr($upfile_name); if(!is_file($dest)) error("アップロードに失敗しました
サーバがサポートしていない可能性があります",$dest); $size = getimagesize($dest); if(!is_array($size)) error("アップロードに失敗しました
画像ファイル以外は受け付けません",$dest); $chk = md5_of_file($dest); foreach($badfile as $value){if(ereg("^$value",$chk)){ error("アップロードに失敗しました
同じ画像がありました",$dest); //拒絶画像 }} chmod($dest,0666); $W = $size[0]; $H = $size[1]; switch ($size[2]) { case 1 : $ext=".gif";break; case 2 : $ext=".jpg";break; case 3 : $ext=".png";break; case 4 : $ext=".swf";break; case 5 : $ext=".psd";break; case 6 : $ext=".bmp";break; case 13 : $ext=".swf";break; default : $ext=".xxx";error("対応しないフォーマットです。",$dest); } // 画像表示縮小 if($W > MAX_W || $H > MAX_H){ $W2 = MAX_W / $W; $H2 = MAX_H / $H; ($W2 < $H2) ? $key = $W2 : $key = $H2; $W = ceil($W * $key); $H = ceil($H * $key); } $mes = "画像 $upfile_name のアップロードが成功しました

"; } foreach($badstring as $value){if(ereg($value,$com)||ereg($value,$sub)||ereg($value,$name)||ereg($value,$email)){ error("拒絶されました(str)",$dest);};} if($_SERVER["REQUEST_METHOD"] != "POST") error("不正な投稿をしないで下さい(post)",$dest); // フォーム内容をチェック if(!$name||ereg("^[ | |]*$",$name)) $name=""; if(!$com||ereg("^[ | |\t]*$",$com)) $com=""; if(!$sub||ereg("^[ | |]*$",$sub)) $sub=""; if(!$resto&&!$textonly&&!is_file($dest)) error("画像がありません",$dest); if(!$com&&!is_file($dest)) error("何か書いて下さい",$dest); /* 2011/1/12 tomoko add */ //if( preg_match('[/ぁ-ん]/', $com) <= '0' ) error( "日本語を入力してください"); //if( preg_match("/^[ぁ-ん]+$/", $com) <= '0' ) error( "日本語を入力してください"); //if( preg_match('[/^ぁ-ん]+$/', $com) <= '0' ) error( "日本語を入力してください"); /* if(mb_ereg_match(".*[あ-ん]+.*", $com)) { //echo "ok"; } else { error( "日本語を入力してください"); } */ if (mb_detect_encoding($com) == 'ASCII') { error( "日本語を入力してください"); } $name=ereg_replace("管理","\"管理\"",$name); $name=ereg_replace("削除","\"削除\"",$name); if(strlen($com) > 1000) error("本文が長すぎますっ!",$dest); if(strlen($name) > 100) error("本文が長すぎますっ!",$dest); if(strlen($email) > 100) error("本文が長すぎますっ!",$dest); if(strlen($sub) > 100) error("本文が長すぎますっ!",$dest); if(strlen($resto) > 10) error("異常です",$dest); if(strlen($url) > 10) error("異常です",$dest); //ホスト取得 $host = gethostbyaddr($_SERVER["REMOTE_ADDR"]); foreach($badip as $value){ //拒絶host if(eregi("$value$",$host)){ error("拒絶されました(host)",$dest); }} if(eregi("^mail",$host) || eregi("^ns",$host) || eregi("^dns",$host) || eregi("^ftp",$host) || eregi("^prox",$host) || eregi("^pc",$host) || eregi("^[^\.]\.[^\.]$",$host)){ $pxck = "on"; } if(eregi("ne\\.jp$",$host)|| eregi("ad\\.jp$",$host)|| eregi("bbtec\\.net$",$host)|| eregi("aol\\.com$",$host)|| eregi("uu\\.net$",$host)|| eregi("asahi-net\\.or\\.jp$",$host)|| eregi("rim\\.or\\.jp$",$host) ){$pxck = "off";} else{$pxck = "on";} if($pxck=="on" && PROXY_CHECK){ if(proxy_connect('80') == 1){ error("ERROR! 公開PROXY規制中!!(80)",$dest); } elseif(proxy_connect('8080') == 1){ error("ERROR! 公開PROXY規制中!!(8080)",$dest); } } // No.とパスと時間とURLフォーマット srand((double)microtime()*1000000); if($pwd==""){ if($pwdc==""){ $pwd=rand();$pwd=substr($pwd,0,8); }else{ $pwd=$pwdc; } } $c_pass = $pwd; $pass = ($pwd) ? substr(md5($pwd),2,8) : "*"; $youbi = array('日','月','火','水','木','金','土'); $yd = $youbi[gmdate("w", $time+9*60*60)] ; $now = gmdate("y/m/d",$time+9*60*60)."(".(string)$yd.")".gmdate("H:i",$time+9*60*60); if(DISP_ID){ if($email&&DISP_ID==1){ $now .= " ID:???"; }else{ $now.=" ID:".substr(crypt(md5($_SERVER["REMOTE_ADDR"].IDSEED.gmdate("Ymd", $time+9*60*60)),'id'),-8); } } //テキスト整形 $email= CleanStr($email); $email=ereg_replace("[\r\n]","",$email); $sub = CleanStr($sub); $sub =ereg_replace("[\r\n]","",$sub); $url = CleanStr($url); $url =ereg_replace("[\r\n]","",$url); $resto= CleanStr($resto); $resto=ereg_replace("[\r\n]","",$resto); $com = CleanStr($com); // 改行文字の統一。 $com = str_replace( "\r\n", "\n", $com); $com = str_replace( "\r", "\n", $com); // 連続する空行を一行 $com = ereg_replace("\n(( | )*\n){3,}","\n",$com); if(!BR_CHECK || substr_count($com,"\n")を代入する } $com = str_replace("\n", "", $com); //\nを文字列から消す。 $name=ereg_replace("◆","◇",$name); $name=ereg_replace("[\r\n]","",$name); $names=$name; $name = CleanStr($name); if(ereg("(#|#)(.*)",$names,$regs)){ $cap = $regs[2]; $cap=strtr($cap,"&", "&"); $cap=strtr($cap,",", ","); $name=ereg_replace("(#|#)(.*)","",$name); $salt=substr($cap."H.",1,2); $salt=ereg_replace("[^\.-z]",".",$salt); $salt=strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef"); $name.="◆".substr(crypt($cap,$salt),-10).""; } if(!$name) $name="名無し"; if(!$com) $com="本文なし"; if(!$sub) $sub="無題"; //ログ読み込み $fp=fopen(LOGFILE,"r+"); flock($fp, 2); rewind($fp); $buf=fread($fp,1000000); if($buf==''){error("error load log",$dest);} $line = explode("\n",$buf); $countline=count($line); for($i = 0; $i < $countline; $i++){ if($line[$i]!=""){ list($artno,)=explode(",", rtrim($line[$i])); //逆変換テーブル作成 $lineindex[$artno]=$i+1; $line[$i].="\n"; }} // 二重投稿チェック $imax=count($line)>20 ? 20 : count($line)-1; for($i=0;$i<$imax;$i++){ list($lastno,,$lname,,,$lcom,,$lhost,$lpwd,,,,$ltime,) = explode(",", $line[$i]); if(strlen($ltime)>10){$ltime=substr($ltime,0,-3);} if($host==$lhost||substr(md5($pwd),2,8)==$lpwd||substr(md5($pwdc),2,8)==$lpwd){$pchk=1;}else{$pchk=0;} if(RENZOKU && $pchk && $time - $ltime < RENZOKU) error("連続投稿はもうしばらく時間を置いてからお願い致します",$dest); if(RENZOKU && $pchk && $time - $ltime < RENZOKU2 && $upfile_name) error("画像連続投稿はもうしばらく時間を置いてからお願い致します",$dest); if(RENZOKU && $pchk && $com == $lcom && !$upfile_name) error("連続投稿はもうしばらく時間を置いてからお願い致します",$dest); } // ログ行数オーバー if(count($line) >= LOG_MAX){ for($d = count($line)-1; $d >= LOG_MAX-1; $d--){ list($dno,,,,,,,,,$dext,,,$dtime,) = explode(",", $line[$d]); if(is_file($path.$dtime.$dext)) unlink($path.$dtime.$dext); if(is_file(THUMB_DIR.$dtime.'s.jpg')) unlink(THUMB_DIR.$dtime.'s.jpg'); $line[$d] = ""; treedel($dno); } } // アップロード処理 if($dest&&file_exists($dest)){ $imax=count($line)>200 ? 200 : count($line)-1; for($i=0;$i<$imax;$i++){ //画像重複チェック list(,,,,,,,,,$extp,,,$timep,$chkp,) = explode(",", $line[$i]); if($chkp==$chk&&file_exists($path.$timep.$extp)){ error("アップロードに失敗しました
同じ画像があります",$dest); }} } list($lastno,) = explode(",", $line[0]); $no = $lastno + 1; isset($ext)?0:$ext=""; isset($W)?0:$W=""; isset($H)?0:$H=""; isset($chk)?0:$chk=""; $newline = "$no,$now,$name,$email,$sub,$com,$url,$host,$pass,$ext,$W,$H,$tim,$chk,\n"; $newline.= implode('', $line); ftruncate($fp,0); set_file_buffer($fp, 0); rewind($fp); fputs($fp, $newline); //ツリー更新 $find = false; $newline = ''; $tp=fopen(TREEFILE,"r+"); set_file_buffer($tp, 0); rewind($tp); $buf=fread($tp,1000000); if($buf==''){error("error tree update",$dest);} $line = explode("\n",$buf); $countline=count($line); for($i = 0; $i < $countline; $i++){ if($line[$i]!=""){ $line[$i].="\n"; $j=explode(",", rtrim($line[$i])); if($lineindex[$j[0]]==0){ $line[$i]=''; } } } if($resto){ for($i = 0; $i < $countline; $i++){ $rtno = explode(",", rtrim($line[$i])); if($rtno[0]==$resto){ $find = TRUE; $line[$i]=rtrim($line[$i]).','.$no."\n"; $j=explode(",", rtrim($line[$i])); if(count($j)>MAX_RES){$email='sage';} if(!stristr($email,'sage')){ $newline=$line[$i]; $line[$i]=''; } break; } } } if(!$find){if(!$resto){$newline="$no\n";}else{error("スレッドがありません",$dest);}} $newline.=implode('', $line); ftruncate($tp,0); set_file_buffer($tp, 0); rewind($tp); fputs($tp, $newline); fclose($tp); fclose($fp); //クッキー保存 setcookie ("pwdc", $c_pass,time()+7*24*3600); /* 1週間で期限切れ */ if(function_exists("mb_internal_encoding")&&function_exists("mb_convert_encoding") &&function_exists("mb_substr")){ if(ereg("MSIE|Opera",$_SERVER["HTTP_USER_AGENT"])){ $i=0;$c_name=''; mb_internal_encoding("SJIS"); while($j=mb_substr($names,$i,1)){ $j = mb_convert_encoding($j, "UTF-16", "SJIS"); $c_name.="%u".bin2hex($j); $i++; } header("Set-Cookie: namec=$c_name; expires=".gmdate("D, d-M-Y H:i:s",time()+7*24*3600)." GMT",false); }else{ $c_name=$names; setcookie ("namec", $c_name,time()+7*24*3600); /* 1週間で期限切れ */ } } if($dest&&file_exists($dest)){ rename($dest,$path.$tim.$ext); if(USE_THUMB){thumb($path,$tim,$ext);} } updatelog(); echo ""; echo "$mes 画面を切り替えます"; } //サムネイル作成 function thumb($path,$tim,$ext){ if(!function_exists("ImageCreate")||!function_exists("ImageCreateFromJPEG"))return; $fname=$path.$tim.$ext; $thumb_dir = THUMB_DIR; //サムネイル保存ディレクトリ $width = MAX_W; //出力画像幅 $height = MAX_H; //出力画像高さ // 画像の幅と高さとタイプを取得 $size = GetImageSize($fname); switch ($size[2]) { case 1 : if(function_exists("ImageCreateFromGIF")){ $im_in = @ImageCreateFromGIF($fname); if($im_in){break;} } if(!is_executable(realpath("./gif2png"))||!function_exists("ImageCreateFromPNG"))return; @exec(realpath("./gif2png")." $fname",$a); if(!file_exists($path.$tim.'.png'))return; $im_in = @ImageCreateFromPNG($path.$tim.'.png'); unlink($path.$tim.'.png'); if(!$im_in)return; break; case 2 : $im_in = @ImageCreateFromJPEG($fname); if(!$im_in){return;} break; case 3 : if(!function_exists("ImageCreateFromPNG"))return; $im_in = @ImageCreateFromPNG($fname); if(!$im_in){return;} break; default : return; } // リサイズ if ($size[0] > $width || $size[1] >$height) { $key_w = $width / $size[0]; $key_h = $height / $size[1]; ($key_w < $key_h) ? $keys = $key_w : $keys = $key_h; $out_w = ceil($size[0] * $keys) +1; $out_h = ceil($size[1] * $keys) +1; } else { $out_w = $size[0]; $out_h = $size[1]; } // 出力画像(サムネイル)のイメージを作成 if(function_exists("ImageCreateTrueColor")&&get_gd_ver()=="2"){ $im_out = ImageCreateTrueColor($out_w, $out_h); }else{$im_out = ImageCreate($out_w, $out_h);} // 元画像を縦横とも コピーします。 # ImageCopyResampled($im_out, $im_in, 0, 0, 0, 0, $out_w, $out_h, $size[0], $size[1]); ImageCopyResized($im_out, $im_in, 0, 0, 0, 0, $out_w, $out_h, $size[0], $size[1]); // サムネイル画像を保存 ImageJPEG($im_out, $thumb_dir.$tim.'s.jpg',60); chmod($thumb_dir.$tim.'s.jpg',0666); // 作成したイメージを破棄 ImageDestroy($im_in); ImageDestroy($im_out); } //gdのバージョンを調べる function get_gd_ver(){ if(function_exists("gd_info")){ $gdver=gd_info(); $phpinfo=$gdver["GD Version"]; }else{ //php4.3.0未満用 ob_start(); phpinfo(8); $phpinfo=ob_get_contents(); ob_end_clean(); $phpinfo=strip_tags($phpinfo); $phpinfo=stristr($phpinfo,"gd version"); $phpinfo=stristr($phpinfo,"version"); } $end=strpos($phpinfo,"."); $phpinfo=substr($phpinfo,0,$end); $length = strlen($phpinfo)-1; $phpinfo=substr($phpinfo,$length); return $phpinfo; } //ファイルmd5計算 php4.2.0未満用 function md5_of_file($inFile) { if (file_exists($inFile)){ if(function_exists('md5_file')){ return md5_file($inFile); }else{ $fd = fopen($inFile, 'r'); $fileContents = fread($fd, filesize($inFile)); fclose ($fd); return md5($fileContents); } }else{ return false; }} //ツリー削除 function treedel($delno){ $fp=fopen(TREEFILE,"r+"); set_file_buffer($fp, 0); flock($fp, 2); rewind($fp); $buf=fread($fp,1000000); if($buf==''){error("error tree del");} $line = explode("\n",$buf); $countline=count($line); if($countline>2){ for($i = 0; $i < $countline; $i++){if($line[$i]!=""){$line[$i].="\n";};} for($i = 0; $i < $countline; $i++){ $treeline = explode(",", rtrim($line[$i])); $counttreeline=count($treeline); for($j = 0; $j < $counttreeline; $j++){ if($treeline[$j] == $delno){ $treeline[$j]=''; if($j==0){$line[$i]='';} else{$line[$i]=implode(',', $treeline); $line[$i]=ereg_replace(",,",",",$line[$i]); $line[$i]=ereg_replace(",$","",$line[$i]); $line[$i].="\n"; } break 2; } } } ftruncate($fp,0); set_file_buffer($fp, 0); rewind($fp); fputs($fp, implode('', $line)); } fclose($fp); } /* テキスト整形 */ function CleanStr($str){ global $admin; $str = trim($str);//先頭と末尾の空白除去 if (get_magic_quotes_gpc()) {//¥を削除 $str = stripslashes($str); } if($admin!=ADMIN_PASS){//管理者はタグ可能 $str = htmlspecialchars($str);//タグっ禁止 $str = str_replace("&", "&", $str);//特殊文字 } return str_replace(",", ",", $str);//カンマを変換 } /* ユーザー削除 */ function usrdel($no,$pwd){ global $path,$pwdc,$onlyimgdel; $host = gethostbyaddr($_SERVER["REMOTE_ADDR"]); $delno = array("dummy"); $delflag = FALSE; reset($_POST); while ($item = each($_POST)){ if($item[1]=='delete'){array_push($delno,$item[0]);$delflag=TRUE;} } if($pwd==""&&$pwdc!="") $pwd=$pwdc; $fp=fopen(LOGFILE,"r+"); set_file_buffer($fp, 0); flock($fp, 2); rewind($fp); $buf=fread($fp,1000000); fclose($fp); if($buf==''){error("error user del");} $line = explode("\n",$buf); $countline=count($line); for($i = 0; $i < $countline; $i++){if($line[$i]!=""){$line[$i].="\n";};} $flag = FALSE; $countline=count($line)-1; for($i = 0; $i<$countline; $i++){ list($dno,,,,,,,$dhost,$pass,$dext,,,$dtim,) = explode(",", $line[$i]); if(array_search($dno,$delno) && (substr(md5($pwd),2,8) == $pass || $dhost == $host||ADMIN_PASS==$pwd)){ $flag = TRUE; $line[$i] = ""; //パスワードがマッチした行は空に $delfile = $path.$dtim.$dext; //削除ファイル if(!$onlyimgdel){ treedel($dno); } if(is_file($delfile)) unlink($delfile);//削除 if(is_file(THUMB_DIR.$dtim.'s.jpg')) unlink(THUMB_DIR.$dtim.'s.jpg');//削除 } } if(!$flag) error("該当記事が見つからないかパスワードが間違っています"); } /* パス認証 */ function valid($pass){ if($pass && $pass != ADMIN_PASS) error("パスワードが違います"); head($dat); echo $dat; echo "[掲示板に戻る]\n"; echo "[ログを更新する]\n"; echo "
\n"; echo "管理モード\n"; echo "
\n"; echo "

\n"; // ログインフォーム if(!$pass){ echo "
記事削除 "; echo "管理人投稿

"; echo "\n"; echo ""; echo "

\n"; die(""); } } /* 管理者削除 */ function admindel($pass){ global $path,$onlyimgdel; $all=0;$msg=""; $delno = array("dummy"); $delflag = FALSE; reset($_POST); while ($item = each($_POST)){ if($item[1]=='delete'){array_push($delno,$item[0]);$delflag=TRUE;} } if($delflag){ $fp=fopen(LOGFILE,"r+"); set_file_buffer($fp, 0); flock($fp, 2); rewind($fp); $buf=fread($fp,1000000); if($buf==''){error("error admin del");} $line = explode("\n",$buf); $countline=count($line)-1; for($i = 0; $i < $countline; $i++){if($line[$i]!=""){$line[$i].="\n";};} $find = FALSE; for($i = 0; $i < $countline; $i++){ list($no,$now,$name,$email,$sub,$com,$url,$host,$pw,$ext,$w,$h,$tim,$chk) = explode(",",$line[$i]); if($onlyimgdel=="on"){ if(array_search($no,$delno)){//画像だけ削除 $delfile = $path.$tim.$ext; //削除ファイル if(is_file($delfile)) unlink($delfile);//削除 if(is_file(THUMB_DIR.$tim.'s.jpg')) unlink(THUMB_DIR.$tim.'s.jpg');//削除 } }else{ if(array_search($no,$delno)){//削除の時は空に $find = TRUE; $line[$i] = ""; $delfile = $path.$tim.$ext; //削除ファイル if(is_file($delfile)) unlink($delfile);//削除 if(is_file(THUMB_DIR.$tim.'s.jpg')) unlink(THUMB_DIR.$tim.'s.jpg');//削除 treedel($no); } } } if($find){//ログ更新 ftruncate($fp,0); set_file_buffer($fp, 0); rewind($fp); fputs($fp, implode('', $line)); } fclose($fp); } // 削除画面を表示 echo "\n"; echo "\n"; echo "\n"; echo "

削除したい記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n"; echo "

"; echo ""; echo "[画像だけ消す]"; echo "

\n"; echo ""; echo ""; echo "\n"; $line = file(LOGFILE); for($j = 0; $j < count($line); $j++){ $img_flag = FALSE; list($no,$now,$name,$email,$sub,$com,$url, $host,$pw,$ext,$w,$h,$time,$chk) = explode(",",$line[$j]); // フォーマット $now=ereg_replace('.{2}/(.*)$','\1',$now); $now=ereg_replace('\(.*\)',' ',$now); if(strlen($name) > 10) $name = substr($name,0,9)."."; if(strlen($sub) > 10) $sub = substr($sub,0,9)."."; if($email) $name="$name"; $com = str_replace("
"," ",$com); $com = htmlspecialchars($com); if(strlen($com) > 20) $com = substr($com,0,18) . "."; // 画像があるときはリンク if($ext && is_file($path.$time.$ext)){ $img_flag = TRUE; $clip = "".$time.$ext."
"; $size = filesize($path.$time.$ext); $all += $size; //合計計算 $chk= substr($chk,0,10); }else{ $clip = ""; $size = 0; $chk= ""; } $bg = ($j % 2) ? "d6d6f6" : "f6f6f6";//背景色 echo ""; echo ""; echo ""; echo "\n"; echo "\n"; } echo "
削除記事No投稿日題名投稿者コメントホスト名添付
(Bytes)
md5
$no$now$sub$name$com$host$clip($size)$chk

"; echo ""; $all = (int)($all / 1024); echo "【 画像データ合計 : $all KB 】"; die("

"); } function init(){ $err=""; $chkfile=array(LOGFILE,TREEFILE); if(!is_writable(realpath("./")))error("カレントディレクトリに書けません
"); foreach($chkfile as $value){ if(!file_exists(realpath($value))){ $fp = fopen($value, "w"); set_file_buffer($fp, 0); if($value==LOGFILE)fputs($fp,"1,2002/01/01(月) 00:00,名無し,,無題,本文なし,,,,,,,,\n"); if($value==TREEFILE)fputs($fp,"1\n"); fclose($fp); if(file_exists(realpath($value)))@chmod($value,0666); } if(!is_writable(realpath($value)))$err.=$value."を書けません
"; if(!is_readable(realpath($value)))$err.=$value."を読めません
"; } @mkdir(IMG_DIR,0777);@chmod(IMG_DIR,0777); if(!is_dir(realpath(IMG_DIR)))$err.=IMG_DIR."がありません
"; if(!is_writable(realpath(IMG_DIR)))$err.=IMG_DIR."を書けません
"; if(!is_readable(realpath(IMG_DIR)))$err.=IMG_DIR."を読めません
"; if(USE_THUMB){ @mkdir(THUMB_DIR,0777);@chmod(THUMB_DIR,0777); if(!is_dir(realpath(IMG_DIR)))$err.=THUMB_DIR."がありません
"; if(!is_writable(realpath(THUMB_DIR)))$err.=THUMB_DIR."を書けません
"; if(!is_readable(realpath(THUMB_DIR)))$err.=THUMB_DIR."を読めません
"; } if($err)error($err); } /*-----------Main-------------*/ init(); //←■■初期設定後は不要なので削除可■■ $iniv=array('mode','name','email','sub','com','pwd','upfile','upfile_name','resto','pass','res','post','no'); foreach($iniv as $iniva){ if(!isset($$iniva)){$$iniva="";} } switch($mode){ case 'regist': regist($name,$email,$sub,$com,'',$pwd,$upfile,$upfile_name,$resto); break; case 'admin': valid($pass); if($admin=="del") admindel($pass); if($admin=="post"){ echo ""; form($post,$res,1); echo $post; die(""); } break; case 'usrdel': usrdel($no,$pwd); default: if($res){ updatelog($res); }else{ updatelog(); echo ""; } } ?>