在Java Web應用程序中阻止CSRF

跨站點請求偽造攻擊(CSRF)在Web應用程序中非常常見,如果允許,可能會造成重大危害。 如果您從未聽說過CSRF,建議您查看有關它的OWASP頁面 。
幸運的是,阻止CSRF攻擊非常簡單,我將向您展示它們的工作方式,以及如何在基于Java的Web應用程序中以盡可能不干擾的方式防御它們。
想象一下,您即將在銀行的安全網頁上進行匯款,當您單擊轉帳選項時,將加載一個表格頁面,您可以選擇借方和貸方帳戶,并輸入要轉移的金額。 當您對選擇感到滿意時,請按“提交”,然后將表單信息發送到銀行的Web服務器,該服務器依次執行交易。
現在,將以下內容添加到圖片中,一個惡意網站(您認為當然沒有害處)在瀏覽器的另一個窗口/選項卡上打開,而您無辜地在銀行站點中移動了數百萬美元。 這個邪惡的網站了解銀行的網絡表單結構,當您瀏覽該網站時,它會嘗試發布從您的帳戶中提取資金并將其存入邪惡的霸主賬戶的交易,之所以能夠這樣做,是因為您與銀行之間存在公開且有效的會話銀行網站使用同一瀏覽器! 這是CSRF攻擊的基礎。
一種簡單有效的預防方法是在加載初始傳輸表單時生成一個隨機(即,不可預測的)字符串并將其發送給瀏覽器。 然后,瀏覽器將這些數據與傳輸選項一起發送,并且服務器會在批準交易進行處理之前對其進行驗證。 這樣,惡意網站即使可以訪問瀏覽器中的有效會話也無法發布交易。
為了在Java中實現此機制,我選擇使用兩個過濾器,一個過濾器為每個請求創建鹽,另一個過濾器進行驗證。 由于用戶請求以及隨后應驗證的POST或GET不一定按順序執行,因此我決定使用基于時間的緩存來存儲有效鹽字符串列表。
用于為請求生成新的鹽并將其存儲在緩存中的第一個過濾器可以編碼如下:
package com.ricardozuasti.csrf;import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.RandomStringUtils;public class LoadSalt implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// Assume its HTTPHttpServletRequest httpReq = (HttpServletRequest) request;// Check the user session for the salt cache, if none is present we create oneCache<String, Boolean> csrfPreventionSaltCache = (Cache<String, Boolean>)httpReq.getSession().getAttribute("csrfPreventionSaltCache");if (csrfPreventionSaltCache == null){csrfPreventionSaltCache = CacheBuilder.newBuilder().maximumSize(5000).expireAfterWrite(20, TimeUnit.MINUTES).build();httpReq.getSession().setAttribute("csrfPreventionSaltCache", csrfPreventionSaltCache);}// Generate the salt and store it in the users cacheString salt = RandomStringUtils.random(20, 0, 0, true, true, null, new SecureRandom());csrfPreventionSaltCache.put(salt, Boolean.TRUE);// Add the salt to the current request so it can be used// by the page rendered in this requesthttpReq.setAttribute("csrfPreventionSalt", salt);chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
我使用Guava CacheBuilder創建鹽緩存,因為它既有大小限制,又有每個條目的過期超時。 為了生成實際的鹽,我使用了由Java 6 SecureRandom支持的Apache Commons RandomStringUtils ,以確保生成強大的種子。
在以AJAX鏈接,發布或調用安全交易的頁面結尾的所有請求中均應使用此過濾器,因此在大多數情況下,最好將其映射到每個請求(也許除了靜態內容(例如圖像) ,CSS等)。 您的web.xml中的映射應類似于:
...<filter><filter-name>loadSalt</filter-name><filter-class>com.ricardozuasti.csrf.LoadSalt</filter-class></filter>...<filter-mapping><filter-name>loadSalt</filter-name><url-pattern>*</url-pattern></filter-mapping>...

就像我說的,要在執行安全交易之前驗證鹽,我們可以編寫另一個過濾器:

package com.ricardozuasti.csrf;import com.google.common.cache.Cache;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;public class ValidateSalt implements Filter  {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// Assume its HTTPHttpServletRequest httpReq = (HttpServletRequest) request;// Get the salt sent with the requestString salt = (String) httpReq.getParameter("csrfPreventionSalt");// Validate that the salt is in the cacheCache<String, Boolean> csrfPreventionSaltCache = (Cache<String, Boolean>)httpReq.getSession().getAttribute("csrfPreventionSaltCache");if (csrfPreventionSaltCache != null &&salt != null &&csrfPreventionSaltCache.getIfPresent(salt) != null){// If the salt is in the cache, we move onchain.doFilter(request, response);} else {// Otherwise we throw an exception aborting the request flowthrow new ServletException("Potential CSRF detected!! Inform a scary sysadmin ASAP.");}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
您應該為每個需要確保安全的請求(例如,檢索或修改敏感信息,轉移資金等)配置此過濾器,例如:
...<filter><filter-name>validateSalt</filter-name><filter-class>com.ricardozuasti.csrf.ValidateSalt</filter-class></filter>...<filter-mapping><filter-name>validateSalt</filter-name><url-pattern>/transferMoneyServlet</url-pattern></filter-mapping>...
配置兩個servlet后,所有受保護的請求都將失敗:)。 要解決此問題,您必須在每個以安全URL結尾的鏈接和表單帖子中添加csrfPreventionSalt參數,該參數包含具有相同名稱的request參數的值。 例如,在JSP頁面內以HTML形式:
...
<form action="/transferMoneyServlet" method="get"><input type="hidden" name="csrfPreventionSalt" value="<c:out value='${csrfPreventionSalt}'/>"/>...
</form>
...

當然,您可以編寫一個自定義標簽,一個不錯的Javascript代碼,或在每個所需的鏈接/表單中添加新參數的方法。

參考: Ricardo Zuasti博客博客上的JCG合作伙伴 Ricardo Zuasti 阻止了Java Web應用程序中的CSRF 。


翻譯自: https://www.javacodegeeks.com/2012/06/preventing-csrf-in-java-web-apps.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372388.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372388.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372388.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows命令行無法啟動redis_windows系統安裝redis

1、下載最新redis https://github.com/MicrosoftArchive/redis/releases我選擇下載msi版本的2.雙擊下載包安裝3.設置redis環境變量&#xff0c;把redis路徑配置到系統變量path值中4啟動redis&#xff0c;cmd進入安裝好redis文件夾 輸入&#xff1a;如果redis啟動出錯Creating S…

SQL Server 篩選時間區間

一、SQL直接判斷 select * from login where pass>2013/03/25 and pass < 2017/04/24 二、DATEDIFF() 函數返回兩個日期之間的時間 --語法 DATEDIFF(datepart,startdate,enddate) --開始時間 startdate --結束時間 enddate --datepart datepart縮寫年yy, yyyy季度qq, …

OpenShift Express Web管理控制臺:入門

本周&#xff0c; 最新版本的OpenShift為已經很棒的PaaS Cloud提供商帶來了兩個非常好的功能。 首先&#xff0c;JBoss AS已從7.0升級到7.1&#xff0c;并且所有新的Express Web Management Console已作為預覽發布。 在本文中&#xff0c;我們將研究如何使用此新控制臺&#xf…

Linux-IP地址后邊加個/8(16,24,32)是什么意思?

是掩碼的位數 A類IP地址的默認子網掩碼為255.0.0.0&#xff08;由于255相當于二進制的8位1&#xff0c;所以也縮寫成“/8”&#xff0c;表示網絡號占了8位&#xff09;; B類的為255.255.0.0&#xff08;/16&#xff09;; C類的為255.255.255.0(/24) /30就是255…

女士細線毛衣起多少針_從起針到縫合,教你織毛衣的各種要點(詳細教程)

新手學織毛衣看過來&#xff0c;7大編織要點幫你解決織好一件毛衣的基礎問題&#xff0c;滿滿的干貨&#xff0c;每點都值得學習!一、起針二、棒針符號三、如何織小樣四、依據小樣推算針數收掛肩的推算五、斜肩針數的推算開前、后領的位置與針數六、袖山的推算七、如何上袖子一…

關于OPENSSL的使用

#import <Foundation/Foundation.h> interface RSAEncryptor : NSObject /** * 加密方法 * * param str 需要加密的字符串 * param path .der格式的公鑰文件路徑 */ (NSString *)encryptString:(NSString *)str publicKeyWithContentsOfFile:(NSString *)path; /*…

Jelastic Java云端平臺

誰在Jelastic背后&#xff1f; 那是我的第一個問題&#xff0c;因此我瀏覽了Jelastic網站。 回答此問題的最佳方法是查看“ Jelastic團隊”部分。 創始人&#xff0c;顧問&#xff0c;特殊合作伙伴構成了一支真正的專業團隊。 作為特殊的合作伙伴&#xff0c;您會發現MySQL&am…

請先設置tkk_攪拌站水泥罐倉頂除塵器設置及調整

攪拌站水泥罐倉頂除塵器采用脈沖噴吹清灰系統&#xff0c;除塵器本體結構&#xff0c;采用標準模板焊接&#xff0c;整體結構&#xff0c;強度牢靠&#xff0c;組裝維修方便&#xff0c;脈沖清灰采用時序控制器MCY系列?控制閥門KEK系列&#xff0c;噴吹清灰頻率及噴吹間隔可手…

Eclipse Meaven Spring SpringMVC Mybaits整合

本示例是在&#xff1a;Ubuntu15上實現的&#xff1b;Windows上安裝Maven將不太相同。 Maven Install Run command sudo apt-get install maven, to install the latest Apache Maven.Run command mvn -version to verify your installation.Where is Maven installed? The co…

抽象類和抽象函數

1.抽象函數的語法特征 什么是抽象函數&#xff1f; 只有函數的定義,沒有函數體的函數被稱為抽象函數&#xff1b; Abstract void fun(); 如果一個類擁有一個或一個以上的抽象函數&#xff0c;那么這個類必須被定義為抽象類 2.抽象類的語法特征 使用abstract定義的類被稱之…

并發–執行程序和Spring集成

基于線程池/執行器的實現 比原始線程版本更好的方法是基于線程池的線程池&#xff0c;其中基于運行任務的系統定義了適當的線程池大小– CPU數量/&#xff08;任務的1-Blocking Coefficient&#xff09;。 Venkat Subramaniams書中有更多詳細信息&#xff1a; 首先&#xff0c…

后面的參數_英特爾I系列CPU大家都知道,后面的參數你有沒有了解過

嗨&#xff01;大家好&#xff0c;我是偉仔&#xff0c;今天主要是和大家聊下CPU。大多數人買筆記本或臺式電腦對CPU的要求就知道I5或者I7之類的。像是I7一定比I5要好&#xff0c;I3很LOU這樣的&#xff0c;當然這樣子的觀點是不正確的&#xff0c;今天我會告訴大家&#xff0c…

設置Linux保留物理內存並使用 (1)

在Linux系統中可以通過memblock來設置系統保留物理內存&#xff0c;防止這些內存被內存管理系統分配出去。 作者&#xff1a; 彭東林 郵箱&#xff1a; pengdonglin137163.com 平臺 硬件平臺&#xff1a; TQ2440 Linux版本&#xff1a;Linux 3.14.45 說明 1. 在tq2440上&#x…

移動端

http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html 移動端手淘使用方案 移動端px自動轉換rem插件 CSSREM Flexible 轉載于:https://www.cnblogs.com/yuruiweb/p/6723580.html

OutOfMemoryError:Java堆空間–分析和解決方法

java.lang.OutOfMemoryError&#xff1a;Java堆問題是在支持或開發復雜的Java EE應用程序時可能會遇到的最復雜的問題之一。 這篇簡短的文章將為您提供此JVM HotSpot OutOfMemoryError錯誤消息的描述&#xff0c;以及在解決該問題之前應如何解決此問題。 有關如何確定要處理的O…

函數偽代碼_Excel常用函數

歡迎大家在此收看任我行office教程系列&#xff0c;這一期我來為大家講什么內容呢&#xff0c;那就是幾個office的幾個常用函數了&#xff0c;如果您不會這些函數和函數嵌套那么您的Excel電子表格也就別玩了哈&#xff0c;那么他們分別是什么函數呢。咱們現在隆重有請這幾位函數…

阻止Ajax多次提交

1、Ajax的abort() xhr $.ajax({})if (xhr){xhr.abort(); } 2、通過在Ajax的beforeSend()方法以及complete()方法添加刪除類&#xff0c;對類進行判斷&#xff0c;對于兩者來回切換的時候&#xff0c;對類的設置不好進行操作上的時候&#xff0c;可以通過使用一個input框&#…

POJ3675 Telescope 圓和多邊形的交

POJ3675 用三角剖分可以輕松搞定&#xff0c;數據也小 隨便AC。 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<vector> usi…

windows搭建python開發環境方法_04 Windows下搭建 Python 開發環境 - Python 入門教程

前面兩個小節中我們已經學習了在 MacOS 和 Ubuntu 中安裝 Python 的開發環境。當然&#xff0c;作為用戶基數最多的 Windows 操作系統&#xff0c;我們當然不會忘記&#xff0c;這節課我們就來學習下如何在 Windows 下搭建 Python 的開發環境。1. 下載 Python1.1 Python 2 與 P…

消除view旋轉后邊緣有鋸齒的情況

view的layer中有個屬性叫 allowsEdgeAntialiasing&#xff1b; 在形變后有邊緣有鋸齒的話 可以 view.layer.allowsEdgeAntialiasing YES; 消除鋸齒 如果直接在*-Info.plist配置 Renders with edge antialiasing YES 會導致UIAlertView顯示有問題。轉載于:https://www.cnblogs…