Quiero evitar el acceso directo a un determinado archivo PHP llamado prevented.php Mi lógica es que tengo un archivo principal, llamémoslo index.php y genera un token y lo almacena en una variable $_SESSION . También tengo otro archivo llamado def.php que se llama usando AJAX y pasa el token de index.php a def.php y si $_SESSION['token'] es igual a $_POST['token'] define un _DEFVAR y devuelve verdadero; de lo contrario, devuelve falso. Después de llamar a def.php y devuelve verdadero, redirijo a prevented.php a través de javascript usando location.href="prevented.php" . En la parte superior del archivo prevented.php hay un código que comprueba si el _DEFVAR está definido o no. Si no, muere con un mensaje como invalid ; de lo contrario, muestra el contenido del archivo prevented.php . Pero de alguna manera siempre recibo un mensaje invalid y no sé por qué. ¿Alguna idea de cómo llegar a prevented.php sin dirigir directamente la página?
Aquí está mi código:
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'); } ?>Tu código es innecesariamente complicado. Si su intención es simplemente asegurarse de que los visitantes de protected.php hayan visitado primero index.php , entonces todo lo que necesita hacer es crear un indicador de sesión en uno y verificar su existencia en el otro. No hay necesidad de AJAX ni de formularios POST. El comportamiento innato de las sesiones de PHP ya le brinda esta funcionalidad.
índice.php:
<?php session_start(); $_SESSION['flag'] = true; ?> <a href="protected.php">click here for the protected page</a>protegido.php:
<?php session_start(); if ($_SESSION['flag'] ?? false) { echo "you have previously visited index.php"; } else { echo "you have not previously visited index.php"; } ?>