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

时间:2013-03-19 14:33:58

标签: php security http redirect location

我正在寻找现有网站,寻找安全问题。可以肯定地说,在重定向浏览器后,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();
}

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

3 个答案:

答案 0 :(得分:2)

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

通过使用header(),您只需设置一个HTTP标头,这对PHP来说毫无意义。您可以设置header('X-CHEESE', 'cheddar');,它将执行该罚款,然后继续处理。

您使用的模具将告诉PHP停止执行,然后浏览器将接管,因此当它发现位置时:它将转到提供的URL。

答案 1 :(得分:0)

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

我在将HTTP 200发送到客户端之前使用过这个,并且content-length:0。所以客户端没有做任何事情,PHP继续执行。

答案 2 :(得分:0)

header方法不会结束脚本执行,因此用户将获得重定向标头,但脚本的其余部分仍然会执行(这很危险)。

在重定向后死亡()或退出代码。

编辑:

使用以下代码进行测试后:

$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