2012-10-02 50 views
2

我有一個網絡應用程序由少數人使用(僅限內部使用),並使用存儲在用戶記錄下並放置在各種鏈接中的隨機sessionID。如何在CGI Perl中防止用戶會話劫持?

我遇到了一個問題,那就是用戶發送鏈接給對方,讓他們劫持發件人的會話。

有什麼方法可以防止這種情況發生,同時讓用戶互相發送鏈接?

編輯: 鏈接中的會話ID(也包含$ username)僅與用戶表中存儲的內容進行比較。 &不正確的登錄只是輸出錯誤,然後死亡;

if ($sid) { 

    $sth = $dbh->prepare("SELECT * FROM tbl_User WHERE UserID = '$username'"); 
    $sth->execute(); 

    $ref   = $sth->fetchrow_hashref(); 
    $session_chk = $ref->{'usr_sessionID'}; 

    unless ($sid eq $session_chk) { 

     &incorrectLogin; 
    } 
} 

問題是,如果有人使用由其他人創建的鏈接,頁面將以它們的形式加載。我沒有使用cookies,並且我記得在過去被告知CGI perl cookie處理很差。

+0

我們需要了解更多。你使用什麼進行身份驗證?你是否在用戶的機器上設置了cookie?你爲什麼使用查詢字符串sessionId?我們可以看到一些代碼嗎? –

+0

啊,我的道歉。我在原帖中增加了一些額外的信息。 – Gnippots

回答

4

如果查詢字符串包含您用於會話身份驗證的所有信息,那麼您是通過設計弄清楚的。你將需要找到某種方式將用戶名或會話ID,或更好的是將兩者都放入cookie中;否則,你只會成爲SOL,因爲你無法阻止用戶發送的鏈接包含代碼用來告訴哪個用戶正在與之通話的所有內容。

如果我是你,我會通過找出作爲我被告知CGI.pm是否確實爲貧困工作與餅乾開始,如果是的話,我會繼續我自己的滾動的Cookie:頭。我可以看到的唯一另一種選擇是將應用程序中的所有鏈接轉換爲POST請求,這些請求都更糟糕,太糟糕了。

+0

謝謝,我同意解決方案在於將至少一些身份驗證從URL中取出。我還沒有使用cookies的經驗,所以我首先試圖找到開始學習的最佳地點。 – Gnippots

3

首先,查詢字符串(或會話ID)不應包含用戶標識。當您收到會話ID時,您會查看存儲在服務器端的會話信息以檢索與該會話ID關聯的用戶ID。

其次,您應該在一定數量的不活動之後過期會話。第三,你可以在服務器端會話中存儲兩個額外的項目,以幫助你解決這個問題,同時還不使用cookies。解決方案並不完美,即仍然有機會劫持會話,但會使其更加困難。

在服務器端,存儲用戶登錄的IP地址。如果您收到來自不同IP的同一會話的後續請求,請再次詢問憑據。請勿在查詢字符串中包含IP地址。

另外,隨着每個響應,生成一個next_request_id。將其存儲在服務器端會話中,並將其發送回客戶端。您返回頁面上的所有鏈接也必須包含此next_request_id

當您收到請求時,請檢查您收到的next_request_id是否與您爲該會話存儲的相同。如果不是,則重新進行驗證。

現在,這會干擾用戶使用多個選項卡或使用重新加載/刷新的網站的能力,但這對我來說是一個適合特定用例的解決方案。

但是,在一般情況下,您最好使用cookie。

使用cookies over plain HTTP時會話仍然可能被劫持,但至少,您正在防範此特定故障。

3

在切換到cookie之前,我曾經像現在一樣處理會話管理。現在,我使用CGI::Session,我非常滿意。

然而,如果你想一個稍快劈解決在短期內你的問題,有一兩件事你可以做的是存儲每個會話的IP地址與會話ID一起。然後,如果傳入的IP地址/會話ID對與您存儲的IP地址/會話ID對不匹配,您可以重定向到您的登錄頁面。

這種方法確實有一些缺陷,並不完美,但它確實關閉了目前的安全漏洞。