rtoss - Blame information for rev 37

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