if(phpversion()>="4.1.0"){
extract($_REQUEST);
extract($_SERVER);
}
/*
* P-BBS by ToR
* http://php.s3.to
*
* 2000/12/02 pre 完成
* 2001/03/06 v1.0 完成ー
* 2001/03/11 v1.1 HTML書き出すOnOff、書き込み後Locationで飛ばす、管理モードpass→apass
* 2001/04.16 v1.2 過去ログ対応、>がつくと色変わる。デザイン変更
* 2001/04/24 v1.23 書き込み後表示関数化、ページング変更、管理モード実行後修正、ホスト表示、Re:[2]
* 2001/05/04 v1.231 クッキーをHTMLに書き出してしまうバグ修正,過去ログモードの非表示
* 2001/05/17 v1.232 文字数制限、行数制限追加
* 2001/05/27 v1.24 autolink修正、書き込み後refreshで飛ばす
* 2001/06/02 v1.25 GET投稿禁止、外部投稿禁止
* 2001/11/15 v1.26 >の後のスペース無くす。PHP3の時レスで
となるバグ修正
* 2002/05/25 v1.27 i18n削除、空白チェック修正
* 2002/02/11 v1.28 クッキーの文字化け対策
*
* シンプルな掲示板です。管理モード付
* 空のログファイルを用意して、パーミッションを606にしてください
* HTMLを書き出す場合は、そのディレクトリが707か777じゃないとダメです
*/
//-------------設定ここから-------------
/*
に入れるタイトル */
$title1 = 'P-BBS';
/* 掲示板のTOPタイトル(HTML可)*/
$title2 = 'P-BBS';
/* タグ */
$body = '';
/* 管理者用パスワード。必ず変更して下さい。*/
$admin_pass = '0123';
/* ログ保存ファイル */
$logfile = 'bbs.log';
/* TOPページをHTMLに書き出すか (yes=1 no=0)*/
$htmlw = 0;
/* 静的HTMLを書き出す場合のHTMLファイル */
$html_file = 'pbbs.html';
/* 戻り先(HOME)*/
$home = 'http://hogehoge.com';
/* 一ページあたりの表示記事数 */
$page_def = 10;
/* 最大記録件数 これを越えると古い物から過去ログへ移ります。*/
$max = 30;
/* 文字数制限(名前、題名、本文)全角だとこの半分です */
$maxn = 40;
$maxs = 40;
$maxv = 1500;
/* 本文の改行数制限 */
$maxline = 25;
/* 同一ホストからの連続投稿を制限
--> 秒数を記述するとその時間以上を経過しないと連続投稿できない*/
$w_regist = 30;
/* 文中で自動リンクするかどうか(yes=1 no=0)*/
$autolink = 1;
/* HTMLタグを有効にするか(yes=1 no=0)*/
$tag = 0;
/* タイトル無しで投稿された場合 */
$mudai = '(無題)';
/* >がついた時の色 */
$re_color = "#AA5620";
/* ホストを表示するか(表示しない=0 内で表示=1 表示=2)*/
$hostview = 1;
/* 外部書き込み禁止にする?(する=1,しない=0) */
define("GAIBU", 0);
/* 使用するファイルロックのタイプ(mkdir=1 flock=2 使わない=0)*/
define("LOCKEY", 2); //通常は2でOK
/* mkdirロックを使う時はlockという名でディレクトリを作成して777にしてください */
define("LOCK" , "lock/plock"); //lockの中に作るロックファイル名
/* 過去ログ作成する? */
$past_key = 0;
/* 過去ログ番号ファイル */
$past_no = "pastno.log";
/* 過去ログ作成ディレクトリ(書き込み権限必要) */
$past_dir = "./";
/* 過去ログ一つに書き込む行数 */
$past_line= "50";
// 閲覧禁止ホスト(正規表現可
$no_host[] = 'kantei.go.jp';
$no_host[] = 'anonymizer.com';
$no_host[] = "pt$";
$no_host[] = "ph$";
$no_host[] = "my$";
$no_host[] = "th$";
$no_host[] = "rr.com";
// 使用禁止ワード
$no_word[] = '死ね';
$no_word[] = '馬鹿';
$no_word[] = 'novapublic';
$no_word[] = 'http:';
//---------設定ここまで--------------
// 禁止ホスト
if (is_array($no_host)) {
$host = gethostbyaddr(getenv("REMOTE_ADDR"));
foreach ($no_host as $user) {
if(preg_match("/$user/i", $host)){
header("Status: 204\n\n");//空白ページ
exit;
}
}
}
//---------設定ここまで--------------
function head(&$dat){ //ヘッダー表示部
global $mode,$no,$PHP_SELF,$logfile,$title1,$title2,$body,$p_bbs,$htmlw;
//クッキーを頂きます
if (get_magic_quotes_gpc()) $p_bbs = stripslashes($p_bbs);
if(!$htmlw) list($r_name,$r_mail) = explode(",", $p_bbs);
if($mode == "resmsg"){ //レスの場合
$res = file($logfile);
$flag = 0;
while (list($key, $value) = each ($res)) {
list($rno,$date,$name,$email,$sub,$com,$url) = explode("<>", $value);
if ($no == "$rno"){ $flag=1; break; }
}
if ($flag == 0) error("該当記事が見つかりません");
if(ereg("Re\[([0-9]+)\]:", $sub, $reg)){
$reg[1]++;
$r_sub=ereg_replace("Re\[([0-9]+)\]:", "Re[$reg[1]]:", $sub);
}elseif(ereg("^Re:", $sub)){
$r_sub=ereg_replace("^Re:", "Re[2]:", $sub);
}else{ $r_sub = "Re:$sub"; }
$r_com = ">$com";
$r_com = eregi_replace("
","\r>",$r_com);
}
$head='
'.$title1.'
';
$dat=$head.$body.'
';
}
function foot(&$dat){ //フッター表示部
global $PHP_SELF,$home,$past_key;
$dat.='
';
}
function Main(&$dat){ //記事表示部
global $logfile,$page_def,$page,$PHP_SELF,$autolink,$re_color,$hostview;
$view = file($logfile);
$total = sizeof($view);
$total2= $total;
(isset($page)) ? $start = $page : $start = 0;
$end = $start + $page_def;
$st = $start + 1;
for($s = $start;$s < $end;$s++){
if(!$view[$s]) break;
list($no,$now,$name,$email,$sub,$com,$url,
$host,$pw) = explode("<>", $view[$s]);
if($url){ $url = "HP";}
if($email){ $email = "Mail";}
// >がある時は色変更
$com = eregi_replace("(^|>)(>[^<]*)", "\\1\\2", $com);
// URL自動リンク
if ($autolink) { $com=auto_link($com); }
// Host表示形式
if($hostview==1){ $host=""; }
elseif($hostview==2){ $host="[ $host ]"; }
else{ $host=""; }
$dat.="\n";
$dat.="\n";
$dat.=" $sub / $name | \n";
$dat.="[ Res ] | \n";
$dat.="
No.$no $email $url $now $host \n";
$dat.=" | |
\n\n";
$p++;
} //end for
$prev = $page - $page_def;
$next = $page + $page_def;
$dat.= sprintf("
%d 番目から %d 番目の記事を表示
Page:[ ",$st,$st+$p-1);
($page > 0) ? $dat.="<< " : $dat.=" ";
$p_no=1;$p_li=0;
while ($total > 0) {
if ($page == $p_li) { $dat.="$p_no ";
}else{ $dat.="$p_no "; }
$p_no++;
$p_li = $p_li + $page_def;
$total = $total - $page_def;
}
($total2 > $next) ? $dat.=" >>" : $dat.=" ";
$dat.=" ]\n";
}
function regist(){ //ログ書き込み
global $name,$email,$sub,$com,$url,$tag,$past_key,$maxn,$maxs,$maxv,$maxline;
global $password,$html_url,$logfile,$jisa,$max,$w_regist,$autolink,$mudai,
$PHP_SELF,$REQUEST_METHOD,$no_word;
if (preg_match("/(]*?>|\[url(?:\s?=|\]))|href=/i", $com)) error("禁止ワードエラー!!");
if($REQUEST_METHOD != "POST") error("不正な投稿をしないで下さい");
if(GAIBU && !eregi($PHP_SELF,getenv("HTTP_REFERER"))) error("外部から書き込みできません");
// フォーム内容をチェック
if(!$name||ereg("^( | )*$",$name)){ error("名前が書き込まれていません"); }
if(!$com||ereg("^( | |\t|\r|\n)*$",$com)){ error("本文が書き込まれていません"); }
if(!$sub||ereg("^( | )*$",$sub)){ $sub=$mudai; }
if(strlen($name) > $maxn){ error("名前が長すぎますっ!"); }
if(strlen($sub) > $maxs){ error("タイトルが長すぎますっ!"); }
if(strlen($com) > $maxv){ error("本文が長すぎますっ!"); }
// 禁止ワード
if (is_array($no_word)) {
foreach ($no_word as $fuck) {
if (preg_match("/$fuck/", $com)) error("使用できない言葉が含まれています!");
if (preg_match("/$fuck/", $sub)) error("使用できない言葉が含まれています!");
if (preg_match("/$fuck/", $name)) error("使用できない言葉が含まれています!");
}
}
$times = time();
$check = file($logfile);
$tail = sizeof($check);
list($tno,$tdate,$tname,$tmail,$tsub,$tcom,,,$tpw,$ttime) = explode("<>", $check[0]);
if($name == $tname && $com == $tcom) error("二重投稿は禁止です");
if ($w_regist && $times - $ttime < $w_regist)
error("連続投稿はもうしばらく時間を置いてからお願い致します");
// 記事Noを採番
$no = $tno + 1;
// ホスト名を取得
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host == $addr){//gethostbyddrが使えるか
$host=@gethostbyaddr($addr);
}
// 削除キーを暗号化
if ($password) { $PW = crypt(($password),aa); }
$now = gmdate( "Y/m/d(D) H:i",time()+9*60*60);
$url = ereg_replace( "^http://", "",$url);
if (get_magic_quotes_gpc()) {//\を削除
$com = stripslashes($com);
$sub = stripslashes($sub);
$name = stripslashes($name);
$email = stripslashes($email);
$url = stripslashes($url);
}
if ($tag == 0){
$sub = htmlspecialchars($sub);//タグっ禁止
$name = htmlspecialchars($name);
$com = htmlspecialchars($com);
$email = htmlspecialchars($email);
$url = htmlspecialchars($url);
$com = str_replace("&", "&", $com);
}
$com = str_replace( "\r\n", "\r", $com); //改行文字の統一。
$com = str_replace( "\r", "\n", $com);
/* \n数える(substr_countの代わり)*/
$temp = str_replace("\n", "\n"."a",$com);
$str_cnt=strlen($temp)-strlen($com);
if($str_cnt > $maxline){ error("行数が長すぎますっ!"); }
$com = ereg_replace("\n(( | |\t)*\n){3,}","\n",$com);//連続する空行を一行
$com = nl2br($com); //改行文字の前に
を代入する。
$com = ereg_replace( "\n", "", $com); //\nを文字列から消す。
$new_msg="$no<>$now<>$name<>$email<>$sub<>$com<>$url<>$host<>$PW<>$times\n";
//クッキー保存
$cookvalue = implode(",", array($name,$email));
setcookie ("p_bbs", $cookvalue,time()+14*24*3600); /* 2週間で期限切れ */
$old_log = file($logfile);
$line = sizeof($old_log);
$new_log[0] = $new_msg;//先頭に新記事
if($past_key && $line >= $max){//はみ出した記事を過去ログへ
for($s=$max; $s<=$line; $s++){//念の為複数行対応
past_log($old_log[$s-1]);
}
}
for($i=1; $i<$max; $i++) {//最大記事数処理
$new_log[$i] = $old_log[$i-1];
}
renewlog($new_log);//ログ更新
}
function usrdel(){ //ユーザー削除
global $pwd,$no,$logfile;
if ($no == "" || $pwd == "")
{ error("削除Noまたは削除キーが入力モレです"); }
$logall = file($logfile);
$flag=0;
while(list(,$lines)=each($logall)){
list($ono,$dat,$name,$email,$sub,$com,$url,$host,$opas) = explode("<>",$lines);
if ($no == "$ono") { $flag=1; $pass=$opas; }
else { $pushlog[]=$lines; }
}
if ($flag == 0) { error("該当記事が見当たりません"); }
if ($pass == "") { error("該当記事には削除キーが設定されていません"); }
// 削除キーを照合
$match = crypt(($pwd),aa);
if (($match != $pass)) { error("削除キーが違います"); }
// ログを更新
renewlog($pushlog);
}
function admin(){ //管理機能
global $admin_pass,$PHP_SELF,$logfile;
global $del,$apass,$head,$body;
if ($apass && $apass != "$admin_pass")
{ error("パスワードが違います"); }
echo "$head";
echo "$body";
echo "[掲示板に戻る]\n";
echo "\n";
echo "管理モード\n";
echo " |
---|
\n";
if (!$apass) {
echo "パスワードを入力して下さい
\n";
echo "\n";
}else {
// 削除処理
if ($del) {
// 削除情報をマッチングし更新
$delall = file($logfile);
while(list(,$delline)=each($delall)){
list($no,$date,$name,$email,$sub,$com,$url,$host) = explode("<>",$delline);
if ($del != "$no") { $dellog[]=$delline; }
}
// ログを更新
renewlog($dellog);
}
// 削除画面を表示
echo "\n";
}
echo "