Я думаю, что вы можете (хотя бы частично) решить вашу проблему с помощью криптографии.
Скажем, у вас есть страница main.php
, которая включает JS для вызова другой страницы с именем ajax.php
. При доступе к странице main.php
используйте $browserKey
и $salt
, чтобы создать $_SESSION["tempHash"]
. (Вам также нужно хранить соль.) Затем дайте ключ к JavaScript, выполняющему запрос на вашу страницу ajax.php
, и убедитесь, что ключ и соль дают тот же хеш, что и раньше. На main.php
сделайте что-то вроде этого:
<?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(); ?>
Затем, на ajax.php
, просто сделайте
<?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
?>
Я не эксперт в этой области, поэтому примите мой совет с зерном соли . (Хех, криптографическая шутка.)
Одна потенциальная уязвимость при таком подходе заключается в том, что человек может загрузить страницу main.php
, а затем подождать пять часов и вызвать страницу ajax.php
. Это все еще только позволит им получить доступ к этому один раз все же. И вы можете сделать другие вещи, чтобы предотвратить это. Например, проверьте соль (которая была получена с time()
), чтобы убедиться, что прошло не слишком много времени. Или даже периодически отправлять тактовые импульсы на сервер, который генерирует новый хэш, соль и ключ, возвращая новый ключ в браузер.