【问题标题】: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 需要两个参数...!

标签: php security http redirect location


【解决方案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")
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2014-09-30
      • 2021-08-30
      相关资源
      最近更新 更多