劇ぱわ不正対処法(ver 3.00b用)

topへ戻る

俺ペナ配布元であり、長い間劇ぱわ界をひっぱってこられたバンプの部屋が閉鎖になりました。 不正対処法はほんま重要な改造で、やっとかへんと荒らされる可能性が高いです。 というわけで、このページはうちが引き継ぎました。 これから劇ぱわを設置されるという方は、なるべく全部やったほうがええですよ。

赤い文字が新たに付け加える部分になります。

最低限やるべきこと。

その1
gekipawa.iniのファイル名をめちゃくちゃに変える。

例:sdaawjra9jfiaC.ini

その後gekipawa.cgiの5行目ほどにある require './gekipawa.ini'; を変えたファイル名にする。

例:require './sdaawjra9jfiaC.ini';


その2
league_dataフォルダの名前をメチャクチャにする。

例:itteyoshimona

その後 gekipawa.iniの $leaguefold = './league_data'; # リーグデータ用フォルダ を 変えたフォルダ名にする。

例:$leaguefold = './itteyoshimona'; # リーグデータ用フォルダ


要するに拡張子が.iniや.datでは外部から丸見えになってしまうのです。
ですから俺ペナでは.iniや.datを.cgiにしています。

・パラメータ等を自由に決められる。(注:投手の人数を増やしている人はそれなりに対応してください)

##### チーム登録処理
sub record{

# 変数を置き換える
$saku = $form{'saku'};
$pass = $form{'pass'};
$home = $form{'home'};
$team = $form{'team'};
$icon = $form{'icon'};

# リモートホスト取得
$host = $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'};

# 名前の長さチェック
if((length($team) < 1) || (length($team) > $nameleng *2)){ &error("名前の長さは$nameleng文字までにしてね。"); }
if((length($saku) < 1) || (length($saku) > $nameleng *2)){ &error("名前の長さは$nameleng文字までにしてね。"); }

# 名前&チーム名の重複チェック
open(US,"$leaguefold/$userfile") || &error('指定されたファイルが開けません。');
eval 'flock(US,1);';
seek(US,0,0); @users = <US>; close(US);
eval 'flock(US,8);';

foreach(@users){
($checksaku,$checkpass,$d,$checkteam,$d,$d,$checkip) = split /<p>/;
if($saku eq $checksaku){
&error('そのユーザー名は すでに使われています。');
}
if($team eq $checkteam){
&error('そのチーム名は すでに使われています。');
}
}

# パスワードチェック
if((length($pass) < 4) || (length($pass) > $passleng)){ &error("パスワードの長さは4〜$passleng文字までにしてね。"); }

#HPの判定
($home =~ /^http://[a-zA-Z0-9]+/) || ($home = '');

for($i=0; $i<10; $i++){
$posit[$i] = $form{"posit$i"};
$p_name[$i] = $form{"p_name$i"};
$para1[$i] = $form{"para1_$i"};
$para2[$i] = $form{"para2_$i"};
$para3[$i] = $form{"para3_$i"};
$para4[$i] = $form{"para4_$i"};
}
# 各キャラのチェック
for($i=0; $i<10; $i++){
if(length($p_name[$i]) < 1 || length($p_name[$i]) > 5 * 2){ &error('選手の名前の長さは5文字までにしてね。'); }
for($j=0; $j<$i; $j++){
if($i < 9 && $posit[$i] eq $posit[$j]) { &error('ポジションが重複しているよ。'); }
if($p_name[$i] eq $p_name[$j]){ &error('選手の名前は違う名前にしてね。'); }
}
}
for($i=0; $i<8; $i++){
if($posit[$i] ne '捕' && $posit[$i] ne '一' && $posit[$i] ne '二' && $posit[$i] ne '三' && $posit[$i] ne '遊' && $posit[$i] ne '左' && $posit[$i] ne '中' && $posit[$i] ne '右') { &error("ポジションが意味不明です。"); }
}

# 能力値チェック
$totalpoint = 0;
$check1 = 0;
$check2 = 0;
for($i=0; $i<10; $i++){
if(($para1[$i] < 1 || $para2[$i] < 1 || $para3[$i] < 1 || $para4[$i] < 1) || ($para1[$i] > 10 || $para2[$i] > 10 || $para3[$i] > 10 || $para4[$i] > 10)){
&error('選手ごとのパラメータは1〜10にしてね。');
}
if(int($para1[$i]) ne $para1[$i] || int($para2[$i]) ne $para2[$i] || int($para3[$i]) ne $para3[$i] || int($para4[$i]) ne $para4[$i]){
&error('パラメータは整数にしてね。');
}
$totalcheck = $para1[$i] + $para2[$i] + $para3[$i] + $para4[$i];
if($totalcheck < $para_min || $totalcheck > $para_max){ &error("選手ごとのパラメータの合計は$para_min〜$para_maxにしてね。"); }
else{ $totalpoint += $totalcheck; }

if($para1[$i] >= 8){ $check1++; }
if($para2[$i] >= 8){ $check1++; }
if($para3[$i] >= 8){ $check1++; }
if($para4[$i] >= 8){ $check1++; }
if($para1[$i] eq 10){ $check2++; $check1--; }
if($para2[$i] eq 10){ $check2++; $check1--; }
if($para3[$i] eq 10){ $check2++; $check1--; }
if($para4[$i] eq 10){ $check2++; $check1--; }
}

if($check2 > $ten_max) { &error('パラメータ10の数が多いよ。'); }
if($check1 > $eight_max){ &error('パラメータ8〜9の数が多いよ。'); }
if($totalpoint ne $totpoint){ &error("パラメータの合計が$totpointになってないよ。"); }


# ログへ書き込むスタイルの整形

      ・
      ・
      ・
      略


・チーム名さえわかればパスワードがわからなくても管理モードでログインできる。
##### ユーザー管理処理
sub user_check{

$saku = $form{'saku'};
$pass = $form{'pass'};
$home = $form{'home'};

open(US,"$leaguefold/$userfile") || &error('指定されたファイルが開けません。');
eval 'flock(US,1);';
seek(US,0,0); @users = ; close(US);
eval 'flock(US,8);';

$user_jun = 1;
foreach(@users){
($checksaku,$checkpass,$d,$checkteam) = split /<p>/;
if($form{'kanri_mode'}){
if($form{'team'} eq $checkteam){
if($pass eq $kanri_pass){
$userdata = $_;
last;
}
}
}else{
if($saku eq $checksaku){
if($pass eq $checkpass){
$userdata = $_;
&set_cookie;
last;
}else{
&error('パスワードが間違ってるか、その名前は他の人が使用してるよ。');
}
}
}
$user_jun++;
}
if($userdata eq ''){
&error('ユーザーデータが見つかりません。新規登録をやりなおしてください。'); }

return $userdata;

}#end user_check



・補足(管理用画面からもログインできるようにする方法)


##### 管理用画面
sub kanri{

if($form{'kanripass'} ne $kanri_pass){ &error('パスワードが違います。'); }

&header;

print <<"_EOF_";
<font color="$tcolor" size="$tsize">管理モード画面</font><br>
<br><br><br>
チーム名を入力してください。<br>
<form action=$cgifile method=$method>
<input type=hidden name=login value=1>
<input type=hidden name=kanri_mode value=1>
<input type=text name=team size=15> <input type=hidden name=pass value=$kanri_pass><input type=submit name=login value="Enter">
</form>
<br><br>

_EOF_

・新規ボタンが無くても新規登録画面に行ってチームを登録できる。

##### 新規登録画面
sub sinki_make{

open(US,"$leaguefold/$userfile") || &error('指定されたファイルが開けません。');
eval 'flock(US,1);';
seek(US,0,0); @users = <US>; close(US);
eval 'flock(US,8);';

$teamsuu = ($team_max) - ($#users + 1);
if($teamsuu <= 0){&error('既に登録最大チーム数に達しています。');}


@bonuslist = ();
foreach(1..10) {
if($_ eq 5){
push @bonuslist, "$_n";
}else{
push @bonuslist, "$_n";
}
}
      ・
      ・
      ・
      略


・キャンプインを規定回数以上する。

##### キャンプ終了処理
sub camp_rec{
$userdata = &user_check;
($saku, $pass, $home, $team, $icon, $date, $ip, $teamdata, $pointdata, $bosstype, $charadata, $gamedata, $campflag) = split(/<p>/, $userdata);
&chara_para;
if($campflag >= $camp_limit){ &error("既にキャンプインを$camp_limit回しています。"); }
# ログへ書き込むスタイルの整形
      ・
      ・
      ・
      略


・試合数を規定回数以上する。チームタイプに1〜10以外の数値を使われる。

##### 試合結果画面
sub playlog{
$userdata = &user_check;

($saku[0], $pass[0], $home[0], $team[0], $icon[0], $date[0], $ip[0], $teamdata[0], $pointdata[0], $bosstype, $charadata, $gamedata[0], $campflag[0]) = split(/<p>/, $userdata);

($lastjun[0], $win[0], $wincon[0], $winmax[0], $lose[0], $kaio[0], $kaid[0], $get[0], $loss[0], $t_jiseki[0], $boxsum[0], $hitsum[0], $hrsum[0], $stesum[0], $errsum[0]) = split(/<>/, $teamdata[0]);
if(($times < $date[0] + $between * 60) && ($win[0] + $lose[0] > 0)){ &error('連続で試合はできないよ。'); }elsif($win[0] + $lose[0] >= $league_game){ &error("既に$league_game試合消化してますよ。"); }
$bosstype[0] = "$form{'b_act'}<>$form{'b_bnt'}<>$form{'b_ste'}<>$form{'b_mnd'}";

@bosscheck = ($form{'b_act'},$form{'b_bnt'},$form{'b_ste'},$form{'b_mnd'});
for($i=0; $i<4; $i++){
if($bosscheck[$i] > 10 || $bosscheck[$i] < 1){ &error("チームタイプが不正です。"); }
if(int($bosscheck[$i]) ne $bosscheck[$i]){ &error("チームタイプが不正です。"); }
}


      ・
      ・
      ・
      略


・試合後の監督のコメントを勝手に消される。

##### コメントの削除処理
sub comdelete{
if ($ENV{'REQUEST_METHOD'} eq "GET") { &error('勝手に消さないで。'); }
open(CF,"+<$leaguefold/$commentfile") || &error('指定されたファイルが開けません。');


      ・
      ・
      ・
      略