2013-06-29 66 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