2014-04-09 38 views
1

當用戶試圖登錄OM我的網站,我將窗體發佈到/login 如果沒有電子郵件地址和密碼匹配登錄腳本重定向到/login/tried-to-login 然後我用「login/後,無論發生什麼事了什麼,顯示邏輯在頁面上使用的會話存儲這些細節(例如,「請重試」)在會話或網址中存儲「不良登錄」?

我只是在另一個SO question瞭解一個人:

$_SESSION['bad_login'] = ... 

我或許會用「狀態」 $_SESSION['status'] = 'login failed', $_SESSION['status'] = 'no password'

會議是更好的方法嗎?要始終將用戶發送到/登錄?哪一個更好/更乾淨的代碼?我想我會爭辯說,包括在URL中的消息是用戶友好的?將它保留在Session中會有什麼收益?

回答

2

說一個用戶試圖登錄,並且登錄失敗的錯誤密碼。您可以將它們重定向到login.php?status=bad+password或者您可以設置$_SESSION['status']='bad password';,然後重定向到login.php,並顯示消息。

那有什麼區別?

  1. 主要的和最明顯的是,與參數方法(即login.php?status=bad+password)有人能去那個URL隨時隨地看到消息,而不實際,甚至嘗試登錄。使用會話方法,您只能在實際嘗試登錄後才能看到消息。

  2. 很顯然,無論何時您做一些類似於echo $_REQUEST['status'];的事情,您都會直接打印用戶輸入而不驗證。用戶可以在那裏注入一些HTML或其他東西。但是,如果您使用硬編碼的消息設置會話變量,那麼不需要擔心驗證就可以安全地執行echo $_SESSION['status'];。 (切勿將用戶輸入直接放入會話中,而不進行消毒/驗證。)

  3. 使用會話方法,可以在刷新登錄頁面時刪除消息的顯示。

    if(isset($_SESSION['status'])) 
        { 
        echo $_SESSION['status']; 
        unset($_SESSION['status']); 
        } 
    

現在的刷新,因爲你在打印後刪除的價值,你就不會顯示該消息的第二次。但是使用URL參數方法,儘管用戶實際上並未嘗試再次登錄,但頁面的每次刷新都會再次顯示該消息!

0

我建議 - 在URL中存儲消息是更好的辦法,就像Facebook並like this

+1

Facebook上也留下了登錄頁面沒有SSL多年。他們並不是真正的追隨最佳實踐的人。而且它沒有任何藉口說他們是一家創業公司:你可以以150美元購買基本的SSL證書。 –

+2

是的我同意你的評論,但我相信使用會議不是最佳實踐:) –

+0

聰明!爲什麼我沒有考慮爲其他服務輸入錯誤憑證!會嘗試! – Alisso