重定向后PHP脚本是不是可以继续? [复制]
Posted
技术标签:
【中文标题】重定向后PHP脚本是不是可以继续? [复制]【英文标题】:Is it possible for PHP script to continue after redirect? [duplicate]重定向后PHP脚本是否可以继续? [复制] 【发布时间】:2013-03-08 07:06:07 【问题描述】:我正在研究现有网站,寻找安全问题。是否可以肯定地说 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();
但我不确定这是否是个问题。
【问题讨论】:
header()
设置标题,它不包括停止当前脚本。
为什么 debug.txt 没有进入“通过身份验证检查”。该脚本似乎正在终止。
因为那个命令无效? fwrite
需要两个参数...!
【参考方案1】:
正确,您需要在该标头后使用exit();
或die();
来阻止PHP 执行。
通过使用header()
,您只是设置了一个HTTP 标头,这对PHP 没有任何意义。你可以设置header('X-CHEESE', 'cheddar');
,它会执行的很好,然后继续处理。
你使用的 die 会告诉 PHP 停止执行,然后浏览器将接管,所以当它发现 Location: 时,它会转到提供的 URL。
【讨论】:
【参考方案2】:如果您在标头后没有exit;
,那么脚本应该会继续运行。
我之前在向客户端发送 HTTP 200 时使用过这个,并且 content-length: 0。所以客户端什么都不做,PHP 继续执行。
【讨论】:
【参考方案3】: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
【讨论】:
为什么 debug.txt 没有进入“通过身份验证检查”。该脚本似乎正在终止。 这很奇怪,我必须测试这种行为,理论上你必须退出脚本,测试它并回复你 经过测试,header 不会中断执行,另外,你的 fwrite 需要获取文件指针作为第一个参数:fwrite($fp,"lala")以上是关于重定向后PHP脚本是不是可以继续? [复制]的主要内容,如果未能解决你的问题,请参考以下文章