這是我目前在登錄頁面上創建會話的內容。PHP會話安全提示
if($count==1) {
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
}
我知道這是非常基本的,我需要保護用戶會話。你能否提供一些基本的提示。如果您可以編輯代碼並編寫安全代碼,那就太好了。謝謝。
目前,我使用的電子郵件地址作爲用戶名的會話。
這是我目前在登錄頁面上創建會話的內容。PHP會話安全提示
if($count==1) {
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
}
我知道這是非常基本的,我需要保護用戶會話。你能否提供一些基本的提示。如果您可以編輯代碼並編寫安全代碼,那就太好了。謝謝。
目前,我使用的電子郵件地址作爲用戶名的會話。
問問你自己這個問題:
後你已經回答了,你應該的得出的結論,其毫無意義,您可以在會話中存儲用戶名或用戶標識。
登錄系統如何工作的原因是用戶將表單中的用戶名密碼發送到驗證的服務器,在驗證過程中您從數據庫where username = post_username
中選擇用戶。
如果沒有行發現用戶不存在,那麼你可以直接在該點發送輸出,如果用戶確實存在,你再與post_password比較密碼。
爲什麼我們專門僅由用戶名選擇該行的原因是,你應該納入某種散列系統添加額外的安全性。
如果您將密碼存儲爲(密碼+散列)這將是一個新的字符串,您還將只存儲哈希,因此如果找到用戶,則可以從(post_password + db_hash)
創建一個哈希,並檢查以查看是否它與db_password
相同。
這樣,如果你的數據庫被泄露莫名其妙您的用戶憑據是更安全的。
一旦用戶已經過驗證,您將在會話中存儲用戶標識,然後在每次加載頁面時,您都可以檢查該標識是否在會話中,如果用戶當前已登錄,您可以選擇用戶數據由SELECT * FROM users WHERE id = session_id
。
這應該讓你開始。
常見的做法是在會議上針對數據庫檢查用戶名和密碼,然後成功店不僅僅是用戶ID。然後,要查看某個人是否已登錄或授權,請檢查會話中存儲的用戶標識。雖然,會話變量只對服務器可見,除非你做了一些可怕的錯誤。所以它不可怕或不安全,但它基本上是不必要的。
編輯
刪除了關於cookies位,可能會引起混淆。
/*
SecureSession class
Written by Vagharshak Tozalakyan <[email protected]>
Released under GNU Public License
*/
class SecureSession {
// Include browser name in fingerprint?
var $check_browser = true;
// How many numbers from IP use in fingerprint?
var $check_ip_blocks = 0;
// Control word - any word you want.
var $secure_word = 'random_string_here';
// Regenerate session ID to prevent fixation attacks?
var $regenerate_id = true;
// Call this when init session.
function Open()
{
$_SESSION['ss_fprint'] = $this->_Fingerprint();
$this->_RegenerateId();
}
// Call this to check session.
function Check()
{
$this->_RegenerateId();
return (isset($_SESSION['ss_fprint'])
&& $_SESSION['ss_fprint'] == $this->_Fingerprint());
}
function Destroy()
{
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// Finally, destroy the session.
session_destroy();
}
// Internal function. Returns MD5 from fingerprint.
function _Fingerprint()
{
$fingerprint = $this->secure_word;
if ($this->check_browser)
$fingerprint .= $_SERVER['HTTP_USER_AGENT'];
if ($this->check_ip_blocks)
{
$num_blocks = abs(intval($this->check_ip_blocks));
if ($num_blocks > 4)
$num_blocks = 4;
$blocks = explode('.', $_SERVER['REMOTE_ADDR']);
for ($i=0; $i<$num_blocks; $i++)
{
$fingerprint .= $blocks[$i] . '.';
}
}
return md5($fingerprint);
}
// Internal function. Regenerates session ID if possible.
function _RegenerateId()
{
if ($this->regenerate_id && function_exists('session_regenerate_id'))
session_regenerate_id();
}
}
那麼你爲什麼要在/ tmp中以純文本形式存儲密碼? – rook 2011-01-15 20:48:33