PHP中的重定向/返回检查
我有一个用PHP运行的网站,我有一个页面(比如confirm.PHP) 我只想让登陆的用户确认。php来自我指定的页面(比如说register.php),我能知道这有可能实现吗 问候,,PHP中的重定向/返回检查,php,redirect,Php,Redirect,我有一个用PHP运行的网站,我有一个页面(比如confirm.PHP) 我只想让登陆的用户确认。php来自我指定的页面(比如说register.php),我能知道这有可能实现吗 问候,, Andy.使用:$\u服务器['HTTP\u REFERER'],并使用标题或一些自定义函数重定向它…查看脚本中的$\u服务器['HTTP\u REFERER']数组,以检测从哪个页面调用此脚本使用 $_SERVER['HTTP_REFERER'] 更多信息:您不能依赖HTTP REFERER,因为用户可以操
Andy.使用:
$\u服务器['HTTP\u REFERER']
,并使用标题或一些自定义函数重定向它…查看脚本中的$\u服务器['HTTP\u REFERER']数组,以检测从哪个页面调用此脚本使用
$_SERVER['HTTP_REFERER']
更多信息:您不能依赖HTTP REFERER,因为用户可以操作它,浏览器可以拒绝发送它
唯一“安全”的方法是在register.php上设置一个会话变量,并检查该变量是否在confirm.php上设置。大概是这样的:
register.php:
session_start();
$_SESSION['valid_user'] = true;
confirm.php:
session_start();
if(!isset($_SESSION['valid_user'])) {
die("You did not come from the page i specified!");
}
但是,如果最新的页面是register.php,但用户已经在register.php上,这将不考虑在内
因为HTTP是无状态的,所以您需要在服务器级别跟踪它。如果您没有一个可以跟踪所有页面浏览的经过身份验证的用户,这将很难实现。您真的需要它有多安全?因为HTTP是一种无状态协议,您需要在服务器端存储状态信息
一种方法是将密钥存储到PHP会话存储中,然后在重定向期间传递它,然后再次检查它
单文件
confirm.php
This…创建一个历史堆栈并保留所有请求的页面并不困难,这样您就可以查看最近访问的页面。如果使用getenv()而不是$\u服务器变量,则以后无法编辑它@阿尔达。。。由程序员编写。这不是问题所在。问题是用户在发送之前对其进行了编辑。是的,我确实阅读了许多地方,并确认HTTP_REFERER不安全,并且可以轻松修改,或者不根据用户代理进行定义。在同一手册页上还显示,“并非所有的用户代理都会设置此功能,有些代理还提供了修改HTTP_REFERER的功能。简言之,它真的不可信。”
<?php
session_start();
// some other code
$_SESSION['stateKey'] = sha1(time() . mt_rand()); // save a randomly created key
header('Location: confirm.php?key=' . $_SESSION['stateKey']);
?>
<?php
session_start();
if($_SESSION['stateKey'] == $_GET['key']){
// pass, do things here
}
?>