断言或退出/死亡以检查PHP中的headers_sent()?

时间:2011-01-18 04:15:23

标签: php security assert

我正在编写一个用于生成HTML输出的PHP类。出于安全原因,我需要确保在此类之前没有代码发送输出。以下是我想到的两个选项:

选项1:作为断言

if( !$this->headersSent ) {
    assert( '!headers_sent()' );
    $this->headersSent = true;
    // ...
}

选项2:使用if语句和die()

if( !$this->headersSent ) {
    if( headers_sent() ) {
        die( 'For security, refusing to continue: headers already sent.' );
    }
    $this->headersSent = true;
    // ...
}

Wikipedia says,“断言应用于记录逻辑上不可能的情况并发现编程错误。”

  • 此类是特定应用程序的一部分,我认为在不使用此类的情况下发送HTML输出是编程错误。所以应该使用assert()
  • 另一方面,这个应用程序有一天可能会变成开源,有人可能会自定义它。他可能会关闭断言,因此导致的安全问题可能会被忽视。所以应该使用die()

哪一种更好的做法?

1 个答案:

答案 0 :(得分:1)

你可能想在那里抛出异常。

class HeadersAlreadySentException extends Exception { }
throw new HeadersAlreadySentException('Headers already sent. Cannot continue.');

http://php.net/manual/en/language.exceptions.php