-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbbs.cgi
More file actions
2636 lines (2575 loc) · 130 KB
/
bbs.cgi
File metadata and controls
2636 lines (2575 loc) · 130 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?php
header("Content-Type: text/html; charset=Shift_JIS");
$NOWTIME = time();
$BBQSERV = "/virtual/banana356s/public_html/rentalbbs/"; #格納鯖のパス
$PATH = $BBSSERV.$_POST['bbs']."/";
# ホスト名を取得
$HOST = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$SID = $_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
$REMOTE_HOST = $HOST;
$DUA = $_SERVER[HTTP_USER_AGENT];
#######################################################################
# IPv6接続かどうかをチェックする
# IPアドレスの先端を取り出す
#######################################################################
$REMOTEADDR = $_SERVER['REMOTE_ADDR']; #IPアドレスを入れる(IPv6用)
# IPv6とIPv4を判別
$count_semi = substr_count($_SERVER['REMOTE_ADDR'], ':');
$count_dot = substr_count($_SERVER['REMOTE_ADDR'], '.');
if ($count_semi > 0 and $count_dot == 0) $ipv6 = $_SERVER['REMOTE_ADDR'];
# IPアドレス範囲
if ($ipv6) {
$d = explode(":", $_SERVER['REMOTE_ADDR']);
$HOST = $_SERVER['REMOTE_ADDR'];
$_SERVER['REMOTE_ADDR'] = $d[0].":".$d[1].":".$d[2].":".$d[3]; #後半は端末ごとに変わるので切り捨て
if (isset($d)) {
$c = count($d);
$iprange = $d[0].":".$d[1].":".substr($d[2], 0, 1);
}
}else {
#IPv4でリモートホストがおかしいときは修正
if ($HOST != gethostbyaddr($_SERVER['REMOTE_ADDR'])) $HOST = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$d = explode(".", $_SERVER['REMOTE_ADDR']);
if (isset($d)) {
$c = count($d);
$range = $d[0];
$iprange = $d[0].".".$d[1];
}
}
$file_ipaddr = str_replace(".", "", $_SERVER['REMOTE_ADDR']);
$file_ipaddr = str_replace(":", "", $file_ipaddr);
#######################################################################
# 文字コード変換(UTF-8 -> Shift_JIS)
#######################################################################
$default_substitute_char = mb_substitute_character(); #デフォルトの設定を取っておく
mb_substitute_character('entity'); #絵文字・特殊文字対策
# UTF-8を検出し文字コード変換
if (is_utf8($_POST['submit'].$_POST['MESSAGE'].$_POST['subject'].$_POST['FROM'].$_POST['mail']) === true) mb_convert_variables('SJIS-win','UTF-8',$_POST);
mb_substitute_character($default_substitute_char); #設定を戻す
#######################################################################
#
#######################################################################
# Ruthless Angel
if (is_file($BBSSERV."/".date('z')."/403_".$file_ipaddr.".cgi")) DispError2("ERROR!","<h1>You just summoned a Ruthless Angel. あなたは残酷な天使を召喚しました。</h1><h2>Your IP address is ".$REMOTEADDR."</h2><div>I am a Ruthless Angel.<br>私は、残酷な天使。<br>ERROR! Your post is too excessive.<br>エラー! あなたの投稿は過剰すぎます。<br>I am regulated you.<br>私はあなたを規制しました。<br>So you will not be able to write for a while.<br>なので(従って)、あなたはしばらく書き込めません。</div>","9998 Banned;");
# おかしなアクセス
if ($_SERVER["REQUEST_METHOD"] != "POST") DispError("ERROR!","ERROR: Recieve GET METHOD: POST メソッドを使ってください。","2400 Invalid GET METHOD.;");
#-------------------------------特定条件のUAを変換
# あり得ないUA
if (strpos($_SERVER['HTTP_USER_AGENT'], 'JaneStyle/') !== false or strpos($_SERVER['HTTP_USER_AGENT'], 'BB2C') !== false or strpos($_SERVER['HTTP_USER_AGENT'], 'mae2c/6.0.0') !== false) DispError("ERROR!","ERROR: しばらくお断りしております。[".$_POST['bbs']."]","9990 Banned;");
##########################################################
# JaneStyle_mobile対応までの暫定
if (strpos($_SERVER['HTTP_USER_AGENT'], 'JaneStyle') !== false) DispError("ERROR!","ERROR: しばらくお断りしております。[".$_POST['bbs']."]","9990 Banned;");
##########################################################
# BB2C
$_SERVER['HTTP_USER_AGENT'] = str_replace('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', "Monazilla/1.00 (BB2C 1.3.95; iOS 16.0.0 iPhone)", $_SERVER['HTTP_USER_AGENT']);
# mae2c
$_SERVER['HTTP_USER_AGENT'] = str_replace('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393', "Monazilla/1.00 mae2c/6.0.0 iOS16.0.0 iPhone", $_SERVER['HTTP_USER_AGENT']);
# JaneStyle
$_SERVER['HTTP_USER_AGENT'] = str_replace('Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko', "Monazilla/1.00 JaneStyle/4.23 Windows/10.0 Trident/7.0; rv:11.0", $_SERVER['HTTP_USER_AGENT']);
if ($_SERVER['HTTP_ACCEPT'] == "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" and strpos($_SERVER['HTTP_USER_AGENT'], 'Windows') !== false) $_SERVER['HTTP_USER_AGENT'] = str_replace('Mozilla/', "Monazilla/1.00 Jane/", $_SERVER['HTTP_USER_AGENT']);
# Mozilla -> Monazilla
if ($_SERVER['HTTP_ACCEPT'] == "*/*") $_SERVER['HTTP_USER_AGENT'] = str_replace('Mozilla/5.0', "Monazilla/1.00", $_SERVER['HTTP_USER_AGENT']);
#====================================================
# 入力情報を取得(POST)
#====================================================
#数値実体参照を数える
$emojix = preg_match_all("/&#x[A-za-z0-9]{1,};/", $_POST['MESSAGE'], $matches);
$emojia = preg_match_all("/&#[0-9]{1,6};/", $_POST['MESSAGE'], $matches);
$semojix = preg_match_all("/&#x[A-za-z0-9]{1,};/", $_POST['subject'], $matches);
$semojia = preg_match_all("/&#[0-9]{1,6};/", $_POST['subject'], $matches);
$emoji = $emojix + $emojia + $semojix + $semojia;
if (preg_match('/�?10[^0-9]/', $_POST['MESSAGE']) or preg_match('/&#[xX]0?a[^a-zA-Z0-9]/', $_POST['MESSAGE']) or preg_match('/�?10[^0-9]/', $_POST['subject']) or preg_match('/&#[xX]0?a[^a-zA-Z0-9]/', $_POST['subject'])) DispError("ERROR!","ERROR: 使用できない文字が含まれています。","9990 Banned;"); #不正文字を検出
if (!$emoji) {
if (strpos($_POST['subject'], '&#') !== false or strpos($_POST['MESSAGE'], '&#') !== false or strpos($_POST['FROM'], '&#') !== false) $emoji = true;
}
#====================================================
# 板・スレ情報の取得(設定ファイル)
#====================================================
#設定ファイルを読む
$set_file = $PATH . "SETTING.TXT";
if (is_file($set_file)) {
$set_str = file($set_file);
foreach ($set_str as $tmp){
$tmp = trim($tmp);
list ($name, $value) = explode("=", $tmp);
$SETTING[$name] = $value;
$BSETTING[$name] = $value;
}
}
#設定ファイルがない
else DispError2("ERROR!","ERROR: 存在しない板に投稿しようとしています。");
#######################################################################
# Googleログイン関連
#######################################################################
if ($BSETTING['Use_Account']) {
# ログイン用に取り出しておく
$gid = str_replace("#", "", $_POST['mail']);
if (is_file("/virtual/banana356s/public_html/rentalbbs/gid/".$gid.".cgi")) {
$_COOKIE[secretkey] = $gid;
}else {
if (!is_file("/virtual/banana356s/public_html/rentalbbs/gid/".$_COOKIE[secretkey].".cgi")) $_COOKIE[secretkey] = '';
}
if ($_COOKIE[secretkey]) {
$gpath = "/virtual/bbs3ch/public_html/rentalbbs/gid/".$_COOKIE[secretkey].".cgi";
#if (filemtime($gpath) < $NOWTIME - 2592000) DispError("ERROR!","ERROR: ログイン後31日が経過しました。再度ログインしてください。","G7000 Please login;");
$BANF = $BBSSERV."/".date('z')."/BAN_".$_COOKIE[secretkey].".cgi";
if ($BSETTING['Use_Banned'] == "checked" and is_file($BANF)) DispError("ERROR!","ERROR: このアカウントはスパムであると判定されたため日付が変わるまで投稿できません。","G7900 Banned;");
$login = true;
$SID = $_COOKIE[secretkey];
$_SESSION['REMOTE_ADDR'] = $_COOKIE[secretkey];
setcookie("secretkey", $_COOKIE[secretkey], $NOWTIME+2592000, "/", "rentalbbs.net");
}
}
#-------------------------------read.cgi以外からの投稿でCAPTCHAを通してない場合は認証画面を出す
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false) {
if (!$_POST['cert'] and $_POST['key']) DispError("ERROR!","ERROR: 新仕様に対応した専用ブラウザをご利用ください。","E3001 Unavailable an old dedicated browser.;");
if (!$login) {
#--------------未ログイン時の処理 ここから-------
if (!isset($_POST['g-recaptcha-response']) and !$_GET['manment']) {
# if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) or strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') Kakunin();
}
#--------------未ログイン時の処理 ここまで-------
}
}else {
#-------------------------------サードパーティー製アプリからの投稿を禁止する
if ($BSETTING['third_party_apps_post'] != "enable") {
Header("HTTP/1.0 401 Unauthorized");
exit("Error Code: Could not authenticate you.;");
}
}
#############################################################################
# 「いきなり」チェックするルーチン
# 歴史的事情がたくさんあるようなので、更新時には注意すること
#############################################################################
if (get_magic_quotes_gpc()) $_POST = array_map("stripslashes", $_POST);
$_POST['subject'] = str_replace(array("\r\n","\r","\n"), " ", $_POST['subject']);
$_POST['FROM'] = str_replace('"', """, $_POST['FROM']);
$_POST['FROM'] = str_replace("<", "<", $_POST['FROM']);
$_POST['FROM'] = str_replace(">", ">", $_POST['FROM']);
$_POST['FROM'] = str_replace("'", "'", $_POST['FROM']);
$_POST['FROM'] = str_replace("&", "", $_POST['FROM']);
$_POST['FROM'] = str_replace(array("\r\n","\r","\n"), " ", $_POST['FROM']);
$_POST['FROM'] = trim($_POST['FROM']);
$_POST['mail'] = htmlspecialchars($_POST['mail'], ENT_QUOTES, 'SJIS');
$_POST['mail'] = str_replace(array("\r\n","\r","\n"), " ", $_POST['mail']);
$_POST['mail'] = trim($_POST['mail']);
$_POST['bbs'] = str_replace(array(".","/","|"), "", $_POST['bbs']);
$_POST['key'] = str_replace(array(".","/","|"), "", $_POST['key']);
$_POST['MESSAGE'] = str_replace('"', """, $_POST['MESSAGE']);
$_POST['MESSAGE'] = str_replace("<", "<", $_POST['MESSAGE']);
$_POST['MESSAGE'] = str_replace(">", ">", $_POST['MESSAGE']);
$_POST['MESSAGE'] = str_replace("'", "'", $_POST['MESSAGE']);
$_POST['MESSAGE'] = str_replace("&", "", $_POST['MESSAGE']);
$_POST['MESSAGE'] .= " ";
$_POST['MESSAGE'] = rtrim($_POST['MESSAGE']);
$_POST['MESSAGE'] = str_replace(array("\r\n","\r","\n"), "<br>", $_POST['MESSAGE']);
# NGワード
if ($BSETTING['change_sakujyo'] == "checked" and !$admin) {
$_POST['FROM'] = str_replace("管理", '"管理"', $_POST['FROM']);
$_POST['FROM'] = str_replace("削除", '"削除"', $_POST['FROM']);
$_POST['FROM'] = str_replace("sakujyo", '"sakujyo"', $_POST['FROM']);
}
# 全角#のパス漏れ防止
#香美バグのためmb_ereg_replaceにしようかとも考えたが中止
$_POST['FROM'] = str_replace("#", "#", $_POST['FROM']);
$_POST['mail'] = str_replace("#", "#", $_POST['mail']);
# read.html対応用
# AAを検出
if ($BSETTING['aa_check'] == "checked") {
if (strpos($_POST['MESSAGE'], '∧') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '_') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], ' ̄') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '彡') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], 'U') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '<') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '/') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '\') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '<') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '┼') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '┬') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '::') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], '≡') !== false) $aa = 1;
if (strpos($_POST['MESSAGE'], ':.') !== false) $aa = 1;
}
# 偽キャップ、偽トリップ変換
$_POST['FROM'] = str_replace("★", "☆", $_POST['FROM']);
$_POST['FROM'] = str_replace("◆", "◇", $_POST['FROM']);
# 本文を行ごとに分割
$msgbr = explode("<br>", $_POST['MESSAGE']);
if (!$_POST['bbs']) endhtml("2600 Invalid Post.;");
# subjectもkeyも両方ある/両方ない
if (($_POST['subject'] and $_POST['key']) or (!$_POST['subject'] and !$_POST['key'])) endhtml("2600 Invalid Post.;");
# キーが数字じゃない場合ばいばい!
if (preg_match("/\D/", $_POST['key'])) endhtml("2600 Invalid Post.;");
# ありえないホスト
if (stristr($HOST, "proxy") or stristr($HOST, "cache") or stristr($HOST, "mail") or stristr($HOST, "www") or stristr($HOST, "mail") or stristr($HOST, "googleusercontent.com") or stristr($HOST, "vpn") or stristr($HOST, "tor")) DispError("ERROR!","ERROR: このホストからはdelightに投稿できません。","9990 Banned;");
# 最近の素のIE8はUAがとても長いので、256ではきつすぎ
if (strlen($_SERVER['HTTP_USER_AGENT']) > 384 or strlen($_SERVER['HTTP_USER_AGENT']) != mb_strlen($_SERVER['HTTP_USER_AGENT'],"SJIS") or strlen($_SERVER['HTTP_USER_AGENT']) < 7 or strpos($_SERVER['HTTP_USER_AGENT'], '<') !== false or strpos($_SERVER['HTTP_USER_AGENT'], '>') !== false) endhtml("2600 Invalid Post.;");
# Mozilla/Monazilla どちらも含まれていない
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') === false and strpos($_SERVER['HTTP_USER_AGENT'], 'Monazilla') === false) endhtml("2600 Invalid Post.;");
# 変な文字
if (strpos($_POST[MESSAGE], '​') !== false) DispError("ERROR!","ERROR: 使用できない文字が含まれています。","9990 Banned;");
# 本文なし
if (strlen($_POST['MESSAGE']) == 0) DispError("ERROR!","ERROR: 本文がありません。","2031 Message is empty;");
#==================================================
# トリップ
#==================================================
#名前欄は先に取っておく
$Cookname = $_POST[FROM];
# トリップ
$_POST['FROM'] = str_replace("&#", '&!E', $_POST['FROM']);
if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $tr)) {
$_POST['FROM'] = $tr[1].nametrip("#".$tr[2]);
}
$_POST['FROM'] = str_replace("&!E", '&#', $_POST['FROM']);
#######################################################################
# キャップ
#######################################################################
# 管理
if (preg_match("/([^\#]*)\#(.+)/", $_POST['mail'], $ca)) {
$pass1 = file_get_contents($PATH."pass.cgi");
if ($ca[2] == $pass1) {
if ($_POST['FROM']) $_POST['FROM'] .= "@管理人 ★";
else $_POST['FROM'] = "管理人 ★";
$admin = 1;
$cap = 1;
$CAPID = "administrator";
}
}
# 通常
if (preg_match("/([^\#]*)\#(.+)/", $_POST['mail'], $ca)) {
if (is_file($PATH."cap.cgi")) {
$cap_str = file($PATH."cap.cgi");
foreach ($cap_str as $tmp){
$tmp = trim($tmp);
if (!$tmp or strpos($tmp, '#') !== false or strpos($tmp, '<>') === false) continue;
list($name1,$pass1,$a1,$caid) = explode("<>", $tmp);
if ($ca[2] == $pass1) {
if ($_POST['FROM']) $_POST['FROM'] .= "@$name1 ★";
else $_POST['FROM'] = "$name1 ★";
if ($a1 != "plus" and $a1 != "ncmd" and $a1 != "sakud") $admin = 1;
if ($a1 == "ncmd") $kaihi = 1;
if ($a1 == "sakud") $sakud = 1;
$cap = 1;
if ($caid) $CAPID = $caid;
else $CAPID = "CAP_USER";
break;
}
}
}
}
if (preg_match("/([^\#]*)\#(.+)/", $_POST['mail'], $ca)) {
$Cookmail = $_POST['mail'];
$_POST['mail'] = $ca[1];
}
#名前とメールを保存
if (!$Cookmail) $Cookmail = $_POST[mail];
$_SESSION["NAME"] = $Cookname;
$_SESSION["MAIL"] = $Cookmail;
if ($admin || $kaihi || strstr($_POST['FROM'], "!ch2kanri3")) $errorskip = 1;
$_POST['FROM'] = str_replace("!ch2kanri3", "", $_POST['FROM']);
#====================================================
# 各種PATH生成&日付・時刻を設定
#====================================================
$DATE = date("Y/m/d H:i:s", $NOWTIME);
$SIDPATH = $BBQSERV."agreement/sess_";
$RESFILE = $PATH."res.cgi";
$bbx_kiroku = $BBQSERV."bbx.cgi";
$subjectfile = $BBSSERV.$_POST[bbs]."/subject.txt";
if (!isset($_POST['subject'])) $_POST['subject'] = '';
if (!isset($_POST['FROM'])) $_POST['FROM'] = '';
if (!isset($_POST['mail'])) $_POST['mail'] = '';
if (!isset($_POST['bbs'])) $_POST['bbs'] = '';
if (!isset($_POST['key'])) $_POST['key'] = '';
if (!isset($_POST['MESSAGE'])) $_POST['MESSAGE'] = '';
$zumbatime = 256;
#######################################################################
# 記録用ディレクトリをチェック
#######################################################################
$file_ipaddr1 = str_replace(".", "", $REMOTEADDR);
$file_ipaddr1 = str_replace(":", "", $file_ipaddr1);
if (!file_exists($BBSSERV."/".date('z'))) {
#日付が変わった時の処理
@mkdir($BBSSERV."/".date('z'), 0777, true);
}
#前日分を消去
$maedz = date('z') - 1;
if (file_exists($BBSSERV."/".$maedz)) {
$maedzs = $BBSSERV."/".$maedz."/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/".$maedz);
}
if (date('z') != 364 and file_exists($BBSSERV."/364")) {
$maedzs = $BBSSERV."/364/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/364");
}
if (date('z') != 365 and file_exists($BBSSERV."/365")) {
$maedzs = $BBSSERV."/366/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/365");
}
if (date('z') != 366 and file_exists($BBSSERV."/366")) {
$maedzs = $BBSSERV."/366/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/366");
}
#-------------------------------板毎
if (!file_exists($BBSSERV."/tmp/".$_POST['bbs'].date('z'))) {
#日付が変わった時の処理
@mkdir($BBSSERV."/tmp/".$_POST['bbs'].date('z'), 0777, true);
}
#前日分を消去
$maedz = date('z') - 1;
if (file_exists($BBSSERV."/tmp/".$_POST['bbs'].$maedz)) {
$maedzs = $BBSSERV."/tmp/".$_POST['bbs'].$maedz."/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/tmp/".$_POST['bbs'].$maedz);
}
if (date('z') != 364 and file_exists($BBSSERV."/tmp/".$_POST['bbs']."364")) {
$maedzs = $BBSSERV."/tmp/".$_POST['bbs']."364/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/tmp/".$_POST['bbs']."364");
}
if (date('z') != 365 and file_exists($BBSSERV."/tmp/".$_POST['bbs']."365")) {
$maedzs = $BBSSERV."/tmp/".$_POST['bbs']."365/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/tmp/".$_POST['bbs']."365");
}
if (date('z') != 366 and file_exists($BBSSERV."/tmp/".$_POST['bbs']."366")) {
$maedzs = $BBSSERV."/tmp/".$_POST['bbs']."366/*.*";
@array_map('unlink', glob($maedzs));
@rmdir($BBSSERV."/tmp/".$_POST['bbs']."_366");
}
#############################################################################
# 端末判定(USER_AGENT)
#############################################################################
#-------------------------------端末・ブラウザ情報を取得
if ($_SERVER['HTTP_SEC_CH_UA_FULL_VERSION_LIST']) $_SERVER['HTTP_SEC_CH_UA'] = $_SERVER['HTTP_SEC_CH_UA_FULL_VERSION_LIST'];
if ($_SERVER['HTTP_SEC_CH_UA_PLATFORM_VERSION'] or $_SERVER['HTTP_SEC_CH_UA_MODEL']) $terminal = $_SERVER['HTTP_SEC_CH_UA_PLATFORM']." ".$_SERVER['HTTP_SEC_CH_UA_PLATFORM_VERSION']." ".$_SERVER['HTTP_SEC_CH_UA_BITNESS']." ".$_SERVER['HTTP_SEC_CH_UA_ARCH']." ".$_SERVER['HTTP_SEC_CH_UA_MODEL']." ".$_SERVER['HTTP_SEC_CH_UA_MOBILE']." ;";
else {
preg_match('/ \((.+)\)/', $_SERVER['HTTP_USER_AGENT'], $m);
$terminal = $m[1]." ;";
if (!$m[1]) {
preg_match('/(iOS.+)/', $_SERVER['HTTP_USER_AGENT'], $m);
$terminal = $m[1]." ;";
}
}
$USER_AGENT = $_SERVER['HTTP_SEC_CH_UA']." ".$_SERVER['HTTP_ACCEPT']." ".$_SERVER['HTTP_ACCEPT_LANGUAGE']." ".$_SERVER['HTTP_PRIORITY']." ".$_SERVER['CONTENT_TYPE'];
#######################################################################
# PHOEBE
#######################################################################
if (!$login) {
#--------------未ログイン時の処理 ここから-------
$PHOEBELV = $NOWTIME - $_SESSION['firsttime'];
$LV = floor($PHOEBELV / 82800);
if ($PHOEBELV > 600) ++$LV;
if ($PHOEBELV > 3600) ++$LV;
if ($PHOEBELV > 18000) ++$LV;
if ($LV > 40) $LV = 40;
#--------------未ログイン時のみ発行 ここまで-------
}else $LV = 40; #ログイン時は40固定
#############################################################################
# smart phone marks
#############################################################################
if (strpos($HOST, 'spmode') !== false) {
if (strpos($HOST, 'msb') !== false) $SLIP_NAME = "スプッッ";
elseif (strpos($HOST, 'msc') !== false) $SLIP_NAME = "スップ";
elseif (strpos($HOST, 'msd') !== false) $SLIP_NAME = "スッップ";
elseif (strpos($HOST, 'mse') !== false) $SLIP_NAME = "スププ";
elseif (strpos($HOST, 'msf') !== false) $SLIP_NAME = "スフッ";
else $SLIP_NAME = "スプー";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'au-net') !== false) {
if (strpos($HOST, 'KD027') !== false || strpos($HOST, 'kd027') !== false) $SLIP_NAME = "アウアウアー";
elseif (strpos($HOST, 'KD036') !== false || strpos($HOST, 'kd036') !== false) $SLIP_NAME = "アウアウイー";
elseif (strpos($HOST, 'KD106') !== false || strpos($HOST, 'kd106') !== false) $SLIP_NAME = "アウアウウー";
elseif (strpos($HOST, 'KD111') !== false || strpos($HOST, 'kd111') !== false) $SLIP_NAME = "アウアウエー";
elseif (strpos($HOST, 'KD119') !== false || strpos($HOST, 'kd119') !== false) $SLIP_NAME = "アウアウオー";
elseif (strpos($HOST, 'KD182249') !== false || strpos($HOST, 'kd182249') !== false || strpos($HOST, 'KD182250') !== false || strpos($HOST, 'kd182250') !== false || strpos($HOST, 'KD1822512') !== false || strpos($HOST, 'kd1822512') !== false) $SLIP_NAME = "アウアウカー";
elseif (strpos($HOST, 'KD182251') !== false || strpos($HOST, 'kd182251') !== false) $SLIP_NAME = "アウアウキー";
elseif (strpos($HOST, 'UQ') !== false || strpos($HOST, 'uq') !== false) {
$SLIP_NAME = "アウアウクー";
$MM = 1;
}
else $SLIP_NAME = "アウアウ";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'openmobile') !== false) {
$SLIP_NAME = "オッペケ";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'panda-world') !== false) {
if (strpos($HOST, 'tss') !== false || strpos($HOST, 'pw126152') !== false || strpos($HOST, 'pw126161') !== false || strpos($HOST, 'pw126186') !== false || strpos($HOST, 'pw126199') !== false) $SLIP_NAME = "ササクッテロラ";
elseif (strpos($HOST, 'kyb') !== false || strpos($HOST, 'pw126205') !== false || strpos($HOST, 'pw126214') !== false || strpos($HOST, 'pw126225') !== false) $SLIP_NAME = "ササクッテロリ";
elseif (strpos($HOST, 'pw126236') !== false || strpos($HOST, 'pw126237') !== false) $SLIP_NAME = "ササクッテロル";
elseif (strpos($HOST, 'pw126245') !== false || strpos($HOST, 'pw126247') !== false) $SLIP_NAME = "ササクッテロレ";
elseif (strpos($HOST, 'pw126253') !== false || strpos($HOST, 'pw126254') !== false || strpos($HOST, 'pw126255') !== false) $SLIP_NAME = "ササクッテロロ";
else $SLIP_NAME = "ササクッテロ";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'access-internet') !== false) {
$SLIP_NAME = "ア-クセ-";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'e-mobile') !== false) {
$SLIP_NAME = "エ-イモ";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'emobile') !== false) {
$SLIP_NAME = "イモ";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'air.mopera.net') !== false) {
$SLIP_NAME = "エアペラ";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'mopera') !== false) {
$SLIP_NAME = "ペラペラ";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'google-proxy') !== false) {
$SLIP_NAME = "ググレカス";
$SLIP_SP = 1;
}elseif (strpos($HOST, 'wi-fi.wi2') !== false) {
$SLIP_NAME = "ワイーワ2";
$WF = 1;
}elseif (strpos($HOST, 'wi-fi.kddi') !== false) {
$SLIP_NAME = "アウウィフ";
$WF = 1;
}elseif (strpos($HOST, 'm-zone') !== false) {
$SLIP_NAME = "エムゾネ";
$WF = 1;
}elseif (strpos($HOST, 'wi-fi.fc2') !== false) {
$SLIP_NAME = "エフシーツー";
$WF = 1;
}elseif (strpos($HOST, 'wi2.co.jp') !== false || strpos($HOST, 'wi2.ne.jp') !== false) {
$SLIP_NAME = "ワイワイ";
$WF = 1;
}elseif (strpos($HOST, 'freespot.com') !== false) {
$SLIP_NAME = "フリスポ";
$WF = 1;
}elseif (strpos($HOST, '7spot') !== false) {
$SLIP_NAME = "セブン";
$WF = 1;
}elseif (strpos($HOST, 'family-wifi') !== false) {
$SLIP_NAME = "ファミマ";
$WF = 1;
}elseif (strpos($HOST, 'freemobile.jp') !== false) {
$SLIP_NAME = "フリモバ";
$WF = 1;
}elseif (strpos($HOST, 'ntt-bp.net') !== false) {
$SLIP_NAME = "ミカカウィフィ";
$WF = 1;
}elseif (strpos($HOST, 'wi-fi') !== false) {
$SLIP_NAME = "ワイーワ";
$WF = 1;
}elseif (strpos($HOST, 'vmobile') !== false) {
$SLIP_NAME = "ブーイモ";
$MM = 1;
}elseif (strpos($HOST, 'mp') !== false and strpos($HOST, 'ap.nuro.jp') !== false) {
$SLIP_NAME = "ソネット"; # So-net モバイル LTE
$MM = 1;
}elseif (strpos($HOST, 'wimax') !== false || strpos($HOST, 'wmaxuq') !== false) {
$SLIP_NAME = "ワイモマー";
$MM = 1;
}elseif (strpos($HOST, 'wi-gate.net') !== false) {
$SLIP_NAME = "ワキゲー";
$MM = 1;
}elseif (strpos($HOST, 'kualnet.jp') !== false) {
$SLIP_NAME = "ワイエディ";
$MM = 1;
}elseif (strpos($HOST, 'omed01.tokyo') !== false) {
$SLIP_NAME = "ワントンキン";
$MM = 1;
}elseif (strpos($HOST, 'omed01.osaka') !== false) {
$SLIP_NAME = "バッミングク";
$MM = 1;
}elseif (strpos($HOST, 'mineo') !== false) {
$SLIP_NAME = "オイコラミネオ";
$MM = 1;
}elseif (strpos($HOST, 'neoau1') !== false) {
$SLIP_NAME = "ドナドナー";
$MM = 1;
}elseif (strpos($HOST, 'dcm2') !== false) {
$SLIP_NAME = "ドコグロ";
$MM = 1;
}elseif (strpos($HOST, 'libmo') !== false) {
$SLIP_NAME = "ブモー";
$MM = 1;
}elseif (strpos($HOST, 'ap.mvno.net') !== false) {
$SLIP_NAME = "アメ";
$MM = 1;
}else {
$SLIP_NAME = "ワッチョイ";
}
if ($HOST == $_SERVER['REMOTE_ADDR']) {
$SLIP_NAME = "JP";
}
if (strpos($_SERVER[REMOTE_ADDR], '133.106') !== false || strpos($_SERVER[REMOTE_ADDR], '193.119') !== false || strpos($_SERVER[REMOTE_ADDR], '133.100') !== false) {
$SLIP_NAME = "テテンテンテン";
$MM = 1;
}
if (strpos($HOST, 'rakuten') !== false || strpos($_SERVER[REMOTE_ADDR], '240b:c0') !== false) {
$SLIP_NAME = "ラクッペペ";
$MM = 1;
}
if (strpos($_SERVER[REMOTE_ADDR], '103.5.14') !== false) {
$SLIP_NAME = "ワイーワ2";
$WF = 1;
}
if (strpos($HOST, '2001:240:24') !== false) {
$SLIP_NAME = "ブーイモ";
$MM = 1;
}
if (strpos($HOST, '240a:61:') !== false) {
if (strpos($HOST, '240a:61:a') !== false || strpos($HOST, '240a:61:c') !== false || strpos($HOST, '240a:61:e') !== false || strpos($HOST, '240a:61:1') !== false || strpos($HOST, '240a:61:2') !== false || strpos($HOST, '240a:61:3') !== false || strpos($HOST, '240a:61:4') !== false) $SLIP_NAME = "スプッッ";
elseif (strpos($HOST, '240a:61:5') !== false || strpos($HOST, '240a:61:6') !== false || strpos($HOST, '240a:61:7') !== false || strpos($HOST, '240a:61:8') !== false || strpos($HOST, '240a:61:b') !== false || strpos($HOST, '240a:61:9') !== false || strpos($HOST, '240a:61:d') !== false || strpos($HOST, '240a:61:f') !== false) $SLIP_NAME = "スップ";
else $SLIP_NAME = "スプー";
$SLIP_SP = 1;
}
if (strpos($HOST, '240a:6b:') !== false) {
if (strpos($HOST, '240a:6b:a') !== false || strpos($HOST, '240a:6b:c') !== false || strpos($HOST, '240a:6b:e') !== false || strpos($HOST, '240a:6b:1') !== false || strpos($HOST, '240a:6b:2') !== false || strpos($HOST, '240a:6b:3') !== false || strpos($HOST, '240a:6b:4') !== false) $SLIP_NAME = "スッップ";
elseif (strpos($HOST, '240a:6b:5') !== false || strpos($HOST, '240a:6b:6') !== false || strpos($HOST, '240a:6b:7') !== false || strpos($HOST, '240a:6b:8') !== false || strpos($HOST, '240a:6b:b') !== false || strpos($HOST, '240a:6b:9') !== false || strpos($HOST, '240a:6b:d') !== false || strpos($HOST, '240a:6b:f') !== false) $SLIP_NAME = "スププ";
else $SLIP_NAME = "スプッ";
$SLIP_SP = 1;
}
if (strpos($HOST, '2001:268:9') !== false) {
if (strpos($HOST, '2001:268:9a') !== false || strpos($HOST, '2001:268:9e') !== false || strpos($HOST, '2001:268:9f') !== false) $SLIP_NAME = "アウアウアー";
elseif (strpos($HOST, '2001:268:9b') !== false || strpos($HOST, '2001:268:9c') !== false || strpos($HOST, '2001:268:9d') !== false) $SLIP_NAME = "アウアウイー";
elseif (strpos($HOST, '2001:268:98') !== false || strpos($HOST, '2001:268:91') !== false) $SLIP_NAME = "アウアウウー";
elseif (strpos($HOST, '2001:268:92') !== false || strpos($HOST, '2001:268:93') !== false) $SLIP_NAME = "アウアウエー";
elseif (strpos($HOST, '2001:268:94') !== false || strpos($HOST, '2001:268:95') !== false) $SLIP_NAME = "アウアウオー";
elseif (strpos($HOST, '2001:268:96') !== false || strpos($HOST, '2001:268:97') !== false) $SLIP_NAME = "アウアウカー";
elseif (strpos($HOST, '2001:268:99') !== false) $SLIP_NAME = "アウアウキー";
else $SLIP_NAME = "アウアウ";
$SLIP_SP = 1;
}
if (strpos($HOST, '2400:2200:') !== false) {
if (strpos($HOST, '2400:2200:a') !== false || strpos($HOST, '2400:2200:c') !== false || strpos($HOST, '2400:2200:e') !== false) $SLIP_NAME = "ササクッテロラ";
elseif (strpos($HOST, '2400:2200:1') !== false || strpos($HOST, '2400:2200:2') !== false || strpos($HOST, '2400:2200:3') !== false) $SLIP_NAME = "ササクッテロリ";
elseif (strpos($HOST, '2400:2200:4') !== false || strpos($HOST, '2400:2200:5') !== false || strpos($HOST, '2400:2200:6') !== false) $SLIP_NAME = "ササクッテロル";
elseif (strpos($HOST, '2400:2200:7') !== false || strpos($HOST, '2400:2200:8') !== false || strpos($HOST, '2400:2200:b') !== false) $SLIP_NAME = "ササクッテロレ";
elseif (strpos($HOST, '2400:2200:9') !== false || strpos($HOST, '2400:2200:d') !== false || strpos($HOST, '2400:2200:f') !== false) $SLIP_NAME = "ササクッテロロ";
else $SLIP_NAME = "ササクッテロ";
$SLIP_SP = 1;
}
if ($admin) {
$SLIP_NAME = "★";
}
#ID末尾
$slip = "0";
if ($HOST == $_SERVER['REMOTE_ADDR']) {
$slip = "H";
}
if ($MM) {
$slip = "M";
}elseif ($WF) {
$slip = "F";
}elseif (strpos($HOST, 'spmode') !== false || strpos($HOST, '240a:61:') !== false || strpos($HOST, '240a:6b:') !== false) {
$slip = "d";
}elseif (strpos($HOST, 'au-net') !== false || strpos($HOST, '2001:268:9') !== false){
$slip = "a";
}elseif (strpos($HOST, 'panda-world') !== false || strpos($HOST, '2400:2200:') !== false) {
$slip = "p";
}elseif (strpos($HOST, 'openmobile') !== false) {
$slip = "r";
}elseif (strpos($HOST, 'access-internet') !== false) {
$slip = "x";
}elseif (strpos($HOST, 'e-mobile') !== false) {
$slip = "E";
}elseif (strpos($HOST, 'mopera.net') !== false) {
$slip = "D";
}elseif (strpos($HOST, 'google-proxy') !== false) {
$slip = "X";
}
#######################################################################
# IPアドレスを記録
#######################################################################
$ip_file = $BBSSERV."/".date('z')."/".hash('sha256', $HOST.$_SERVER[HTTP_USER_AGENT]).".cgi";
#IPが登録されていなければ記録
if (!is_file($ip_file)) {
file_put_contents($ip_file, $HOST."<>".$_SERVER[HTTP_USER_AGENT]."<>".$terminal." ".$USER_AGENT);
}
#IPが登録(初回記録)された時間を取得
$firsttime = filemtime($ip_file);
#新規スレッド
if ($_POST['subject']) $_POST[key] = $NOWTIME;
#タイトルの変換形式
if ($SETTING['BBS_UNICODE'] != "checked" and !$login) {
$_POST['subject'] = htmlspecialchars($_POST['subject'], ENT_QUOTES, 'SJIS');
}else {
$_POST['subject'] = str_replace('"', """, $_POST['subject']);
$_POST['subject'] = str_replace("<", "<", $_POST['subject']);
$_POST['subject'] = str_replace(">", ">", $_POST['subject']);
$_POST['subject'] = str_replace("'", "'", $_POST['subject']);
$_POST['subject'] = str_replace("&", "?", $_POST['subject']);
$_POST['subject'] .= " ";
$_POST['subject'] = trim($_POST['subject']);
}
#スレッドの場所
$thread_file = $BBSSERV.$_POST['bbs']."/".substr($_POST[key], 0, 4)."/".substr($_POST[key], 0, 5)."/".$_POST['key'].".cgi";
$backup_file = $BBSSERV.$_POST['bbs']."/".substr($_POST[key], 0, 4)."/".substr($_POST[key], 0, 5)."/back_".$_POST['key'].".cgi";
#timecount/timeclose
if (!$BSETTING['timecount']) $BSETTING['timecount'] = 100;
if (!$BSETTING['timeclose']) $BSETTING['timeclose'] = 25;
if ($BSETTING['timeclose'] > $BSETTING['timecount']){
$BSETTING['timeclose'] = $BSETTING['timecount'];
}
#######################################################################
# dat落ちを検出
#######################################################################
$subss = @file($subjectfile);
$tc = 1;
if ($subss) {
foreach ($subss as $tmp){
list($k1,,$r1,) = explode("<>", $tmp);
if ($k1 == $_POST['key']) $isdat = true;
if ($k1 == $_POST['key'] + 1) $isdat1 = true;
++$tc;
}
}
# 924スレは対象外
if (substr($_POST[key], 0, 3) == 900 || substr($_POST[key], 0, 3) == 924) $isdat = true;
#if ($tc > 10 and !$_POST['subject'] and !$isdat and $SETTING['FORCE_SAGE'] != 'on') DispError2("ERROR!","ERROR: 該当するスレッドがありません。https://".$_SERVER[HTTP_HOST]."/test/read.cgi/".$_POST[bbs]."/".$_POST[key]."/","1021 Thread is not alive;");
# 同じファイルが既にあった場合
if ($_POST['subject'] and ($isdat or is_file($thread_file))) {
# +1してOKならそれを使用
if (!$isdat1) $_POST['key'] += 1;
# それもだめだったらごめんなさい
else DispError2("ERROR!","ERROR: 別の人が同時刻にスレッドを立てようとしています。再度お試しください。");
}
#######################################################################
# 新IP初回書込処理&クッキー食いチェック
#######################################################################
if (!$login) {
# if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') === false and $NOWTIME < $firsttime + 5) HoutekiToukouKakunin();
#クッキー食いチェック
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') === false and !$_COOKIE) HoutekiToukouKakunin();
elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false and !$_COOKIE) Kakunin();
}
#====================================================
# スレッドデータ取得
#====================================================
#スレ立て★持ち限定板
if ($_POST['subject'] and $SETTING['BBS_PASSWORD_CHECK'] == "checked" and !$admin and (!$cap or $kaihi or $sakud)) DispError2("ERROR!","ERROR: この掲示板はキャップでなければスレッドを作成することが出来ません。");
if (is_file($thread_file)) {
#スレ立て時刻が被った場合
if ($_POST['subject']) DispError2("ERROR!","ERROR: 別の人が同時刻にスレッドを立てようとしています。再度お試しください。");
#スレッドのデータを読み込む
$LOG = file($thread_file);
#スレッドのレス数=現在のレス番を取得
$number = count($LOG) + 1;
#スレッドタイトルと>>1の情報を取得
list($nb,$name,$mail,$time,$nid,$message,$info,$subject,$threadinfo,,,,$rsid,,$rip,$rfip,) = explode("<>",$LOG[0]);
#スレッド設定をSETTINGに反映
if (!$BSETTING['Forced_Setting']) {
$SETT = unserialize($threadinfo);
foreach ($SETT as $key => $value) $SETTING[$key] = $value;
}
# 主判定
if ($rsid == $SID || $_SERVER['REMOTE_ADDR'] == $rip || $_SESSION['REMOTE_ADDR'] == $rfip) $nusi = 1;
# 副主/アク禁
if (!$nusi) {
if ($SETTING[$SID] == "sub" || $SETTING[$_SERVER[REMOTE_ADDR]] == "sub" || $SETTING[$SESSION[REMOTE_ADDR]] == "sub") $subnusi = 1;
}
if ($SETTING['BBS_DISABLE_NUSI'] == "checked") {
$nusi = 0;
$subnusi = 0;
}
# 新規と判定する秒数
$stime = 600;
# lifetimeルール
#if ($BSETTING['BBS_THREAD_LIFETIME'] and $NOWTIME > $_POST['key'] + $BSETTING['BBS_THREAD_LIFETIME']) DispError2("ERROR!","ERROR: 該当するスレッドがありません。https://".$_SERVER[HTTP_HOST]."/test/read.cgi/".$_POST[bbs]."/".$_POST[key]."/","1021 Thread is not alive;");
if (!$SETTING['MAX_RES']) $SETTING['MAX_RES'] = 1000;
if (!$BSETTING['MAX_RES']) $BSETTING['MAX_RES'] = 1000;
elseif ($SETTING['MAX_RES'] > 2000) $SETTING['MAX_RES'] = 2000;
elseif ($SETTING['MAX_RES'] < 300) $SETTING['MAX_RES'] = 300;
if (strpos($subject, '実況') !== false) $SETTING['LIVE_THREAD'] = 1;
#############################################################################
# 上限超えの処理
#############################################################################
# 1000/2000超えの処理をする
if ($number > $SETTING['MAX_RES'] or $number > 2000) {
if ($number == $SETTING['MAX_RES'] + 1) {
if (is_file($BBSSERV.$_POST['bbs']."/1000.txt")) $maxmsg = @file_get_contents($BBSSERV.$_POST['bbs']."/1000.txt");
if (!$maxmsg) $maxmsg = " このスレッドは".$SETTING['MAX_RES']."を超えました。<br>これ以上書き込みはできません。 ";
$fp = @fopen($thread_file, "a");
fputs($fp, "<>$number<><>Over ".$SETTING['MAX_RES']." Thread<><>".$maxmsg."<><><><><><><><><><>");
fclose($fp);
}
# 1100/2100超え緊急ストッパー(最後の手段)
if ($number > $SETTING['MAX_RES'] + 100 or $number > 2100) DispError2("ERROR!","ERROR: このスレッドには書き込めません。最後の手段!!","1032 Last resort!;");
# 1050/2050超え緊急ストッパー
if ($number > $SETTING['MAX_RES'] + 50 or $number > 2050) DispError2("ERROR!","ERROR: このスレッドには書き込めません。緊急緊急緊急!!","1031 Emergency!;");
DispError2("ERROR!","ERROR: このスレッドはレス数の上限を超えているので書けません。","1030 Thread is stopped;");
}
# 1000超え処理(板)- 最終書き込みから 10 秒以上経過
if ($number > $BSETTING['MAX_RES']) {
list(,,,$t,) = explode("<>", $LOG[$number-2]);
if ($NOWTIME - $t > 10) DispError2("ERROR!","ERROR: 該当するスレッドがありません。https://".$_SERVER[HTTP_HOST]."/test/read.cgi/".$_POST[bbs]."/".$_POST[key]."/","1021 Thread is not alive;");
}
if ($SETTING['THREAD_STOP'] == "yes") DispError2("ERROR!","ERROR: 該当するスレッドがありません。https://".$_SERVER[HTTP_HOST]."/test/read.cgi/".$_POST[bbs]."/".$_POST[key]."/","1021 Thread is not alive;");
if ($SETTING['BBS_FORCE_NONAME'] == "yes" and !$admin) {
$_POST['FROM'] = "";
$SETTING['NANASHI_CHECK'] = 0;
}
if ($SETTING['NOPIC'] == "checked") {
if (preg_match('/.(gif|jpg|jpeg|png)/', $_POST[MESSAGE]) || strpos($_POST['MESSAGE'], 'imgur.com') !== false) DispError2("ERROR!","ERROR: この掲示板・スレッドは画像の投稿が禁止されています。","9990 Banned;");
}
if ($SETTING['timeinterval']) {
list(,,,$t,) = explode("<>", $LOG[$number-2]);
if ($NOWTIME < $t + $SETTING['timeinterval']) DispError("ERROR!","ERROR: Sorry このスレッドでは直前の投稿から".$SETTING['timeinterval']."秒経たなければ書き込むことが出来ません。");
}
}else {
# 新規スレッドの場合
if ($_POST['subject']) {
#ログ格納場所をチェック なければ作成
if(!file_exists($BBSSERV.$_POST['bbs']."/")) @mkdir($BBSSERV.$_POST['bbs']."/", 0777);
if(!file_exists($BBSSERV.$_POST['bbs']."/".substr($_POST[key], 0, 4)."/")) @mkdir($BBSSERV.$_POST['bbs']."/".substr($_POST[key], 0, 4)."/", 0777);
if(!file_exists($BBSSERV.$_POST['bbs']."/".substr($_POST[key], 0, 4)."/".substr($_POST[key], 0, 5)."/")) @mkdir($BBSSERV.$_POST['bbs']."/".substr($_POST[key], 0, 4)."/".substr($_POST[key], 0, 5)."/", 0777);
$number = 1;
$message = $_POST['MESSAGE'];
$info = "";
$subject = $_POST['subject'];
$nusi = 1;
$LOG = array();
$nprocess = true;
}else {
DispError2("ERROR!","ERROR: 該当するスレッドがありません。https://".$_SERVER[HTTP_HOST]."/test/read.cgi/".$_POST[bbs]."/".$_POST[key]."/","1021 Thread is not alive;");
}
}
#############################################################################
#
#############################################################################
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false) $cert = hash('sha256', $BBSSERV.$_SERVER['HTTP_HOST'].$_POST['bbs'].$_POST['key'].$_POST['time'].$subject.$REMOTEADDR.$_SERVER[HTTP_USER_AGENT].$_SERVER[HTTP_ACCEPT_LANGUAGE]);
if (!$login) {
#--------------未ログイン時の処理 ここから-------
#-------------------------------認証鍵
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') === false and !$jane and !$kakunindame and $SETTING['RES_CHECK'] == "checked") {
if (!$_COOKIE['cert'] or !$_COOKIE['time'] or $_COOKIE['time'] < $NOWTIME - 3600) {
$cert = hash('sha256', $BBSSERV.$_SERVER['HTTP_HOST'].$_POST['bbs'].$_POST['key'].$NOWTIME.$subject.$REMOTEADDR.$_SERVER[HTTP_USER_AGENT].$_SERVER[HTTP_ACCEPT_LANGUAGE]);
setcookie("cert", $cert, $NOWTIME+3600, "/");
setcookie("time", $NOWTIME, $NOWTIME+3600, "/");
HoutekiToukouKakunin();
}else {
$cert = hash('sha256', $BBSSERV.$_SERVER['HTTP_HOST'].$_POST['bbs'].$_POST['key'].$_COOKIE['time'].$subject.$REMOTEADDR.$_SERVER[HTTP_USER_AGENT].$_SERVER[HTTP_ACCEPT_LANGUAGE]);
if ($_COOKIE['cert'] and $_COOKIE['cert'] != $cert) HoutekiToukouKakunin();
if ($_COOKIE['time'] > $NOWTIME - 4) DispError("ERROR!","ERROR: 投稿間隔が短すぎます。","9801 Posting is so fast.;");
}
}
#-------------------------------reCAPTCHA
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false) {
if (isset($_POST['g-recaptcha-response'])) {
$url = 'https://www.google.com/recaptcha/api/siteverify';
$param = array(
'secret' => '6Lc-RPUkAAAAAPTaL5FBC7zxj2FkRpg48lLQJcrI',
'response' => $_POST['g-recaptcha-response']
);
$context = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded\r\n',
'content' => http_build_query($param)
)
);
$json = file_get_contents($url, false, stream_context_create($context));
$results = json_decode($json,true);
$success = $results["success"];
$error = $results["error-codes"];
if ($success == false or $error) {
#reCAPTCHA認証に失敗
DispError("ERROR!","ERROR: reCAPTCHA認証に失敗しました。再度お試しください。","9990 Banned;");
}
}
if (!$_POST['submit']) $_POST['submit'] = "書き込む";
$web = true;
$approval = true;
}else {
if ($_GET['manment']) DispError("ERROR!","ERROR: 新仕様に対応した専用ブラウザをご利用ください。","E3001 Unavailable an old dedicated browser.;");
}
#--------------未ログイン時の処理 ここまで-------
}
# 時間をチェック
if ($_POST['time'] > $NOWTIME) {
$diff = $_POST[time] - $NOWTIME;
DispError2("ERROR!","ERROR: 投稿時刻が不正です。(Diff:".$diff.")","1000 Post date is invalid;");
}
# 時間切れ
#if ($_POST['time'] < $NOWTIME - 86400) DispError("ERROR!","ERROR: 認証に失敗しました。スレッドをリロード、またはブラウザを再起動してください。","9990 Banned;");
# 認証用クエリ
#if ($_POST['cert'] and $_POST['cert'] != $cert) DispError("ERROR!","ERROR: 認証に失敗しました。スレッドをリロード、またはブラウザを再起動してください。","9990 Banned;");
#時間が読み込めなかったらばいばい
if (!$_POST['time']) DispError2("ERROR!","ERROR: 不正な投稿です。");
# sage/強制sage
if (strpos($_POST['mail'], 'sage') !== false) $sage = 'checked';
if ($BSETTING['BBS_SOKO'] == 'on') $sage = 1;
if ($BSETTING['BBS_SOKO'] == 'onon') $sage = 0;
#if ($BSETTING['BBS_SOKO'] == 'checked' and $number < 10) $sage = 1;
if ($BSETTING['BBS_SOKO'] == 'on' or $BSETTING['BBS_SOKO'] == 'onon' or $BSETTING['BBS_SOKO'] == 'ononon' and $NOWTIME - $_POST['key'] > 600) {
if (strpos($_POST['mail'], 'soko') !== false) $soko = 1;
}
if (strpos($_POST['mail'], 'age') !== false and strpos($_POST['mail'], 'sage') === false) $sage = 0;
if ($BSETTING['BBS_FORCE_SAGE'] and $NOWTIME > $_POST['key'] + $BSETTING['BBS_FORCE_SAGE']) $sage = 1;
if ($SETTING['FORCE_SAGE'] == 'on') $sage = 'checked';
# ログイン必須
if ($SETTING['BBS_BE_ID'] == "1" and !$login) DispError("ERROR!","ERROR: この掲示板・スレッドはログインユーザーのみ投稿することができます。","G7001 Required login;");
# 勢い1万以上のスレは調整
$a = $NOWTIME - $_POST[key];
$b = $number / $a;
$ikioi = round($b * 86400,1);
if ($ikioi > 99) $ikioi = floor($ikioi);
if ($ikioi > 10000 and $number > 50 and !$login) DispError2("ERROR!","ERROR: スレッド速度が速すぎるため非ログインユーザーに制限を設けております。","8904 Rejected;");
if ($ikioi > 100000 and $number > 100) DispError2("ERROR!","ERROR: スレッド速度が速すぎるため制限を設けております。","8902 Rejected;");
# ユニコード変換
if ($SETTING['BBS_UNICODE'] == "deny") {
if ($emoji) DispError2("ERROR!","ERROR: この掲示板・スレッドはUNICODE・絵文字の使用が禁止されています。","9990 Banned;");
}elseif ($SETTING['BBS_UNICODE'] == "change") {
$_POST['subject'] = preg_replace("/\&\#\d+\;/", "?", $_POST['subject']);
$_POST['MESSAGE'] = preg_replace("/\&\#\d+\;/", "?", $_POST['MESSAGE']);
$_POST['subject'] = preg_replace("/\&\#x1F\d+\;/", "?", $_POST['subject']);
$_POST['MESSAGE'] = preg_replace("/\&\#x1F\d+\;/", "?", $_POST['MESSAGE']);
}
# 書けない板
if ($SETTING['BBS_HEISA'] == "checked" or $BSETTING['BBS_HEISA'] == "checked") DispError("ERROR!","ERROR: この板は書き込み停止状態のため、キャップでなければ投稿することができません。");
#############################################################################
# dat落ち
#############################################################################
if (substr($_POST['key'], 0, 3) != 900 and substr($_POST['key'], 0, 3) != 924 and !$_POST['subject']) {
# 即死判定
if (!$BSETTING['BBS_TH_LINE']) $BSETTING['BBS_TH_LINE'] = 1;
if (!$BSETTING['TIME_TO_LIVE']) $BSETTING['TIME_TO_LIVE'] = 1209600;
# if ($NOWTIME > $_POST['key'] + $BSETTING['TIME_TO_LIVE'] and $BSETTING['BBS_TH_LINE'] > $number) DispError2("ERROR!","ERROR: 該当するスレッドがありません。https://".$_SERVER[HTTP_HOST]."/test/read.cgi/".$_POST[bbs]."/".$_POST[key]."/","1021 Thread is not alive;");
# 突然死判定
# if ($BSETTING['BBS_MAX_MODIFIED'] and $NOWTIME > filemtime($thread_file) + $BSETTING['BBS_MAX_MODIFIED']) DispError2("ERROR!","ERROR: 該当するスレッドがありません。https://".$_SERVER[HTTP_HOST]."/test/read.cgi/".$_POST[bbs]."/".$_POST[key]."/","1021 Thread is not alive;");
# スレ欄から非表示
if ($SETTING['MAX_RES'] - 5 < $number or $SETTING['THREAD_STOP'] == "yes" or ($BSETTING['BBS_THREAD_LIFETIME'] and $NOWTIME > $_POST['key'] + $BSETTING['BBS_THREAD_LIFETIME'])) $hide = "hide";
}
#############################################################################
# 串/VPN/TOR規制
#############################################################################
# PROXY判定
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) and $_SERVER['HTTP_X_FORWARDED_FOR']) {
if ($_SERVER['REMOTE_ADDR'] != $_SERVER['HTTP_X_FORWARDED_FOR'] and $HOST != $_SERVER['HTTP_X_FORWARDED_FOR']) {
$KUSICHECK = "Proxy05";
$REMOTE_HOST .= ",".$_SERVER['HTTP_X_FORWARDED_FOR'];
}
}
if (isset($_SERVER['HTTP_VIA']) and $_SERVER['HTTP_VIA']) {
$KUSICHECK = "Proxy02";
$REMOTE_HOST .= ",".$_SERVER['HTTP_VIA'];
}
if (isset($_SERVER['HTTP_FORWARDED']) and $_SERVER['HTTP_FORWARDED']) {
$KUSICHECK = "Proxy03";
$REMOTE_HOST .= ",".$_SERVER['HTTP_FORWARDED'];
}
if (isset($_SERVER['HTTP_CACHE_INFO']) and $_SERVER['HTTP_CACHE_INFO']) {
$KUSICHECK = "Proxy04";
}
if (isset($_SERVER['HTTP_CLIENT_IP']) and $_SERVER['HTTP_CLIENT_IP']) {
endhtml("9999 Not yet;");
# $KUSICHECK = "Proxy05";
}
if (isset($_SERVER['HTTP_PROXY_CONNECTION']) and $_SERVER['HTTP_PROXY_CONNECTION']) {
$KUSICHECK = "Proxy06";
}
if (isset($_SERVER['HTTP_SP_HOST']) and $_SERVER['HTTP_SP_HOST']) {
$KUSICHECK = "Proxy07";
$REMOTE_HOST .= ",".$_SERVER['HTTP_FORWARDED'];
}
if (isset($_SERVER['HTTP_X_LOCKING']) and $_SERVER['HTTP_X_LOCKING']) {
$KUSICHECK = "Proxy08";
$REMOTE_HOST .= ",".$_SERVER['HTTP_X_LOCKING'];
}
if (isset($_SERVER['HTTP_TE']) and $_SERVER['HTTP_TE']) {
# $KUSICHECK = "Proxy09";
}
if ($KUSICHECK) DispError("ERROR!","ERROR: このホストからはdelightに投稿することができません。");
# 串リスト
$IN = file($BBQSERV."proxy20.cgi");
foreach ($IN as $tmp){
if (strpos($tmp, '#') !== false) continue;
$tmp = trim($tmp);
if (stristr($REMOTE_HOST, $tmp) || stristr($_SERVER['REMOTE_ADDR'], $tmp)) $PROXYCHECK = "Proxy20";
}
if ($PROXYCHECK) {
$slip = "8";
$BBX = "Burned BBQ (".$PROXYCHECK.")";
}
if (!$login and $BSETTING['Use_Banned'] == "checked") {
#--------------未ログイン時の処理 ここから-------
#############################################################################
# BAN
############################################################################
if ($_SESSION['kisei'] == "BAN" or $_SESSION['kisei'] == date('z')) DispError("ERROR!","ERROR: あなたはスパムであると判定されたためBANされました。※日付が変わってから再度お試しください","E3390 Unavailable key.;");
else $_SESSION['kisei'] = '';
if ($_COOKIE[TAKO] == "ODORI") DispError("ERROR!","ERROR: あなたはスパムであると判定されたためBANされました。🐙","9991 Banned;");
#--------------未ログイン時の処理 ここまで-------
}
#############################################################################
# BBM
#############################################################################
if ($phone) {
$bbm_file = $BBQSERV."/bbm/".date('Ymd')."_".$phone.".cgi";
if (is_file($bbm_file) and $SETTING['BBS_BBX_PASS'] != "on") {
$BBM = "Burned BBM ".file_get_contents($bbm_file);
if (!$login) DispError("ERROR!","ERROR: この携帯(べっかんこ)はBBx規制中です。->".$phone."<br>".$BBM);
}elseif (is_file($bbm_file)) {
$BBM = file_get_contents($bbm_file);
}
}
if (!$BBM) $BBM = "NONE";
#############################################################################
# BBQ
#############################################################################
$bbx_file = $BBQSERV."/bbq/".date('Ymd')."_".$file_ipaddr.".cgi";
$banfile = $BBQSERV."/bbq/bbq_".$file_ipaddr.".cgi";
$banfile1 = $BBQSERV."/bbq/".date('Ym')."_".$file_ipaddr.".cgi";
$banfilea = $BBQSERV."/bbq/".date('Ym').substr(date("d"), 0, 1)."_".$file_ipaddr.".cgi";
if (is_file($banfile)) $BBX = "Burned BBQ (Proxy60) BBR-".file_get_contents($banfile);
elseif (is_file($banfile1)) $BBX = "Burned BBQ (Proxy60) BBR-".file_get_contents($banfile1);
elseif (is_file($banfilea)) $BBX = "Burned BBQ (Proxy60) BBR-".file_get_contents($banfilea);
elseif (is_file($bbx_file)) $BBX = "Burned BBQ (Proxy60) ".file_get_contents($bbx_file);
if (!$BBX) $BBX = "NONE";
elseif ($SETTING['BBS_BBX_PASS'] != "on" and !$login) DispError("ERROR!","ERROR: このホストはBBx規制中です。->".$HOST."<br>".$BBX,"5900 BBxed IP;");
#############################################################################
# URLチェック
#############################################################################
if ($SETTING['DISABLE_LINK'] and preg_match('/(https?|ttps?):\S+/', $_POST['MESSAGE'])) DispError2("ERROR!","ERROR: この掲示板・スレッドではリンクの投稿が禁止されています。","9990 Banned;");
#====================================================
# フィールドサイズの判定
#====================================================
# 各種チェック
if (!$login) {
if (strlen($_POST['MESSAGE']) > $BSETTING['BBS_MESSAGE_COUNT']) DispError2("ERROR!","ERROR: 本文が長すぎます。 (Check:".strlen($_POST['MESSAGE'])."/".$BSETTING['BBS_MESSAGE_COUNT'].")");
if (strlen($_POST['FROM']) > $BSETTING['BBS_NAME_COUNT']) DispError2("ERROR!","ERROR: 名前が長すぎます。");
if (strlen($_POST['mail']) > $BSETTING['BBS_MAIL_COUNT']) DispError2("ERROR!","ERROR: メールアドレスが長すぎます。");
if (strlen($_POST['subject']) > $BSETTING['BBS_SUBJECT_COUNT']) DispError2("ERROR!","ERROR: スレッドタイトルが長すぎます。");
if ($emoji > $BSETTING['BBS_LINE_NUMBER'] * 3) DispError("ERROR!","ERROR: UNICODE・絵文字の個数が多すぎます。","9990 Banned;");
if (preg_match_all("/>>[0-9]/", $_POST['MESSAGE'], $matches) > $BSETTING['BBS_LINE_NUMBER'] * 2) DispError("ERROR!","ERROR: レスアンカーリンクの個数が多すぎます。","9990 Banned;");
}else {
$maxkaigy = $BSETTING['BBS_LINE_NUMBER'] * 3;
if (mb_strlen($_POST['MESSAGE'], 'SJIS') > 10000) DispError2("ERROR!","ERROR: 本文が長すぎます。 (Check:".mb_strlen($_POST['MESSAGE'], 'SJIS')."/10000)");
if (mb_strlen($_POST['FROM'], 'SJIS') > 280) DispError2("ERROR!","ERROR: 名前が長すぎます。 (Check:".mb_strlen($_POST['FROM'], 'SJIS')."/280)");
if (mb_strlen($_POST['mail'], 'SJIS') > 280) DispError2("ERROR!","ERROR: メールアドレスが長すぎます。 (Check:".mb_strlen($_POST['mail'], 'SJIS')."/280)");
if (mb_strlen($_POST['subject'], 'SJIS') > 280) DispError2("ERROR!","ERROR: スレッドタイトルが長すぎます。 (Check:".mb_strlen($_POST['subject'], 'SJIS')."/280)");
}
#--------------ログイン時の処理 ここまで-------
#############################################################################
# BBQ
#############################################################################
#if (is_file($BBSSERV."/".date('z')."/proxy_".$file_ipaddr.".cgi")) $kushi = @file_get_contents($BBSSERV."/".date('z')."/proxy_".$file_ipaddr.".cgi");
#
#if (!$kushi) {
#//オプション設定
#$options =array(
# 'http' =>array(
# 'method' => "GET",
# )
# );
#$url = "https://spur.us/context/".$REMOTEADDR;
#$cp = curl_init();
#/*オプション:リダイレクトされたらリダイレクト先のページを取得する*/
#curl_setopt($cp, CURLOPT_RETURNTRANSFER, 1);
#/*オプション:URLを指定する*/
#curl_setopt($cp, CURLOPT_URL, $url);
#/*オプション:タイムアウト時間を指定する*/
#curl_setopt($cp, CURLOPT_TIMEOUT, 2000);
#/*オプション:ユーザーエージェントを指定する*/
#curl_setopt($cp, CURLOPT_USERAGENT, "Mozilla/5.0 P2/2.5 (iPad; CPU OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/87.0.4280.77 Mobile/15E148 Safari/604.1");
#curl_setopt($cp, CURLOPT_HEADER, true);
#$source = curl_exec($cp);
#$curlInfo = curl_getinfo($cp);
# // ヘッダを一緒に出力したときは分割させる
# $headerSize = 0;
# if ( isset($curlInfo["header_size"]) && $curlInfo["header_size"]!="" ) {
# $headerSize = $curlInfo["header_size"];
# }
# $head = substr($source, 0, $headerSize); // ヘッダ部
#$head = str_replace(["\r\n", "\r", "\n"], "\n", $head);
#$header = explode("\n", $head);
#foreach ($header as $tmp) {
# list($key, $value) = explode(": ", $tmp);
# $HTTP[$key] = $value;
#}