Assert или exit/die для проверки headers_sent() в PHP?
Я пишу класс PHP для генерации вывода HTML. По соображениям безопасности я должен убедиться, что ни один код не отправил вывод перед этим классом. Вот два варианта, о которых я подумал:
Вариант 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;
// ...
}
Википедия говорит: "Утверждения должны использоваться для документирования логически невозможных ситуаций и обнаружения ошибок программирования".
- Этот класс является частью определенного приложения, и я считаю ошибкой программирования отправку вывода HTML без использования этого класса. Так
assert()
должен быть использован. - С другой стороны, однажды это приложение может стать открытым исходным кодом, и кто-то может настроить его. У него могут быть отключены утверждения, и поэтому возникающая проблема безопасности может остаться незамеченной. Так
die()
должен быть использован.
Какой из них лучше практиковать?
1 ответ
Решение
Вы, вероятно, хотели бы бросить исключение там.
class HeadersAlreadySentException extends Exception { }
throw new HeadersAlreadySentException('Headers already sent. Cannot continue.');