2013-10-30 23 views
1

一些web應用程序,特別是銀行網站,阻止你使用瀏覽器的導航按鈕,打開新的標籤頁的鏈接,甚至刷新頁面。通常他們會警告你不要這樣做,甚至殺掉會話,迫使你再次登錄。銀行式的導航限制

有他們遵循實現這一特定的架構模式? 他們的目標是什麼? 這是如何提高安全性的?

回答

2

而不是具有不同的頁面不同的URL處理程序,他們可能通過使用隱藏的表單字段和相同的URL處理程序將處理每個請求通過POST變量的頁面狀態。

例如鏈接到「最近交易」如下

<form method="post" action="https://www.example.com/securebankpage"> 

<input type="hidden" name="action" value="recentTransactions" /> 
<input type="hidden" name="token" value="3423432432535235325098525125242" /> 

<input type="submit" value="View Recent Transactions" /> 

</form> 

哪裏token是記錄服務器端對每個用戶會話和動作組合和服務器端的記錄是針對所提交的表單驗證安全的隨機生成的值可以被編碼用戶導航時的值。

每一頁時通過POST方法加載的,因此不可能使用戶通過點擊意外背面,然後接受瀏覽器提示重新提交數據重複上述動作。這是因爲token已被標記爲已經使用的服務器端,並且不允許令牌再次使用。如果後退按鈕導航到匯款頁面,則不會意外重複匯款。這也可以防止某些類型的重播攻擊。

此架構還對守衛作爲CSRF令牌值將是未知的,試圖啓動從他們的網站上的支撐柱,https://www.example.com/securebankpage並傳遞action作爲doMoneyTransfer任何攻擊。

令牌應該有時間限制,所以如果不是在設定的時間內(例如15分鐘)使用它們,它們應該被標記爲過期,並且如果用戶的會話仍然活動,那麼它們應該在每個可能的動作被重新呈現時被重新生成。

鏈接在新選項卡中打開並不是安全風險本身,但如果服務器不斷刷新每個可能操作的標記,原始窗口中的鏈接現在將包含過期標記,因爲它們尚未刷新,這是爲什麼系統可能會阻止你這樣做,並且在整個系統中有一條單一的路徑,而不是可以跟蹤的路徑。

在我上面的例子中,我提到了通過POST傳遞的所有內容,但也可以使用GET和單獨的頁面處理程序URL來實現類似的功能。 POST路由稍微安全一些,因爲頁面會通過阻止重新提交表單的機制在瀏覽器中自動過期,但也可以通過其他方式實現。使用獨特的令牌是重要的一點。

0

從javascript中,您可以通過檢查歷史記錄的長度來檢測新窗口。

您可以通過在頁面中插入iframe來捕獲後退事件,指向(例如)http://www.example.com/cacheable_blank_page.html,然後將其位置更改爲http://www.example.com/cacheable_blank_page.html#offset。當用戶點擊後退按鈕時,iframe會恢復到原來的位置。如果你附加了一個事件處理程序,那麼你可以檢測後退按鈕並適當地處理這種情況。

有一些代碼可以做到here

最終,peolpe通常使用的問題是,他們的服務器端代碼寫得不好,並且不適合在會話中存儲事務相關數據和/或過度使用PRG模式 - 最終這是一個令人討厭的黑客,搶佔問題而不是解決問題的根源。

SilverlighFox基於令牌的解決方案非常適合CSRF,但不能解決服務器狀態管理不佳的問題。

+0

我不同意,因爲良好的狀態管理在我的解決方案中是固有的 - 服務器總是知道客戶端的狀態,如果有任何分歧,用戶將被迫再次登錄,在這種情況下,他們將再次同步。由於不存在關於客戶端狀態的假設,因此安全性是固有的,這將導致代碼中的邏輯錯誤更少。 – SilverlightFox

+0

如果你認爲它不起作用,那麼爲什麼需要複製的行爲? – symcbean

+0

對不起,我不明白你的問題......我沒有說過任何事情都不起作用 - 你指的是什麼?乾杯。 – SilverlightFox