2011-11-01 39 views
1

我試圖圍繞會話劫持和使用令牌來保護CSRF。 我在每個腳本中都使用這個對象方法來檢查是否設置了會話變量,或者令牌是否與會話令牌匹配。導致令牌暴露的會話劫持

public function admin_index(){ 

session_start(); 
if(!isset($_SESSION["user"]) || $_GET['token']!=$_SESSION['token']) { 
    header("location: login/login_form.php"); 
    session_destroy(); 
    exit(); 
} 

我在這個新的,我的問題是: 如果我的會話ID以某種方式被劫持,他將能夠在一定怎麼也看我的變量$ _SESSION [「令牌」]在很短的時間間隔後, session_start和會話數據被提取並填充到$ _SESSION中,還是在服務器上仍然安全?

即使已獲得有效會話,會話變量通常是否安全?

不要介意$ _GET ['token']而不是POST。我仍在努力。

感謝

編輯:

什麼我問的是。如果一個令牌可以幫助我以我使用它的方式來保護我的會話。如果腳本中的每個查詢,鏈接或視圖都需要一個有效的令牌,並且攻擊者只持有我的session_id,那麼令牌將是另一層保護,因爲他/她需要id和令牌來執行腳本中的任何操作, 對?

即使攻擊者獲得了我的session_id,令牌在服務器上也是安全的嗎?

+0

只是爲了重申,如果你的會話被劫持了,csrf是沒有價值的。希望很明顯。它無助於會話劫持或預防。通常幫助的是檢查用戶代理和/或IP地址的更改,當然最終的安全性是https:和安全cookie。 – gview

+0

每次訪問表單時都會生成CSRF令牌,因此無法保護您的會話。所以,如果我劫持你的會話並使用你的賬戶訪問該表單,那麼會生成一個新的令牌,並且無論之前的CSRF令牌是什麼,我都可以做我喜歡的事情。 –

+0

並且在您的示例中是將更改與令牌或用戶進行身份驗證相匹配。您只應使用令牌來檢查數據是否來自可信來源。您似乎將其用作輔助會話ID,這不太正確。如果您從用戶的唯一標識符(例如,瀏覽器的session_id和User-Agent)創建一個散列,則可以這樣做,因爲每次都可以檢查它。 –

回答

2

會話劫持和CSRF攻擊是兩個完全不同的東西,人一旦到您的會話您的訪問它們是「你」,可以在您的帳戶訪問的一切。

CSRF攻擊是迫使終端用戶在Web應用程序中,他/她是目前 認證

這是一個社會工程和驗證問題進行 不必要的行動的攻擊,其使用令牌顯然可以解決,因爲可以證明數據是從您的表單合法發送的。使用POST而不是GET會使這種攻擊非常困難。

一個會話劫持,另一方面是如果有人可以用你 會議,成爲「你」和使用您的帳戶,這將允許他們這樣做 任何他們請。

一旦惡意用戶訪問此會話,CSRF攻擊幾乎是無用的,因爲它不是必需的。

如果您擔心會話ID被劫持,那麼您可以採取一些預防措施,例如一旦用戶會話ID升級到更高級別的訪問權限時就會重新生成用戶會話ID。這可以使用session_regenerate_id()PHP函數完成。您還可以檢查瀏覽器的用戶代理以檢查是否有更改,如果有,那麼您可以簡單地要求用戶登錄並重新生成該標識,以便攻擊者不知道該標識。很明顯,他們總是有可能成爲相同的用戶代理,但它的確顯着限制了風險。加密,如SSL/HTTPS也是一個選項,你可能想看看

欲瞭解更多信息,你應該看看這個鏈接的一些例子:http://phpsec.org/projects/guide/4.html。希望這已經解決了你的問題:)

+0

嗨,丹尼爾,它漂亮地幫了我很多。我之前曾瀏覽過該文件。我讀了另一篇文章,它解釋了一個令牌系統,就像我試圖做的一樣。你怎麼看呢。第49-50頁:http://phpsecurity.org/ch04.pdf我猜它只在cookie被盜時才起作用,因此攻擊者只有session_id。如果攻擊者嗅探到http請求,他將擁有令牌和id。我也實現了會話重新生成。我只是認爲這會成爲一種額外的安全措施。 – Woozle

+0

是的,我在過去的項目中使用了類似的東西,實現了類似的會話劫持令牌。這個檢查然後可以被合併到你的代碼中,檢查用戶是否被認證。 Cookie被竊取的主要原因是XSS漏洞,因此請確保在輸出中使用htmlentities(),但也要做足夠的驗證和santisation檢查,這應該足夠了。 –

0

糾正我,如果我錯了,但我敢肯定你根本無法劫持$_SESSION值,因爲這些,不像$_COOKIE在web瀏覽器保存在服務器上,而不是。

因此,他們也不能改變它。他們可以關閉瀏覽器將其刪除,但不能對其進行編輯。

+0

謝謝羅賓。這也是我所希望的。所以我猜測檢索會話變量的唯一方法就是如果f.ex通過php腳本回顯給瀏覽器。如果這樣的腳本不存在,它是安全的? – Woozle

+0

如果我劫持你的會話,我是你。我能夠做你做的任何事情,而CSRF是無關緊要的。我已經在您的帳戶中。 – gview

+0

但是,如果您只是從f.ex中獲取會話標識的http標頭,但每個查詢都需要在session_id中隱藏一個標記。令牌可以保護我完全不受劫持?攻擊者需要同時擁有會話ID和令牌? – Woozle

0

會話變量存儲在服務器上。他們無法閱讀。但是,一個會話通常會被攻擊者劫持,這個攻擊者可以訪問另一個用戶的會話ID,然後可以使用該會話ID來模擬他們(劫持)他們的會話。

CSRF是一個完全不同的問題。 CSRF攻擊讓用戶以類似於xss漏洞的方式不經意地執行操作:我可能會發布僞造img鏈接,其中src實際上是一個將參數傳遞給瀏覽器以您的名義運行的腳本的url。在這種情況下,攻擊者只需讓瀏覽器發出你不打算的請求。 CSRF保護應該阻止這一點,因爲用戶不知道令牌是什麼,所以他們不能將其嵌入到URL中。

+0

嗨gview,謝謝,但是如果攻擊者獲取我的會話ID,但我的腳本中的每個動作都需要一個令牌來執行。令牌不僅可以保護我不受CSRF侵害,還可以防止劫持,對吧?因爲他需要會話ID和令牌,並且令牌存儲在會話中。 – Woozle

+0

不,因爲如果你的會話被劫持,攻擊者只是簡單地生成新的表單來揭示令牌。該令牌是您在服務器上生成的一個祕密,並以表單或url參數提供。它只會阻止沒有會話的人欺騙某個執行獲取或發佈他們不打算提交的請求的人。 – gview

+0

嗯......但是如果在我的所有腳本上運行上述腳本,如果令牌丟失,您將無法訪問表單。我將令牌附加到所有鏈接,而不僅僅是表單,因此即使您擁有正確的session_id,也不會在腳本中使用任何令牌。在獲得表格之前,您將被踢出。我從這個pdf頁面49-50獲得了這個想法:phpsecurity.org/ch04.pdf。對不起,繼續毆打一匹死馬;-) – Woozle