防止使用 AJAX 直接访问 PHP 文件

Prevent Direct access to PHP file using AJAX

我想阻止直接访问某个名为 prevented.php 的 PHP 文件 我的逻辑是,我有一个主文件,可以将其称为 index.php,它会生成一个令牌并将其存储在 $_SESSION 变量中。我还有一个名为 def.php 的文件,它使用 AJAX 调用,它将令牌从 index.php 传递到 def.php 并且如果 $_SESSION['token'] 相等对于 $_POST['token'] 它定义了 _DEFVAR 和 returns true 否则它 returns false。在我调用 def.php 并且它 returns 为真后,我使用 location.href="prevented.php" 通过 javascript 重定向到 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');
   }
?>

您的代码不必要地过于复杂。如果您的目的仅仅是为了确保 protected.php 的访问者首先访问了 index.php,那么您需要做的就是在一个中创建一个会话标志并检查它在另一个中是否存在。不需要任何 AJAX 或任何形式的 POST。 PHP 会话的固有行为已经为您提供了此功能。

index.php:

<?php
session_start();
$_SESSION['flag'] = true;
?>
<a href="protected.php">click here for the protected page</a>

protected.php:

<?php
session_start();
if ($_SESSION['flag'] ?? false) {
    echo "you have previously visited index.php";
} else {
    echo "you have not previously visited index.php";
}
?>