我在一個半月前開始學習PHP,並開始通過嘗試創建自己的非常簡單的CMS來學習如何構建基本的CRUD腳本與mysql數據庫進行交互等等。登錄,用戶身份驗證,會話和csrf令牌
我目前正在構建我的CMS的私人管理部分的登錄表單,通過這樣做我想了解PHP中的基本安全性。
我想對用戶身份驗證進行一些基礎研究,但我遇到的解釋通常包含有關我沒有完全理解的最佳安全實踐的信息。
所以,我查找了更多關於我不明白的小部分信息,其中包括我不熟悉的其他部分,我被拖入吸收了大量有關安全主題的信息,比如通過默默無聞的安全性,單向密碼散列,通過適當的PHP配置設置安全,防禦sql注入,php注入,會話劫持等。
我無法實現所有這些,因爲我無法真正理解這一切。
所以第一個問題是關於將用戶會話存儲在數據庫中。
我現在知道的是,如果我使用共享主機,服務器可能沒有正確配置,並且服務器存儲會話的文件夾可能會被其他人訪問。
這是我想將會話存儲在數據庫中的唯一原因嗎?
二,如何在db中存儲會話解決訪問問題?
爲了詳細說明我的困惑,我很清楚,一旦會話存儲在數據庫中,它就可以安全地從共享主機上的人身上,但是如何告訴php - 「嘿,我將我的用戶會話存儲在數據庫,從你指定的默認存儲位置排除它「?
換句話說,僅僅因爲我將會話存儲在數據庫中並不意味着服務器將它從默認存儲會話的地方排除。這是否正確?如果是,我該如何控制它?
第三,我如何實際將會話存儲在數據庫中?我假設以下過程:
session_start();
//Assume a user has successfully logged in
//For better security regenerate the session on login
$session = session_regenerate_id();
$data[]= $session;
$query = $db_connection->prepare("INSERT INTO `sessions`(`session`) VALUES (?)");
$query->execute($data);
這是什麼意思將會話存儲在數據庫中的最基本的形式?
繼續下一個問題。
讓我們假設我已經解決了上述問題。現在如何驗證用戶是否登錄?
通常我會做這樣的事情:
if(!isset($_SESSION['user'])) {
redirect_to('login.php');
}
但由於用戶會話存儲在數據庫中,是它提供給我直接或者我需要首先將其拉出分貝的順序使用它?
我知道,一旦會議開始還有一個加密/散列(不知道到底哪一個是)在一個名爲PHPSESSID瀏覽器會話cookie的事實。
但是,因爲我將會話存儲在數據庫中,這意味着我正在手動控制PHP通常會自動執行的操作,這在我頭腦中的過程鏈是generate-> store-> encrypt/hash-> set會話cookie。
這個假設是否正確?
而且最後跨站點僞造請求。
我的理解是,當用戶登錄時,他會被欺騙地點擊鏈接等來複制瀏覽器的cookie,現在攻擊者擁有會話cookie並可以模擬用戶。
如何保存在一個隱藏字段我形成了CSRF令牌在這種情況下幫助嗎?
如果攻擊者劫持用戶檢查對會話令牌沒有幫助,因爲攻擊者具有有效會話的會話。
我錯過了什麼?
有在我的腦海知識差距上是如何工作的,我希望你能有所彌補這些對我來說。
你在一個單獨的問題中提出了很多問題,你應該將它們隔離開來,因爲它太大而無法正確回答。 –