2014-03-29 25 views
0

好了,所以我这里有一些代码:可靠性都退出()和头()系统安全功能

<?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?

+0

位置标头由全世界每一个单一浏览器支持。它是第一个HTTP规范的一部分。所以是的,它*总是*的作品。至于'退出'是安全的......你是什么意思?它在那时停止执行......我不明白可能与系统安全有关的事情? – Tularis

+0

所以我猜测退出()阻止服务器发送特定页面的其余部分,这将是万无一失的。我现在正在查看PHP规范以便退出,这样可以清除一堆东西。 – lexica98

+2

请注意,尽管大多数(所有?)浏览器都支持'Location'头中的相对URI,但HTTP规范要求它是绝对的。 – lafor

回答

1

几乎所有今天的浏览器都支持Location;但是,您应该注意随附的状态码(第三个参数为header)。有关选择哪个代码的更多信息,请参见rfc2616 sec10; 303似乎更正确,但302更好的支持。

exit()的可靠程度取决于服务器的可靠程度。如果您的PHP代码被执行,exit()将始终中止执行并将结果发送到浏览器。但是,错误配置的网络服务器可能会直接暴露您的PHP代码而不是执行它。 This comment解释了如何减轻这个问题。

 

至于以下的规格,rfc2616 sec10表示:

除非请求方法是HEAD,响应应该包含与超链接到新的URI短超文本注释的实体( S)。

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