簡體   English   中英

PHP/MySQL 安全登錄和會話

[英]PHP/MySQL Secure Login & Sessions

我有一個登錄服務到我當前的網站,我想知道的是 - 有沒有什么特別的方法可以調用 MOST Secure?

請允許我更好地解釋我的系統:

我目前有一個帶有用戶表的 PHP MySQL 數據庫。 用戶名和密碼都存儲為 VARCHAR(不是我知道的最好的密碼)。

在注冊表單方面,我通過只允許 aZ 0-9 輸入並限制字符數來規范密碼和用戶名的選擇。 在登錄表單方面,我通過使用 mysql_real_escape_string 來阻止攻擊,我使用 POST 到 iFrame 而不是 AJAX。

我覺得我正在盡我所能防止來自表單端的攻擊,而不是來自數據庫端的攻擊。 我知道您可以更改密碼存儲的類型以在進入數據庫時​​進行加密,但我不明白的是我將如何查詢此加密字符串。

鑒於我所描述的情況,您對增加安全性有何建議,為什么? 您選擇了哪些方法來防止黑客入侵和攻擊? 你能看到我所描述的任何明顯的安全漏洞嗎? 也許最重要的是,考慮到我從事 Web 開發游戲的時間不長並且沒有太多經驗,我可以做些什么來糾正這些問題?

(請記住,我不是在創建一個系統來存放機密或煽動性數據)

首先,不要在數據庫中存儲純文本密碼。 因此,在注冊新用戶時,將他們的密碼作為hash插入。 MD5 最常用於此目的。 我建議使用鹽。 所以對於存儲:

$password = md5($yoursalt . $_POST['password']);

現在,當用戶想要登錄時,您的帖子中將再次獲得他們的密碼。 現在制作與之前相同的散列並在數據庫中搜索此散列(使用他們的用戶名)。 這樣您就不會存儲他們的實際密碼。

將密碼散列到 MD5 或 SHA1 是網絡安全的重要組成部分。 然后匹配密碼的方法是首先使用提供的用戶名從數據庫中檢索散列密碼,散列用戶提供的密碼,然后匹配兩個散列。 由於 MD5 和 SHA1 是散列的一種方式,因此如果用戶丟失了當前密碼,您將無法檢索當前密碼。 需要重新創建新密碼。 您可以使用 PHP 的 mcrypt() 函數來解決這個問題。

您還應該允許密碼中包含特殊字符。 這只會增加蠻力攻擊的復雜性。

您還可以在 3 次錯誤嘗試后鎖定帳戶一段時間,甚至在 10 次嘗試后鎖定 IP 地址。 雖然后者屬於“焦油坑”的范疇。 只是讓黑客的事情變得更加困難。

我在生成密碼時總是使用特定於用戶的鹽,所以我的“用戶”表有兩個字段“encrypted_salt”和“password”

它的頂部和底部是我 sha1(encrypted_salt + 'password');

生成 encrypted_salt 時,我會使用 sha1(unqid(true)); 它生成幾乎 100% 獨特的鹽,因為它使用時間到毫秒,並具有自己的額外熵(鹽)。 獲得重復的可能性幾乎為 0。

所以:

$salt = sha1(unqid(true));
$password = sha1($_POST['password']);

在數據庫中存儲為:

$pw = sha1($salt.$password); or sha1($password.$salt);

這並不重要。

SHA1 的美妙之處在於它總是會生成一個 40 個字符的字符串。 對字符串加鹽的次數越多越好,特別是如果您可以為每個密碼生成唯一的鹽。

就你的 SQL 而言,不要使用像 mysql_real_escape_string 這樣的字符串處理函數,它在某些情況下仍然允許注入攻擊發生。 使用參數化查詢,從而確保數據庫在所有情況下將所有用戶提供的字符串視為數據,而不是將其視為 SQL 代碼片段。

PHP 中的 MySQLi 和 PDO 庫都支持參數化查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM