スクリプトで起こっていることのシーンは次のとおりです。
- セッション開始です。
$id
番号(大会ID番号)を設定します。
結果:
- ユーザー SESSION 変数は、ID 番号と ID 番号のそれぞれのユーザー データでリセットされます。基本的に、別のアカウントでユーザーをログインさせます。
トラブルシューティング:
- に名前
$id
を変更すると$tid
、グリッチが停止します。 - セッションを開始しない (
session_start()
) と、グリッチが停止します。
思考プロセス:
- $id は、次を含むブロック内にある同様の変数を上書きする必要があります。
if(isset( $_SESSION['someVar'] )) { $id = "some Value"; }
$id
セッションが開始されたときにのみ上書きされるので。
問題:
- その構文を使用するコード ブロックはありません。
これがコールスタックです。
ジョイントツアー.php
<?
session_start();
$id = (isset($_POST['id'])) ? $_POST['id'] : false;
include("html.php");
?>
html.php
<?
if(session_id() == '') session_start();
if(!function_exists('isLogged')) include("includes/islogged.inc.php");
include("includes/autologin.inc.php");
$query = mysql_query("SELECT value FROM config WHERE name='shutdown'");
$query = mysql_fetch_array($query);
$shutdown = end($query);
if(!class_exists('ban')) include("class/ban.class.php");
$ban = new ban();
if(isLogged()){
$ban->setUsername($_SESSION['username']);
}
$user_level = (isset($_SESSION['user_level'])) ? $_SESSION['user_level'] : "0";
$ban->setIP($_SERVER['REMOTE_ADDR']);
if((strlen($shutdown) > 0 || $ban->isBanned()) && $user_level == 0 && strtolower($_SERVER['REQUEST_URI']) != "/login.php"){
if(strtolower($_SERVER['REQUEST_URI']) != "/error.php"){
header("Location: ./error.php");
}
}
?>
islogged.inc.php
ファイル不要、変数セットなし: true/false のみを返します。
autologin.inc.php
<?
if(!class_exists('login')) include("./class/login.class.php");
$login = new Login();
if(isset($_COOKIE['username'],$_COOKIE['password']) && !$login->isLoggedIn()){
$login->setUsername($_COOKIE['username']);
$login->setPasswordDirect($_COOKIE['password']);
if(!$login->_error){
$login->processLogin();
}
}
?>
ご覧のとおり、jointourney.$id を上書きできる場所はまったくありません。これは、$id
使用されている変数が他にないためです。注: グローバルに設定されている変数はありません (つまり、 global $id
)
なぜこのようなことが起こっているのか理解できません。皆さんはこれを理解できますか? ここに表示されているものはすべて、その外観 (HTML を除く) とまったく同じです。