Creo que puede (al menos parcialmente) resolver su problema m con criptografía.
Supongamos que tiene una página main.php
que incluye JS para llamar a otra página llamada ajax.php
. Cuando se accede a la página main.php
, use un $browserKey
y un $salt
para crear un $_SESSION["tempHash"]
. (También necesita almacenar la sal). A continuación, proporcione la clave del JavaScript que hace la solicitud a su página ajax.php
, y verifique que la clave y la sal den el mismo hash que antes.En main.php
, hacer algo como esto:
<?php
session_start();
// authorize user here
$salt = time();
$browserKey = mt_rand();
$hash = sha1("$browserKey$salt");
$_SESSION["tempSalt"] = $salt;
$_SESSION["tempHash"] = $hash;
// ... code ...
?>
<!doctypehtml>
<html>
<!-- html -->
<script>
// ... ajax call ...
var params = "param1=val1¶m2=val2&...&browserKey=<?= $browserKey ?>";
request.send(params);
</script>
</html>
<?php session_write_close(); ?>
Luego, el ajax.php
, sólo tiene que hacer
<?php
$validated = false;
if(sha1($_POST["browserKey"] . $_SESSION["tempSalt"]) === $_SESSION["tempHash"]) {
$validated = true;
}
// and unset the salt and hash
$_SESSION["tempSalt"] = $_SESSION["tempHash"] = null;
if(!$validated) {
// taken from another SO answer:
// http://stackoverflow.com/a/437294/2407870
header('HTTP/1.0 404 Not Found');
echo "<h1>404 Not Found</h1>";
echo "The page that you have requested could not be found.";
exit();
}
// else, continue normal processing here
?>
No soy un experto en este campo, así que tome mi consejo con un grano de sal . (Heh, broma de criptografía.)
Una vulnerabilidad potencial con este enfoque es que la persona puede cargar la página main.php
y luego esperar cinco horas y llamar a la página ajax.php
. Sin embargo, solo les permitirá acceder a él una vez. Y puedes hacer otras cosas para evitar esto. Por ejemplo, verifique la sal (que se obtuvo con time()
) para verificar que no haya pasado demasiado tiempo. O incluso envía latidos periódicos al servidor, que generan un nuevo hash, salt y key, devolviendo la nueva clave al navegador.
Sin motivo en particular. No es algo que deba ser súper seguro, pero sí suficiente para que el usuario no tropiece con una parte de una página web en lugar de con la totalidad. O al menos para que alguien no envíe solicitudes a una página php que envía información a una base de datos. – alexcoco