2017-06-23 161 views
0

我想通過一個JavaScript(而不是jQuery)的AJAX函數提交的窗體中傳遞一個CSRF令牌。接受的看法似乎是將該標記作爲實際形式的隱藏輸入。正如我所看到的那樣,問題在於使用瀏覽器檢查工具可以很容易地看到隱藏輸入的內容。那麼有沒有更安全的方式來傳遞令牌?傳遞一個CSRF令牌

回答

1

這不是一個問題,CSRF令牌在源代碼中是可訪問的,因爲它並不意味着隱藏在客戶端瀏覽器中。當我在這裏說「隱藏」時,我並不是在談論HTML表單的「隱藏」屬性,而是通過分析頁面源代碼,腳本執行或網絡流量(真正隱藏)來揭示令牌。

您必須理解CSRF令牌爲何有用。如果攻擊者創建了一個惡意網頁,託管在外部域名下,POST或GET到您的網站,那麼他可以期待經過身份驗證的用戶(受害者 - 在cookie中具有開放會話和會話ID)執行POST/GET:受害者的瀏覽器將檢測目標URL,將Cookie /會話ID添加到GET/POST標頭,並代表經過身份驗證的用戶執行操作(例如:「銷燬我的帳戶」)。

如果您在源中創建了一個隨機的CSRF令牌,攻擊者無法讀取它(因爲他無法代表受害者的瀏覽器加載頁面並感謝其內容,因爲跨域內容隔離),因此無法構建一個會執行GET或POST的惡意頁面。

至於其他方法,其他網站使用唯一的靜態CSRF令牌(在會話init中爲每個用戶生成),它保存在cookie中並通過JS包含在站點的表單中。結果是一樣的,令牌將成爲表單提交的一部分(並且客戶端瀏覽器可以訪問)。您只需避免爲每個表單生成CSRF令牌,並且服務器可以輕鬆地將令牌與客戶端的會話數據進行比較,而不是執行側向通道令牌管理。

+0

我正在構建的應用程序實際上在其自己的頁面上有多個表單。每次加載其中一個表單時,我都會設想生成一個新的CSRF標記,而不是使用靜態標記。 – bob

+0

爲了簡單和可維護性,我會採用其他方式。我知道在cookie中存儲CSRF令牌的銀行級平臺,並在所有表單上重複使用。如果CSRF每次都改變,那麼在安全性方面就沒有真正的附加價值,因爲如果泄露一次就意味着整個用戶會話被泄露,那麼使CSRF成爲問題最少的問題。但最終,如果自動化足夠,兩者都是可行的解決方案。 – Fabien

+0

好點 - thanx – bob