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,因为用户可以操

我有一个用PHP运行的网站,我有一个页面(比如confirm.PHP)

我只想让登陆的用户确认。php来自我指定的页面(比如说register.php),我能知道这有可能实现吗

问候,,
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
}

?>