2013-03-19 128 views
0

我正在一个现有的网站上寻找安全问题。可以肯定地说,在浏览器被重定向之后PHP脚本会中止,或者狡猾的用户可能会强制脚本继续。假设用户当前登录,“is_logged_in”返回1或0.假设此函数没有漏洞。代码如下:重定向后PHP脚本可以继续吗?

<? 
$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(); 
} 

但我不知道这是连一个问题。

+0

'header()'*设置标题*,它不以任何方式包含*停止当前脚本*。 – deceze 2013-03-19 14:37:57

+0

debug.txt怎么没有进入“通过验证检查”。该脚本确实似乎正在终止。 – user2072710 2013-03-19 14:38:55

+0

因为该命令无效? 'fwrite'需要*两个参数* ...! – deceze 2013-03-19 14:40:00

回答

0

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

我在发送HTTP 200到客户端之前已经使用过了,内容长度为0.所以客户端什么也不做,PHP继续执行。

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); 

更改内的值,如果为假此追加到DEBUG.TXT文件:

BEFORE LOGIN CHECK 
Passed auth check 

更改它真正把这个添加到debug.txt中:

BEFORE LOGIN CHECK 
Not authed 
Passed auth check 
+0

debug.txt怎么没有进入“通过验证检查”。该脚本确实似乎正在终止。 – user2072710 2013-03-19 14:39:41

+0

奇怪的是,我必须测试这种行为,理论上你必须退出脚本,对它进行测试并回复给你 – cernunnos 2013-03-19 14:42:13

+0

测试过它并且头不会中断执行,而且你的fwrite需要获取文件指针作为第一个参数:fwrite($ fp,“lala”) – cernunnos 2013-03-19 14:46:21

2

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

通过使用header()您只需设置一个HTTP标头,这对PHP而言意味着什么。你可以设置header('X-CHEESE', 'cheddar');,它会执行那个罚款,然后继续进行处理。

您使用的死将告诉PHP停止执行,然后浏览器将接管,所以当它找到位置时:它将转到提供的URL。