更新:請注意,每個在不安全的HTTP和加密的HTTPS頁面之間切換的網站都不可避免地會出現SSL-strip。請考慮在整個網站上使用HTTPS,但這既不能防止SSL-strip,至少這讓用戶可以安全地呼叫該網站,如果他在意的話。對於需要切換的網站,此方法可能仍然是最佳選擇。使用安全會話cookie在HTTP和HTTPS頁面之間切換
這是一種常見的情況,一個網站的頁面含有敏感數據,應該只使用HTTPS協議1訪問,而其他數據則使用非關鍵數據。
我發現了一個解決方案,允許在安全和非安全頁面之間切換,同時保持會話,並且想要要求您提供有關瑕疵的任何提示。你可以在這裏找到整篇文章: Secure session cookie with SSL (當然,我也很高興聽到,它是安全的)。
問題
HTTPS確保,客戶端和服務器之間沒有人可以竊聽我們的通信,並防止中間人攻擊。不幸的是,這不適用於會話cookie,它也發送給未加密的請求。
PHP提供帶參數$ secure的函數session_set_cookie_params(...)。這是我們需要的,但是當我們切換到不安全的頁面時,它會讓我們遇到問題,即我們會鬆動會話。
身份驗證cookie
身份驗證cookie的想法是,當用戶輸入自己的密碼(增加他的訪問權限),我們還創建第二個cookie發送到不安全的會話cookie,並且使確保只有加密的HTTPS頁面才能訪問它。
https://www.example.com/login.php
<?php
session_start();
// regenerate session id to make session fixation more difficult
session_regenerate_id(true);
// generate random code for the authentication cookie and store it in the session
$authCode = md5(uniqid(mt_rand(), true));
$_SESSION['authentication'] = $authCode;
// create authentication cookie, and restrict it to HTTPS pages
setcookie('authentication', $authCode, 0, '/', '', true, true);
print('<h1>login</h1>');
...
?>
現在每個頁面(HTTPS和HTTP)可以讀取不安全會話cookie的,但敏感信息頁面可以檢查安全身份驗證cookie。
https://www.example.com/secret.php
<?php
session_start();
// check that the authentication cookie exists, and that
// it contains the same code which is stored in the session.
$pageIsSecure = (!empty($_COOKIE['authentication']))
&& ($_COOKIE['authentication'] === $_SESSION['authentication']);
if (!$pageIsSecure)
{
// do not display the page, redirect to the login page
}
...
?>
攻擊者可以操縱會話cookie,但他從來沒有權限訪問身份驗證cookie。只有輸入密碼的人可以擁有身份驗證Cookie,它始終通過加密的HTTPS連接發送。
非常感謝每一個答案!
但是,由此竊聽的會話ID仍然可以在非HTTPS頁面上使用。 – Gumbo 2011-04-30 17:10:24
的確如此,但他只會看到不加批判的數據。您可以使用HTTPS請求所有頁面,您認爲有必要。 – martinstoeckli 2011-04-30 17:13:20
使所有網站完全https只是我的建議。它不僅可以消除這類問題,還可以改善瀏覽您網站的每個人的一般隱私。如果您想要在多個服務器和不同域之間保留登錄數據,那麼會出現更多令人不安的問題,因爲您想爲位於不同位置的文件提供服務...... – nus 2011-05-10 16:21:05