【问题标题】:Why I have to call 'exit' after redirection through header('Location..') in PHP?为什么我必须在通过 PHP 中的 header('Location..') 重定向后调用'exit'?
【发布时间】:2011-02-14 10:09:02
【问题描述】:

你知道如果你想在 PHP 中重定向一个用户你可以使用 header 函数:

header('Location: http://smowhere.com');

众所周知,在header 调用之后添加exit; 也是一个很好的做法,以防止执行其他php 代码。所以我的问题是:header-location 调用之后的代码能否有效执行?在哪些情况下?恶意用户能否完全忽略header('Location..') 调用?怎么样?

【问题讨论】:

    标签: php redirect header location


    【解决方案1】:

    header-location 调用后的代码能否有效执行?

    是的,总是。 header 只是一行数据要求浏览器重定向。页面的其余部分仍将由 PHP 提供,客户​​端可以通过简单地阻止 header 命令执行来查看。

    使用wget 之类的命令行客户端很容易做到这一点,例如,只需告诉它不要遵循重定向。

    底线:如果你不阻止它,即使在header 调用之后,PHP 也会发送整个正文。接收者完全可以使用该主体,无需任何特殊的黑客技能。

    【讨论】:

    • 最好的测试和查看实际情况的方法是对标头重定向进行操作,然后注意如果您注释掉骰子,它会转到第二个,它在那里,它只执行第一个。但是有了这个,您可以在重定向后执行 CURL 或其他几个命令。这在许多情况下都很棒。现场示例:codenvy.com/factory?id=fkugtmevk9qfl24d
    【解决方案2】:

    如果你重定向但你没有die() / exit() 代码总是被执行和显示

    举个例子:

    admin.php:

    if (authenticationFails)
    {
        // redirect and don't die
    }
    
    // show admin stuff
    

    如果您不确定在位置标头后结束执行每个用户都将获得访问权限。

    【讨论】:

      【解决方案3】:

      header() 指示 PHP 应发送 HTTP 标头...何时发送 HTTP 标头。

      当您编写对 header() 的调用时,它们不会立即发送,而是在发送它们的时候发送它们(通常,当 PHP 需要开始发送响应的主体时 - 这可能晚于你认为,当output_buffering 启用时)

      因此,如果您只调用header(),则绝对不能保证在此语句之后编写的代码不会被执行——除非您通过使用exit/die 表明它不能执行。

      如果需要,用户可以忽略Location 标头;但它不会改变任何事实,即调用 header() 之后的代码可能会或可能不会被执行:这件事是服务器端的。

      【讨论】:

        【解决方案4】:

        如果没有退出调用,您的脚本将终止的确切点/时间将归结为两个因素:

        1. 客户端浏览器对重定向的反应速度
        2. 脚本的其余部分执行需要多长时间。

        假设浏览器在看到 Location 标头通过时立即启动重定向操作。这意味着它将关闭重定向来自的连接,因此它可以开始连接到新位置。这通常意味着 Web 服务器将终止重定向脚本。无论标头从服务器->客户端到 TCP 链接关闭过程从客户端->服务器需要多长时间,都是脚本可以继续运行的时间量。

        【讨论】:

        【解决方案5】:

        将运行 header() 之后的 PHP 代码。有时,这是必需的,正如 php.net 上的 example 所示。为确保不是,请完全结束程序流程。

        【讨论】:

          【解决方案6】:

          re:header-location调用后的代码能否有效执行?

          是的,如果您不关闭脚本。

          re:在哪些情况下?

          在任何情况下。

          恶意用户能否完全忽略 header('Location..') 调用?

          不,它会被要求用户在这件事上没有发言权。

          【讨论】:

          • 不,@CarsonMyers,它之后的 PHP 代码将始终被执行。
          猜你喜欢
          • 2017-12-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多