0

我正在研究现有网站,寻找安全问题。是否可以肯定地说 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();
}

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

4

3 回答 3

2

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

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

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

于 2013-03-19T14:38:30.633 回答
0

如果您不在exit;标头之后,则脚本应继续运行。

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

于 2013-03-19T14:36:52.933 回答
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 
于 2013-03-19T14:38:02.833 回答