288 lines
7.9 KiB
Perl
Executable File
288 lines
7.9 KiB
Perl
Executable File
$index = './index.cgi'; # 죄와 벌++ 탑 페이지
|
||
$usrdata = "./usrdata/"; # 캐릭터 데이터 보관 디렉터리.
|
||
|
||
$no_window = 1; # 현상유지·구속시간 이외의 다른 창 금지(0:없음 1:있음)[부하 방지 대책]
|
||
|
||
# 각국 설정 정보
|
||
@camp_info =( ['무소속', '#eeeeee'],
|
||
['알메리아 왕국', '#ee9999'],
|
||
['플라린 교국', '#00eeee'],
|
||
['이기스 연합국', '#88ee88'],
|
||
['소디나 제국', '#ffccff'],
|
||
['야마토 신국', '#55bbff']);
|
||
|
||
# 칭호
|
||
@sogo_p =('----','패자','영웅','빚쟁이 왕','귀축',' ',' ',' ',' ',' ','관리자');
|
||
|
||
# 디버그 모드
|
||
# 없음: PC·모바일 양쪽 대응
|
||
# pc : PC 한정 모드(모바일 미대응)
|
||
# mv : 모바일 고정 모드(PC상에서 모바일 화면을 에뮬레이트 표시)
|
||
$mv_mode = '';
|
||
|
||
# 기기별 설정
|
||
if( $ENV{'HTTP_USER_AGENT'}=~/DoCoMo/ ||
|
||
$ENV{'HTTP_USER_AGENT'}=~/UP\.Browser/ ||
|
||
$ENV{'HTTP_USER_AGENT'}=~/J-PHONE/ ||
|
||
$ENV{'HTTP_USER_AGENT'}=~/ASTEL/ ||
|
||
$ENV{'HTTP_X_JPHONE_MSNAME'} || $mv_mode eq 'mv'){
|
||
|
||
$mv_mode= 'mv'; # 모바일용 플래그(변경 불가)
|
||
$method = "GET"; # 폼 메서드(모바일)
|
||
}else{
|
||
|
||
$mv_mode= 'pc'; # PC용 플래그(변경 불가)
|
||
$method = "POST"; # 폼 메서드(PC)
|
||
|
||
# 스타일 시트
|
||
$css =<<EOM;
|
||
<style type="text/css">
|
||
<!--
|
||
.button1{
|
||
font-family: "MS Pゴシック", "Osaka"; font-size: 12px; font-weight: 400; color: #bbbbcc;
|
||
border: 2px #9999cc ridge; cursor: hand; background-color: #333366;
|
||
}
|
||
body { font-size: 12pt;}
|
||
.mem { font-size: 10pt; color:#ddddee}
|
||
.date { font-size: 10pt; color:#dddddd}
|
||
.f1{font-size:16pt; font-family:'Symbol','Palatino'; color:#ff99cc;}
|
||
-->
|
||
</style>
|
||
EOM
|
||
|
||
}
|
||
|
||
# 호スト名取得モード
|
||
# --> 0 : $ENV{'REMOTE_HOST'} で取得できる場合
|
||
# --> 1 : gethostbyaddr で取得できる場合
|
||
$get_remotehost = 1;
|
||
|
||
# 다른 사이트로부터의 투고 배제 시에 지정 (http://부터 작성)
|
||
$base_url = "";
|
||
|
||
# 액세스 제한(호스트명 또는 IP 주소 기술)
|
||
@deny = (
|
||
"anonymizer.com",
|
||
"cache*.*.interlog.com",
|
||
"",
|
||
""
|
||
);
|
||
|
||
|
||
#===============================================================================
|
||
# 이하 처리 기본적으로 이 이하는 수정하지 않도록.
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 참가자 데이터 개별 읽기
|
||
sub mandata_open{
|
||
|
||
open(IN,"$usrdata$id\.cgi") || &error("Open Error : $usrdata$id\.cgi");
|
||
$dat = <IN>;
|
||
close(IN);
|
||
|
||
%DAT = '';
|
||
my @prats = split(/,/,$dat);
|
||
foreach (0 .. $#prats){
|
||
my($key,$v) = split(/;/,$prats[$_]);
|
||
$DAT{$key} = $v;
|
||
}
|
||
|
||
if($pw ne $DAT{'pw'}){ &error("비밀번호가 틀렸습니다"); }
|
||
|
||
if($no_window){
|
||
&error("현재 이벤트를 종료한 후에 이용해 주십시오.") if($DAT{'pr'}<=0 && $DAT{'type'});
|
||
}
|
||
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 디코드 처리
|
||
sub decode {
|
||
local($buffer, @pairs, $name, $value);
|
||
$post_flag=0;
|
||
if($ENV{'REQUEST_METHOD'} eq "POST"){
|
||
$post_flag=1;
|
||
&error("투고량이 너무 많습니다") if($ENV{'CONTENT_LENGTH'}>8192);
|
||
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
|
||
}else{
|
||
$buffer = $ENV{'QUERY_STRING'};
|
||
&error("투고량이 너무 많습니다") if(length($buffer)>7500)
|
||
}
|
||
@pairs = split(/&/, $buffer);
|
||
foreach (@pairs) {
|
||
($name,$value) = split(/=/);
|
||
$value =~ tr/+/ /;
|
||
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
|
||
|
||
# 문자 코드를 Shift_JIS 변환
|
||
# &jcode'convert(*value, "sjis", "", "z");
|
||
|
||
$value =~ s/\&/&\;/g;
|
||
$value =~ s/\;/;\;/g;
|
||
$value =~ s/\,/,\;/g;
|
||
|
||
# 태그 처리
|
||
if ($tagkey) {
|
||
$value =~ s/<!--(.|\n)*-->//g;
|
||
$value =~ s/<>/<>/g;
|
||
} else {
|
||
$value =~ s/</</g;
|
||
$value =~ s/>/>/g;
|
||
$value =~ s/\"/"/g;
|
||
}
|
||
|
||
# 개행 등 처리
|
||
if ($name eq "comment" && $br_mode) {
|
||
$value =~ s/\r\n/<br>/g;
|
||
$value =~ s/\r/<br>/g;
|
||
$value =~ s/\n/<br>/g;
|
||
} else {
|
||
$value =~ s/\r//g;
|
||
$value =~ s/\n//g;
|
||
}
|
||
|
||
# 도배 처리 1
|
||
$value =~ s/(<br>){4,}//g;
|
||
$value =~ s/( | ){6,}//g;
|
||
|
||
# 기호 교체
|
||
$value =~ s/\///\;/g;
|
||
$value =~ s/\./.\;/g;
|
||
$value =~ s/cgi/c\;g\;i\;/g;
|
||
|
||
$in{$name} = $value;
|
||
}
|
||
|
||
&no_link($in{'comment'}) if($nolink);
|
||
|
||
$com = $in{'comment'}; if(length($in{'comment'})>$com_limit) { &error("글자 수 에러입니다 1"); }
|
||
$mode = $in{'mode'}; if(length($in{'mode'})>10) { &error("글자 수 에러입니다 2"); }
|
||
$pw = $in{'pw'}; if(length($in{'pw'})>8 || !$in{'pw'}) { &error("글자 수 에러입니다 3"); }
|
||
$id = $in{'id'}; if(length($in{'id'})>24 || !$in{'id'}) { &error("글자 수 에러입니다 4"); }
|
||
$ids = $in{'ids'}; if(length($in{'ids'})>12) { &error("글자 수 에러입니다 5"); }
|
||
$rd = $in{'rd'}; if(length($in{'rd'})>1) { &error("글자 수 에러입니다 6"); }
|
||
|
||
if ($base_url) {
|
||
$ref_url = $ENV{'HTTP_REFERER'};
|
||
$ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
|
||
if ($ref_url !~ /$base_url/i) { &error("잘못된 접근입니다"); }
|
||
}
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 에러 처리
|
||
sub error {
|
||
if (-e $lockfile) { unlink($lockfile); }
|
||
|
||
&header(1);
|
||
print "<center><hr width='75%'><P><h3>ERROR !</h3>\n";
|
||
print "<P><font color=red><B>$_[0]</B></font>\n";
|
||
print "<P><hr width='75%'></center>\n";
|
||
©right;
|
||
exit;
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 락 파일 생성
|
||
sub lock {
|
||
local($lflag) = 0;
|
||
foreach (1 .. 5) {
|
||
if (-e $lockfile) { sleep(1); }
|
||
else {
|
||
open(LOCK,">$lockfile") || &error("Can't create $lockfile");
|
||
close(LOCK);
|
||
$lflag = 1;
|
||
last;
|
||
}
|
||
}
|
||
if ($lflag == 0) { &error("LOCK is BUSY"); }
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 액세스 체크(액세스 거부)
|
||
sub axs_check {
|
||
&get_host;
|
||
|
||
local($flag)=0;
|
||
foreach (@deny) {
|
||
if (!$_) { next; }
|
||
$_ =~ s/\*/\.\*/g;
|
||
if ($host =~ /$_/i || $addr =~ /$_/i) { $flag=1; last; }
|
||
}
|
||
if ($flag) { &error("액세스가 허용되지 않았습니다"); }
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 호스트 정보 취득
|
||
sub get_host {
|
||
$host = $ENV{'REMOTE_HOST'};
|
||
$addr = $ENV{'REMOTE_ADDR'};
|
||
$agent = $ENV{'HTTP_USER_AGENT'};
|
||
|
||
if ($get_remotehost) {
|
||
if ($host eq "" || $host eq "$addr") {
|
||
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
|
||
}
|
||
}
|
||
if ($host eq "") { $host = $addr; }
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 시간 취득
|
||
sub get_time {
|
||
$time = time;
|
||
($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($time);
|
||
$hour= "0$hour" if($hour<10);
|
||
$min = "0$min" if($min<10);
|
||
$sec = "0$sec" if($sec<10);
|
||
$month++;
|
||
$month = "0$month" if(month<10);
|
||
@week=('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
|
||
$date = "$month/$mday($week[$wday]) $hour:$min";
|
||
srand($time);
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 플레이 규제
|
||
sub safetime {
|
||
foreach (0 .. $#safetime){
|
||
&error("플레이 규제 시간 중입니다. 잠시만 기다려 주십시오.") if $hour eq $safetime[$_];
|
||
}
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# URL 배제
|
||
sub no_link {
|
||
$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<!-- $2 -->/g;
|
||
}
|
||
|
||
#-------------------------------------------------------------------------------
|
||
# 삭제/변경 불가 반드시 표시할 것
|
||
# 저작권 표시(삭제/변경 불가)
|
||
sub copyright{
|
||
if($mv_mode eq 'mv'){
|
||
print <<"EOM";
|
||
<br><hr color="white">
|
||
과거의 영광 $ver<br>
|
||
<a href="http://pom.to/" target="_blank">BLANK BOARD[인터넷 유원지♪]</a>
|
||
</body>
|
||
</html>
|
||
EOM
|
||
}else{
|
||
print <<"EOM";
|
||
<div align="right" style="font-size:12px">
|
||
$ver<br>
|
||
<a href="http://www17.big.or.jp/~obochan/vivid/" target="_blank" style="font-size:13px">Vivid Studio.</a><br>
|
||
<a href="http://pom.to/" target="_blank" style="font-size:11px">BLANK BOARD[인터넷 유원지♪]</a>
|
||
</div>
|
||
</body>
|
||
</html>
|
||
EOM
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
1;#삭제 불가
|