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"; } ?>