PHP脚本在重定向后是否可以继续?


Is it possible for PHP script to continue after redirect?

我正在一个现有的网站上工作,寻找安全问题。是否可以说PHP脚本在浏览器被重定向离开后就会终止,或者狡猾的用户可以以某种方式强制脚本继续?假设"is_logged_in"返回1,如果用户当前已登录,则返回0。假设此函数中没有漏洞。代码如下:

<?
$fp = fopen("./debug.txt", "a");
fwrite("BEFORE LOGIN CHECK'n");
if(!is_logged_in()) {
         fwrite("Not authed 'n");
         header("Location: $url", TRUE, 302);
}
fwrite("Passed auth check 'n");
/* Code to do some logged in functionality here */
?>

使用一个登录用户的普通浏览器,我得到

BEFORE LOGIN CHECK
Passed auth check

没有登录的用户,我得到

BEFORE LOGIN CHECK
Not authed

是否可以保持脚本打开(并忽略重定向),使用原始请求,以便我获得

BEFORE LOGIN CHECK
Not authed
Passed auth check

本质上是进入if块,获取重定向头,忽略它,并让脚本继续执行。

如果没有,我会纠正这个问题:

if(!is_logged_in()) {
         fwrite("Not authed 'n");
         header("Location: $url", TRUE, 302);
         die();
}

但我不确定这是否是个问题。

正确,您需要在头后使用exit();die();来阻止PHP执行

通过使用header(),你只是简单地设置一个HTTP头,这对PHP意味着什么。您可以设置header('X-CHEESE', 'cheddar');,它将执行该操作,然后继续处理。

您使用的die将告诉PHP停止执行,然后浏览器将接管,所以当它发现Location:时,它将转到提供的URL

如果你没有在标题后exit;,那么脚本应该继续运行。

我以前在向客户端发送HTTP 200时使用过这个,并且content-length: 0。客户端什么也不做,PHP继续执行

header方法不会结束脚本的执行,所以用户会得到一个重定向头,但是脚本的其余部分仍然会执行(这是危险的)。

要么die(),要么在重定向后退出代码。

编辑:

用以下代码测试后:

$fp = fopen("debug.txt", "a");
fwrite($fp,"BEFORE LOGIN CHECK'n");
if(true) {
         fwrite($fp,"Not authed 'n");
         header("Location: index.php", TRUE, 302);
}
fwrite($fp,"Passed auth check 'n");
fclose($fp);

将if中的值更改为false会将此附加到debug.txt文件中:

BEFORE LOGIN CHECK
Passed auth check 

将其更改为true会使debug.txt:

BEFORE LOGIN CHECK
Not authed 
Passed auth check