2017-06-12 111 views
1

因此,我已經被告知,我已經開始工作的應用程序在跨站點僞造請求(CSFR)方面提供了預防措施, ,但不適用於獲取請求。java - 我如何防止跨站點僞造請求

我也被告知,我可以獲得原點的來源和目標的來源,比較每個的主機,並根據它們是否匹配或不做什麼。到目前爲止,我在做了一些研究之後已經有了下面的內容,但我還沒有,可以使用一些額外的幫助。我對這個職業很陌生,所以我甚至不確定自己是否在正確的軌道上。

String refererHost = ((HttpServletRequest) request).getHeader("referer"); 

    String targetHost = request.getServerName(); 

    try {  
     refererHost = new URI(refererHost).getHost(); 

     if(!refererHost.equals(targetHost)) 
     { 
      ((HttpServletResponse) response).sendRedirect(((HttpServletRequest)request).getContextPath()+ADMIN_LOGOFF_URL); 
     } 
    } catch (MalformedURIException | NullPointerException e) { 
     request.getRequestDispatcher(ADMIN_LOGOFF_URL).forward(request, response); 
    } 
+2

GET請求不應該根據HTTP規範影響狀態。爲獲取請求防範CSRF的最佳方法是堅持這一點。至於你的代碼,你需要描述什麼不按照你期望的方式工作。 – Taylor

回答

1

OWASP有建議。您的發佈代碼(假設這是一個過濾器)是其中的一條建議,因此您處於正確的軌道上。還建議使用令牌 - 希望您可以重複使用已經爲POST進行的操作,而無需過多重新分解。

還要檢查你的框架(如果有的話)是否提供對CSRF的支持,所以你不必編寫自己的代碼。

+0

謝謝安德魯,是的,它是一個過濾器。令牌用於發佈請求。截至目前,我相信我有源/目標主機相互比較正確,如果他們不結束用戶會話/引導他們到註銷屏幕。 – gsnurr3

0

首先是一個命名問題:它的名字是CSRF。 這裏我引用的參考網站:

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

跨站請求僞造(CSRF)是一款迫使終端用戶 以在Web應用程序中,他們 執行不必要的行動的攻擊目前已通過認證。 CSRF攻擊特別針對 狀態變更請求,而不是盜竊數據,因爲攻擊者沒有 方式查看對僞造請求的響應。

狀態改變請求是那些可以改變目標站點狀態的請求。如果應用程序寫得很好,那麼GET方法是隻讀狀態,而POST狀態應該改變它的狀態,應該調用DELETE或UPDATE(所以你必須保護POST方法,但不僅僅是這樣)。

讓我們舉個例子來說明。假設您已登錄到您的銀行賬戶。如果您受到攻擊,PC上的應用程序可能會調用POST來執行電匯,方法與單擊合法應用程序中的按鈕相同。

什麼是通過這種攻擊保護自己的合理方法? 我知道他們中的兩個。

第一個是在調用危險頁面之前的頁面時創建一個隨機標記(將其視爲您通過GET方法獲得的顯示請求收件人的屏幕的頁面)。這個隨機令牌必須保存在用戶的會話中,並以隱藏字段的形式出現在頁面中。在服務器端執行POST方法時,必須將來自隱藏字段的隨機令牌與存儲在用戶會話中的令牌進行比較。如果他們不匹配,交易必須被拒絕。

第二個包括要求確認,也許通過驗證碼給用戶。

對於更詳細的信息,我建議你從這個站點開始: enter link description here 這是每一個開發者一個很好的起點,因爲安全是一種高質量的每一個應用程序,預計將有。

相關問題