2011-04-30 32 views
27

更新:請注意,每個在不安全的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連接發送。

非常感謝每一個答案!

+0

但是,由此竊聽的會話ID仍然可以在非HTTPS頁面上使用。 – Gumbo 2011-04-30 17:10:24

+2

的確如此,但他只會看到不加批判的數據。您可以使用HTTPS請求所有頁面,您認爲有必要。 – martinstoeckli 2011-04-30 17:13:20

+1

使所有網站完全https只是我的建議。它不僅可以消除這類問題,還可以改善瀏覽您網站的每個人的一般隱私。如果您想要在多個服務器和不同域之間保留登錄數據,那麼會出現更多令人不安的問題,因爲您想爲位於不同位置的文件提供服務...... – nus 2011-05-10 16:21:05

回答

23

一個更簡單的替代方案:它逐漸成爲越來越多人接受的使用TLS的替代方案,而不是在安全和不安全的連接之間來回切換。大部分額外的處理時間用於設置安全通道,但這隻會執行一次並緩存(通常)。後續流量的對稱加密在現代處理器上非常非常快。相信這會導致服務器開銷或可伸縮性問題,這已經有點過時了。

在最近的一篇博客文章中,一位Google工程師報告說,當他們切換到HTTPS專用的GMail時,他們發現他們的服務器只聽到了4%的提示。 (找不到引用。)

+1

我也閱讀了文章,這似乎是一個真正的選擇。我想過的一件事是,像圖片一樣的所有資源也被加密,而外部包含會導致部分加密的頁面(在不安全的頁面上)。你有關於PHP緩存的任何信息,它是否適用於HTTPS? – martinstoeckli 2011-04-30 17:49:58

+0

谷歌文章是在[亞當蘭利的博客](http://www.imperialviolet.org/)上的某處。 – 2011-04-30 19:40:47

+4

文章鏈接:http://www.imperialviolet.org/2010/06/25/overclocking-ssl.html – stukelly 2011-05-04 07:53:32

相關問題