2013-06-29 65 views
0

在应用程序的每个页面上,我检查用户是否登录。我最近意识到我的脚本结构不好,并做了一些更改。我想知道如果这种新方法实现了操作的对于未登录用户以正确的顺序。PHP用户登录失败处理

<?php 
ob_start(); 
session_start(); 

if ($_SESSION['loggedin'] !== true) { 
    $_SESSION['messages'][] = '<li>User Not Logged In</li>'; 
    session_write_close(); 
    ob_end_clean(); 
    header('Location: login.php'); 
    exit; 
} 
else { 
    // execute page 
} 
?> 

在此之前剧本,ob_start()呼叫低于登录检查部分,因此是导致重定向给出问题那session_start()产生它自己的标题。

我也很想知道该脚本是否为登录检查提供足够的安全性。

+1

除非脚本在重定向前向浏览器输出内容,否则不应在顶部需要'ob_start();'。您是否将这个脚本包含在页面中,并且在调用此脚本之前,包含脚本是否将输出发送到浏览器? – jeroen

+0

@jeroen'session_start()'默认输出到浏览器,所以AFAIK我需要'ob_start()'来确保执行'header()'调用。除了会议这个脚本在一开始。 [会话输出和重定向的说明](http://stackoverflow.com/questions/8028957/headers-already-sent-by-php/8028987#8028987) – foochow

+0

不,如果头已经发送,则无法启动会话。这并不意味着'session_start'正在发送标题。 – jeroen

回答

1

这部分代码是完整的,安全的,但你不得不提到为了更加安全一些事情你需要重新与把有价值的数据,如在“的loggedIn”在会议结束后session_regenerate_id会话ID。

我认为把IF部分放在一个函数上并省略其它部分会更好,这样可以帮助你的代码变得更简单。还可以删除以下行:

session_write_close(); 
ob_end_clean(); 
+0

功能是有道理的。 'session_regenerate_id'包含在登录脚本中。添加'ob_end_clean()'是为了防止任何数据输出给未经授权的用户。为什么我会删除其他? – foochow

+1

你必须在做任何事之前检查身份验证。如果先检查你没有任何隐藏的东西。 – Ghasrfakhri