exit()和header()函数对于系统安全性的可靠性


Reliability of both the exit() and header() functions for system security

好的,这里有一些代码:

<?php session_start();
if (!isset($_SESSION['blah'])) {
header('Location: foo.php'); exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset = 'utf-8' />
<title>Check Login</title>
</head>
<body>
// members only content here
</body>
</html>

所以,我找到了一种简单的方法来使用头或退出语句进行重定向(通过根据if-else语句的值回显特定文档),但是使用头比在heredoc中回显整个网页要干净得多。(我也知道我应该使用HTTPS来增加安全性)。

我有两个问题

  1. 浏览器对Location标头的支持有多广泛?我知道我不能通过阅读类似的问题来单独使用它,但我不介意知道。

  2. 另外,使用php的exit()函数来维护系统安全的可靠性如何?它是否总是有效,或者当安全性真的很重要时,我应该只是回显一个HEREDOC ?

目前几乎所有的浏览器都支持Location;但是,您应该注意与它一起发送的状态码(header的第三个参数)。有关选择哪个代码的更多信息,请参阅rfc2616 sec10;303似乎更正确,但更好地支持302。

exit()有多可靠,实际上取决于你的服务器有多可靠。如果PHP代码被执行,exit()总是会中止执行并将结果发送给浏览器。但是,配置错误的web服务器可能会直接暴露您的PHP代码而不是执行它。这条注释解释了如何缓解这个问题。

,

关于遵循规范,rfc2616 sec10说:

除非请求方法是HEAD,否则响应的实体应该包含一个简短的超文本注释,并带有指向新URI的超链接。

您可以通过不使用exit()而使用die('<a href="foo.php">You are redirected.</a>')来实现这一点。