rtoss - Blame information for rev 160

Subversion Repositories:
Rev:
Rev Author Line No. Line
5 roytam 1 <?php
2 require_once "./conf.php";
3 // extract($_POST);
4 // extract($_GET);
5 function CleanStr($u_str)
6 {
7         if (get_magic_quotes_gpc()) {
8                 $u_str = stripslashes($u_str);
9         }
10         $u_str = htmlspecialchars($u_str);
11         return str_replace(array(",",'$'), array("&#44;","&#36;"), $u_str);
12 }
13  
37 roytam 14 function matchCIDR($addr, $cidr) {
15         list($ip, $mask) = explode('/', $cidr);
16         return (ip2long($addr) >> (32 - $mask) == ip2long($ip.str_repeat('.0', 3 - substr_count($ip, '.'))) >> (32 - $mask));
17 }
18 /* 取得 (Transparent) Proxy 提供之 IP 參數 */
19 function getREMOTE_ADDR(){
20         if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
21                 $tmp = preg_split('/[ ,]+/', $_SERVER['HTTP_X_FORWARDED_FOR']);
22                 return $tmp[0];
23         }
24         return $_SERVER['REMOTE_ADDR'];
25 }
26  
160 roytam 27 function reCAPTCHA($title,$desc) {
28         global $key,$FROM1,$mail,$subject,$MESSAGE,$c_pass;
29         require_once './recaptchalib.php';
30         $publickey = ""; // you got this from the signup page
31         $privatekey = ""; // (same as above)
32         $error = '';
33  
34         if($_POST["recaptcha_response_field"]) {
35         $resp = recaptcha_check_answer ($privatekey,
36                                         $_SERVER["REMOTE_ADDR"],
37                                         $_POST["recaptcha_challenge_field"],
38                                         $_POST["recaptcha_response_field"]);
39  
40         if ($resp->is_valid)
41                 return true;
42         else
43             $error = $resp->error;
44         }
45         echo '<html><head><title>'.$title.'</title>
46 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
47 <body>'.$desc.'
48 <form method="post" action="'.$_SERVER['PHP_SELF'].'">
49 <input type="hidden" name="key" value="'.$key.'"><input type="hidden" name="nick" value="'.$FROM1.'"><input type="hidden" name="mail" value="'.$mail.'"><br>
50 <input type="hidden" name="subject" value="'.$subject.'">
51 <input type="hidden" name="content" value="'.$MESSAGE.'"><input type="hidden" name="url" value="">
52 <input type="hidden" name="delk" value="'.$c_pass.'">';
53         echo recaptcha_get_html($publickey, $error);
54         echo '<input type="submit" value="確認">
55 </form>
56 </body></html>';
57         return false;
58 }
59  
5 roytam 60 $subject = CleanStr($_REQUEST['subject']);
61 $FROM1 = $_REQUEST['nick'];
62 $FROM = CleanStr($_REQUEST['nick']);
63 $FROM = ereg_replace("[\r\n]", "", $FROM);
64 $MESSAGE = CleanStr($_REQUEST['content']);
65 $mail = Cleanstr($_REQUEST['mail']);
66 $c_pass = $_REQUEST['delk'];
67 $delk = substr(md5($_REQUEST['delk']), 2, 8);
68 $key = $_REQUEST['key'];
38 roytam 69 $HOST = gethostbyaddr($IP=getREMOTE_ADDR());
5 roytam 70  
71 if (ereg("^( | |\t)*$", $MESSAGE)) {
38 roytam 72         error("本文がありません!", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 73 }
74 if ($key == "" && (ereg("^( | |\t)*$", $subject))) {
38 roytam 75         error("サブジェクトが存在しません!", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 76 }
77 if (!isset($_REQUEST['url']) || (isset($_REQUEST['url']) && $_REQUEST['url']!="")) {
38 roytam 78         error("投稿が禁止されています", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 79 }
38 roytam 80  
160 roytam 81  
82 // reCAPTCHA
83 if(!$key) {
84         if(reCAPTCHA('スレッド作成','スレッド作成のは CAPTCHA 認証が必要です。') === false) exit;
85 }
86  
5 roytam 87 // ホスト、禁止ホスト
38 roytam 88 $IsBanned=false;
5 roytam 89 $killip = file("killip.cgi");
37 roytam 90 $checkTwice = ($IP != $HOST); // 是否需檢查第二次
5 roytam 91 foreach ($killip as $kill) {
92         $kill = rtrim($kill);
37 roytam 93         if ($kill) {
94                 $slash = substr_count($kill, '/');
95                 if($slash==2){ // RegExp
96                         $kill .= 'i';
97                 }elseif($slash==1){ // CIDR Notation
98                         if(matchCIDR($IP, $kill)){ $IsBanned = true; break; }
99                         continue;
100                 }elseif(strpos($kill, '*')!==false || strpos($kill, '?')!==false){ // Wildcard
101                         $kill = '/^'.str_replace(array('.', '*', '?'), array('\.', '.*', '.?'), $kill).'$/i';
102                 }else{ // Full-text
103                         if($IP==$kill || ($checkTwice && $HOST==strtolower($kill))){ $IsBanned = true; break; }
104                         $kill = '/'.str_replace('.','\.',$kill).'/i'; // Go for regmatch
105 //                      continue;
106                 }
107                 if(preg_match($kill, $HOST) || ($checkTwice && preg_match($kill, $IP))){ $IsBanned = true; break; }
5 roytam 108         }
109 }
38 roytam 110 if($IsBanned) error("投稿が禁止されています", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 111  
112 if(count($ngfiles)) {
113         foreach($ngfiles as $ngfile) {
114                 if(is_file($ngfile)) {
115                         $ngwords=explode(',',rtrim(implode('',file($ngfile))));
116                         foreach($ngwords as $value){
12 roytam 117                                 if($value!="" && (strpos($MESSAGE, $value)!==false || strpos($subject ,$value)!==false || strpos($FROM, $value)!==false || strpos($mail,$value)!==false))
38 roytam 118                                         error("投稿が禁止されています", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 119                         }
120                 }
121         }
122 }
12 roytam 123 if(is_file($rengfile)) {
124         $ngwords=file($rengfile);
125         foreach($ngwords as $value){
126                 $value = trim($value);
127                 if($value){
128                         $value="/$value/";
129                         if((preg_match($value,$MESSAGE) || preg_match($value,$subject) || preg_match($value,$FROM) || preg_match($value,$mail)))
38 roytam 130                                 error("投稿が禁止されています", $FROM, $mail, $HOST, $MESSAGE);
12 roytam 131                 }
132         }
133 }
5 roytam 134  
12 roytam 135 // ID 処理
136 /*
5 roytam 137 if (!empty($mail)) {
138         $id = " ID:???";
139 } else {
140         $idnum = substr(strtr($_SERVER["REMOTE_ADDR"], ".", ""), 8);
141         $bbscrypt = ord($_SERVER["PHP_SELF"][3]) + ord($_SERVER["PHP_SELF"][4]);
142         $idcrypt = substr(crypt(($bbscrypt + $idnum), gmdate("Ymd", time() + $TZ * 3600)), -8);
143         $id = " ID:" . $idcrypt;
144 }
12 roytam 145 */
146 // IP
37 roytam 147 $id = " IP:".preg_replace('/\d+$/','*',$IP);
5 roytam 148  
12 roytam 149 $qcnt=$exflg=0;
37 roytam 150 if($extipq && $IP != "127.0.0.1" && strpos($FROM,"fusianasan")===false && strpos($FROM,"mokorikomo")===false) {
151         $rev = implode('.', array_reverse(explode('.', $IP)));
12 roytam 152         $queries = array( 'list.dsbl.org','bbx.2ch.net','dnsbl.ahbl.org','niku.2ch.net','virus.rbl.jp','ircbl.ahbl.org','tor.ahbl.org' );
153         foreach ( $queries as $query ) {
154                 $qres=gethostbyname($rev.'.'.$query);
155                 if($rev.'.'.$query!=$qres){ $exflg=1; break; }
156                 $qcnt++;
157                 if($qcnt>=$extipq) break;
158         }
159 }
38 roytam 160 if($exflg) error("投稿が禁止されています (#".$qcnt.')', $FROM, $mail, $HOST, $MESSAGE);
12 roytam 161  
162  
38 roytam 163 $FROM = str_replace("fusianasan", "</b>" . $HOST . "<b>", $FROM); //fusianasan?
37 roytam 164 $FROM = str_replace("mokorikomo", "</b>" . $IP . "<b>", $FROM); //mokorikomo?
5 roytam 165  
166 $MESSAGE = str_replace("\r\n", "\r", $MESSAGE); //改行文字の統一。
167 $MESSAGE = str_replace("\r", "\n", $MESSAGE);
168 /* 投稿制限 */
38 roytam 169 if (substr_count($MESSAGE, "\n") > $postline) error("改行が多すぎます!", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 170 // $temp = str_replace("\n", "\n"."a",$MESSAGE);
171 // if(strlen($temp)-strlen($MESSAGE) > $postline){ error("投稿行数が長すぎます!"); }
172 if (strlen($MESSAGE) > $postbyte) {
38 roytam 173         error("本文が長すぎます!", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 174 }
175  
176 $MESSAGE = str_replace("\n", "<br>", $MESSAGE); //改行文字の前に<br>を代入する。
177 $now = gmdate("Y/m/d(D) H:i", time() + $TZ * 3600);
178 $now .= $id;
179  
180 if ($subject) $key = time();
181  
182 /* レスポンスアンカー */
183 $MESSAGE = preg_replace("/(^|r>)(&gt;){1,2}(\d+)-(\d+)/si", "\\1<a href=\"{$dir_path}read.php/$key/\\3-\\4\" target=_blank>&gt;&gt;\\3-\\4</a>", $MESSAGE);
184 $MESSAGE = preg_replace("/(^|r>)(&gt;){1,2}(\d+)/si", "\\1<a href=\"{$dir_path}read.php/$key/\\3n\" target=_blank>&gt;&gt;\\3</a>", $MESSAGE);
185  
186 /* 多重カキコチェック */
187 $last = fopen($last_file, "r+");
188 $lsize = fread($last, filesize($last_file));
189 list($lname, $lcom) = explode("\t", $lsize);
190 if ($FROM == $lname && $MESSAGE == $lcom) {
38 roytam 191         error("二重かきこですか??", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 192 }
193 rewind($last);
194 fputs($last, "$FROM\t$MESSAGE\t");
195 fclose($last);
196  
197 $mail1 = $mail;
198 $FROM = str_replace("★", "☆", $FROM);
199 $FROM = str_replace("◆", "◇", $FROM);
200 /* トリップ */
201 if (strstr($FROM, "#")) {
202         $pass = substr($FROM, strpos($FROM, "#") + 1);
203         $pass = str_replace('&#44;', ',', $pass);
204         $salt = substr($pass . "H.", 1, 2);
205         $salt = ereg_replace("[^\.-z]", ".", $salt);
206         $salt = strtr($salt, ":;<=>?@[\\]^_`", "ABCDEFGabcdef");
207         $FROM2 = substr($FROM, 0, strpos($FROM, "#"));
208         $FROM = $FROM2 . " ◆" . substr(crypt($pass, $salt), -10);
209 }
210 /* キャップ */
211 if (file_exists("cap.php") && strstr($mail, "#")) {
212         $caparr = file("cap.php");
213         for($c = 0; $c < count($caparr); $c++) {
214                 list($he, $cname, $cpass, $fo) = explode("<>", $caparr[$c]);
215                 $cap = substr($mail, strpos($mail, "#"));
216                 if ($cap == "#$cpass") {
217                         if ($FROM) $FROM .= " @";
218                         $FROM .= "$cname ★";
219                         break;
220                 }
221         }
222         $mail = substr($mail, 0, strpos($mail, "#"));
223 }
224 if (ereg("^( | |\t)*$", $FROM)) {
225         $FROM = $nanasi;
226 }
227 // 記事フォーマット
228 $newlog = "$FROM,$mail,$now,$MESSAGE,$subject\n";
38 roytam 229 $newcgi = "$FROM,$mail,$now,$MESSAGE,$subject,$HOST,$delk,\n";
5 roytam 230 // スレ一覧読み込む
231 $subj_arr = file($sub_back);
232 // 親スレ投稿の場合、ファイル作成
233 if ($subject) {
234         // 既にある場合(time())は1増やす(意味無いかも
235         if (file_exists("$ddir$key$ext")) $key++;
236         $fp = fopen("$ddir$key$ext", "w");
237         fputs($fp, $newlog);
238         fclose($fp);
239         // 読み込み不可ファイル生成
240         $fc = fopen("$ddir$key$ext_cgi", "w");
241         fputs($fc, $newcgi);
242         fclose($fc);
243         // パーミッション666にする
244         chmod("$ddir$key$ext", 0666);
245         chmod("$ddir$key$ext_cgi", 0666);
246         // スレ一覧の先頭に加える
247         $new_subj = "$key$ext,$subject(1)\n";
248         array_unshift($subj_arr, $new_subj);
249         // レス投稿の場合
250 } else {
251         // レスファイル名
252         $resfile = $ddir . $key . $ext;
253         $cgifile = $ddir . $key . $ext_cgi;
38 roytam 254         if (!file_exists($resfile)) error("書き込もうとしているスレッドは存在しないか、削除されています。。。", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 255         // 該当レス読み込む
256         $res_arr = file($resfile);
257         // レス数取得
258         $resline = count($res_arr);
259         // カウントアップ
260         $resline += 1;
261         // レス数制限オーバー
262         if ($resline > $numlimit) {
263                 chmod($resfile, 0444);
264                 // chmod($cgifile, 0444);
265         }
266  
267         if ($resline == $numlimit) {
268                 $nextnum = $numlimit + 1;
269                 $MESSAGE = "[color=red]このスレッドは $numlimit を超えました<br />もう書けないので新しいスレッドを立てて下さい[/color]";
270                 $newlog .= "$nextnum,,Over $numlimit Thread,$MESSAGE,\n";
271                 $resline = $nextnum;
272         }
273         // レス書き込み
38 roytam 274         if (!is_writable($resfile)) error("現在この掲示板は読取専用です。ここは待つしかない。。。", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 275  
38 roytam 276         $re = fopen($resfile, "a") or error("このスレッドは停止されてます。もう書けない。。。", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 277         fputs($re, $newlog);
278         fclose($re);
279  
38 roytam 280         $recgi = fopen($cgifile, "a") or error("このスレッドは停止されてます。もう書けない。。。", $FROM, $mail, $HOST, $MESSAGE);
5 roytam 281         fputs($recgi, $newcgi);
282         fclose($recgi);
283         // レスカウントアップ
284         for ($r = 0; $r < count($subj_arr); $r++) {
285                 list($kdate, $t_r) = explode(",", $subj_arr[$r]);
286                 $t_r = str_replace(")", "", $t_r);
287                 list($title, $rescnt) = explode("(", $t_r);
288                 list($dkey,) = explode(".", $kdate);
289                 if ($dkey == $key) {
290                         if (strstr($mail, "sage")) {
291                                 $subj_arr[$r] = "$kdate,$title($resline)\n";
292                         } else {
293                                 array_unshift($subj_arr, "$kdate,$title($resline)\n");
294                                 array_splice($subj_arr, $r + 1, 1);
295                         }
296                 }
297         }
298 }
299 // subback.html更新、全部
300 $bf = fopen($sub_back, "w");
301 flock($bf, 2);
302 reset($subj_arr);
303 fputs($bf, implode('', $subj_arr));
304 fclose($bf);
305 // subject.txt更新、一定数に収める
306 $sf = fopen($subj_file, "w");
307 flock($sf, 2);
308 for($i = 0; $i < $thre_def; $i++) {
309         fputs($sf, $subj_arr[$i]);
310 }
311 fclose($sf);
312 // $cookval = implode(",", array($FROM1,$mail1));
313 /*if (function_exists("mb_convert_encoding")) {
314         $FROM1 = mb_convert_encoding($FROM1, "UTF-8", "SJIS");
315         $mail1 = mb_convert_encoding($mail1, "UTF-8", "SJIS");
316 } else {
317         require_once('jcode.php');
318         include_once('code_table.jis2ucs');
319         $FROM1 = JcodeConvert($FROM1, 0, 4);
320         $mail1 = JcodeConvert($mail1, 0, 4);
321 }*/
322  
323 setcookie("NAME", $FROM1, time() + 30 * 24 * 3600);
324 setcookie("MAIL", $mail1, time() + 30 * 24 * 3600);
325 setcookie("PASS", $c_pass, time() + 30 * 24 * 3600);
326  
327 include("index.inc");
328 // header("Location: bbs.php?mode=remake");
329 echo '<html><head><title>書きこみました。</title>
330 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
331 <META http-equiv="refresh" content="1;URL=./?"></head>
332 <body>書きこみが終わりました。<br><br>画面を切り替えるまでしばらくお待ち下さい。<br><br><br><br><br><hr></body></html>';
333  
334 ?>