我想防止直接訪問某個名為prevented.php
我的邏輯的 PHP 檔案,我的邏輯是我有一個主檔案讓我們呼叫它index.php,它會生成一個令牌并將其存盤在一個$_SESSION變數中。我還有一個名為的檔案def.php,它使用 AJAX 呼叫,它將令牌從 傳遞index.php到def.php,如果$_SESSION['token']等于$_POST['token']則定義 a_DEFVAR并回傳 true ,否則回傳 false 。在我呼叫def.php它并回傳 true 后,我prevented.php使用location.href="prevented.php". 在prevented.php檔案的頂部有一個代碼,用于檢查是否_DEFVAR已定義。如果沒有,它會顯示一條訊息,invalid否則它會顯示prevented.php檔案的內容。但為什么我總是得到invalid訊息,我不知道為什么。知道如何在prevented.php不直接直接訪問頁面的情況下訪問嗎?
這是我的代碼:
index.php
<?php
$_SESSION["token"] = hash_hmac('sha256', "tokenString", "t2o0k0e0n3"); // Creates a hashed token
?>
<script>
$.ajax({
type: "POST",
url: "def.php",
data: {
token: '<?php echo $_SESSION["token"]; ?>'
},
cache: false,
success: function(data) {
console.log (data);
if (data) {
console.log (data ' valid');
} else {
console.log (data ' invalid');
}
location.href = "prevented.php";
},
error: function () {
console.log('error');
}
});
</script>
def.php
<?php
session_start();
if (!isset($_POST['token']) || $_POST['token'] != $_SESSION['token']) {
echo false;
die('invalid in def');
} else {
define('_DEFVAR', 1);
echo true;
die ('valid in def');
}
?>
prevented.php
<?php
include "def.php";
if (defined('_DEFVAR')) {
die ('valid in prevented'); // instead of this I would show the content of the page
} else {
die ('invalid in prevented');
}
?>
uj5u.com熱心網友回復:
您的代碼不必要地過于復雜。如果您的意圖只是確保訪問者protected.php首先訪問過index.php,那么您需要做的就是在其中一個中創建一個會話標志并檢查其在另一個中是否存在。不需要任何 AJAX 或任何形式的 POST。PHP 會話的固有行為已經為您提供了此功能。
索引.php:
<?php
session_start();
$_SESSION['flag'] = true;
?>
<a href="protected.php">click here for the protected page</a>
受保護的.php:
<?php
session_start();
if ($_SESSION['flag'] ?? false) {
echo "you have previously visited index.php";
} else {
echo "you have not previously visited index.php";
}
?>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/444229.html
標籤:javascript php html 阿贾克斯
