亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解利用spring-security解決CSRF問題

2024-07-14 08:40:23
字體:
來源:轉載
供稿:網友

CSRF介紹

CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。

具體SCRF的介紹和攻擊方式請參看百度百科的介紹和一位大牛的分析:
CSRF百度百科
淺談CSRF攻擊方式

配置步驟

1.依賴jar包

<properties>     <spring.security.version>4.2.2.RELEASE</spring.security.version>   </properties> <dependency>         <groupId>org.springframework.security</groupId>         <artifactId>spring-security-core</artifactId>         <version>${spring.security.version}</version>       </dependency>        <dependency>         <groupId>org.springframework.security</groupId>         <artifactId>spring-security-web</artifactId>         <version>${spring.security.version}</version>       </dependency>        <dependency>         <groupId>org.springframework.security</groupId>         <artifactId>spring-security-config</artifactId>         <version>${spring.security.version}</version>       </dependency> 

2.web.xml配置

<filter>     <filter-name>springSecurityFilterChain</filter-name>     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>   </filter>    <filter-mapping>     <filter-name>springSecurityFilterChain</filter-name>     <url-pattern>/*</url-pattern>   </filter-mapping> 

3.Spring配置文件配置

<bean id="csrfSecurityRequestMatcher" class="com.xxx.CsrfSecurityRequestMatcher"></bean>    <security:http auto-config="true" use-expressions="true">     <security:headers>       <security:frame-options disabled="true"/>     </security:headers>     <security:csrf request-matcher-ref="csrfSecurityRequestMatcher" />   </security:http> 

4.自定義RequestMatcher的實現類CsrfSecurityRequestMatcher

這個類被用來自定義哪些請求是不需要進行攔截過濾的。如果配置csrf,所有http請求都被會CsrfFilter攔截,而CsrfFilter中有一個私有類DefaultRequiresCsrfMatcher。

源碼1:DefaultRequiresCsrfMatcher類

private static final class DefaultRequiresCsrfMatcher implements RequestMatcher {     private final HashSet<String> allowedMethods;      private DefaultRequiresCsrfMatcher() {       this.allowedMethods = new HashSet(Arrays.asList(new String[]{"GET", "HEAD", "TRACE", "OPTIONS"}));     }      public boolean matches(HttpServletRequest request) {       return !this.allowedMethods.contains(request.getMethod());     }   } 

從這段源碼可以發現,POST方法被排除在外了,也就是說只有GET|HEAD|TRACE|OPTIONS這4類方法會被放行,其它Method的http請求,都要驗證_csrf的token是否正確,而通常post方式調用rest接口服務時,又沒有_csrf的token,所以會導致我們的rest接口調用失敗,我們需要自定義一個類對該類型接口進行放行。來看下我們自定義的過濾器:

源碼2:csrfSecurityRequestMatcher類

public class CsrfSecurityRequestMatcher implements RequestMatcher {   private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");   private RegexRequestMatcher unprotectedMatcher = new RegexRequestMatcher("^/rest/.*", null);    @Override   public boolean matches(HttpServletRequest request) {     if(allowedMethods.matcher(request.getMethod()).matches()){       return false;     }      return !unprotectedMatcher.matches(request);   } } 

說明:一般我們定義的rest接口服務,都帶上 /rest/ ,所以如果你的項目中不是使用的這種,或者項目中沒有rest服務,這個類完全可以省略的。

5.post請求配置

一般我們的項目中都有一個通用的jsp文件,就是每個頁面都會引用的,所以我們可以在通用文件中做如下配置:

<meta name="_csrf" content="${_csrf.token}"/> <meta name="_csrf_header" content="${_csrf.headerName}"/>  <script>    var token = $("meta[name='_csrf']").attr("content");   var header = $("meta[name='_csrf_header']").attr("content");   $.ajaxSetup({     beforeSend: function (xhr) {       if(header && token ){         xhr.setRequestHeader(header, token);       }     }}   ); </script> 

$.ajaxSetup的意思就是給我們所有的請求都加上這個header和token,或者放到form表單中。注意,_csrf這個要與spring security的配置文件中的配置相匹配,默認為_csrf。

源碼解析

我們知道,既然配置了csrf,所有的http請求都會被CsrfFilter攔截到,所以看下CsrfFilter的源碼就對原理一目了然了。這里我們只看具體過濾的方法即可:

源碼3:CsrfFilter的doFilterInternal方法

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {     request.setAttribute(HttpServletResponse.class.getName(), response);     CsrfToken csrfToken = this.tokenRepository.loadToken(request);     boolean missingToken = csrfToken == null;     if(missingToken) {//如果token為空,說明第一次訪問,生成一個token對象       csrfToken = this.tokenRepository.generateToken(request);       this.tokenRepository.saveToken(csrfToken, request, response);     }      request.setAttribute(CsrfToken.class.getName(), csrfToken);     //把token對象放到request中,注意這里key是csrfToken.getParameterName()= _csrf,所以我們頁面上才那么寫死。     request.setAttribute(csrfToken.getParameterName(), csrfToken);          //這個macher就是我們在Spring配置文件中自定義的過濾器,也就是GET,HEAD, TRACE, OPTIONS和我們的rest都不處理     if(!this.requireCsrfProtectionMatcher.matches(request)) {       filterChain.doFilter(request, response);     } else {       String actualToken = request.getHeader(csrfToken.getHeaderName());       if(actualToken == null) {         actualToken = request.getParameter(csrfToken.getParameterName());       }        if(!csrfToken.getToken().equals(actualToken)) {         if(this.logger.isDebugEnabled()) {           this.logger.debug("Invalid CSRF token found for " + UrlUtils.buildFullRequestUrl(request));         }          if(missingToken) {           this.accessDeniedHandler.handle(request, response, new MissingCsrfTokenException(actualToken));         } else {           this.accessDeniedHandler.handle(request, response, new InvalidCsrfTokenException(csrfToken, actualToken));         }        } else {         filterChain.doFilter(request, response);       }     }   } 

從源碼中可以看到,通過我們自定義的過濾器以外的post請求都需要進行token驗證。

本來呢,是想截圖弄個案例上去的,然后通過斷點看看頁面和后臺的傳值情況....不過,我這里沒法上傳圖片抓狂。好吧,就總結這么多吧!如果有寫的不對的或者有其他問題可以留言交流。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
57pao成人永久免费视频| 91av在线免费观看视频| 日韩精品免费观看| 欧美另类99xxxxx| 精品国产自在精品国产浪潮| 日韩精品视频三区| 日韩在线观看av| 日本精品免费观看| 激情成人在线视频| 九九热精品视频国产| www.久久撸.com| 青青草精品毛片| 欧美久久精品午夜青青大伊人| 国产精品视频大全| 亚洲人成网站色ww在线| 亚洲一区二区三区xxx视频| 成人午夜激情免费视频| 欧美日韩aaaa| 国产一区玩具在线观看| 欧美成人中文字幕在线| 26uuu久久噜噜噜噜| 456亚洲影院| 97不卡在线视频| 亚洲一区二区三区视频| 日韩电影中文字幕在线观看| 成人亚洲欧美一区二区三区| 国产精品大陆在线观看| 国产精品久久不能| 夜夜狂射影院欧美极品| 91久久精品国产91久久| 大量国产精品视频| 欧美成人国产va精品日本一级| 日韩av电影手机在线观看| 57pao成人永久免费视频| 亚洲第一中文字幕在线观看| 国产成人激情小视频| 欧美怡红院视频一区二区三区| 欧美人成在线视频| 高清日韩电视剧大全免费播放在线观看| 国产精品网址在线| 亚洲免费高清视频| 国产成人综合亚洲| 日韩在线免费高清视频| 97色在线播放视频| 日韩专区中文字幕| 中日韩美女免费视频网站在线观看| 久久久91精品国产一区不卡| 久久综合久久八八| 国产有码在线一区二区视频| 亚洲人成77777在线观看网| 国产精品久久精品| 成人在线视频网| 欧美日韩一区二区在线| 欧美精品在线看| 成人免费观看网址| 日韩精品极品在线观看播放免费视频| 亚洲国产精品99久久| 欧美亚洲国产视频小说| 久久久久久高潮国产精品视| 一本一本久久a久久精品牛牛影视| 夜色77av精品影院| 一级做a爰片久久毛片美女图片| 91精品视频在线| 国产精品18久久久久久首页狼| 国产精品一区二区3区| 亚洲级视频在线观看免费1级| 成人黄色生活片| 亚洲免费av网址| 色哟哟亚洲精品一区二区| 欧美成在线视频| 国产成人精彩在线视频九色| 午夜精品国产精品大乳美女| 国产精品久久久久久久久久东京| 国产成人在线精品| 日本精品视频在线观看| 欧美中文字幕视频| 伊人激情综合网| 欧美国产一区二区三区| 91精品国产91久久| 欧美www在线| 亚洲乱码一区二区| 欧美夫妻性生活视频| 亚洲精品videossex少妇| 国产精品pans私拍| 日本aⅴ大伊香蕉精品视频| 在线成人中文字幕| 91av在线免费观看| 77777亚洲午夜久久多人| 国产精品第三页| 亚洲精品av在线播放| 国产精品久久久久av| 国产va免费精品高清在线| 日韩免费av片在线观看| 2019国产精品自在线拍国产不卡| 欧美日韩一区二区三区在线免费观看| 深夜福利91大全| 亚洲天堂网在线观看| 日韩美女在线播放| 亚洲另类xxxx| 欧美午夜宅男影院在线观看| www.日韩不卡电影av| 中文字幕亚洲欧美一区二区三区| 亚洲精品成人av| 国产精品久久久久久久久免费看| 国内久久久精品| 欧美男插女视频| 97在线视频免费观看| 欧美午夜激情在线| 亚洲高清福利视频| 日韩精品中文字幕视频在线| 日韩欧美aaa| 国产suv精品一区二区三区88区| 九色精品美女在线| 亚洲精品久久久一区二区三区| 欧美一级片在线播放| 亚洲电影免费观看高清完整版在线观看| 午夜精品久久久久久99热| 亚洲精品wwwww| 国产欧美在线视频| 国产精品久久久久久久久久三级| 97精品免费视频| 久久久91精品| 亚洲新中文字幕| 亚洲精品97久久| 亚洲欧美日韩国产中文专区| 欧美人与性动交| 91在线视频一区| 91系列在线播放| 91免费视频国产| 精品呦交小u女在线| 中文字幕精品一区久久久久| 77777少妇光屁股久久一区| 亚洲伊人一本大道中文字幕| 国产精品男人的天堂| 精品久久久久久中文字幕大豆网| 亚洲欧美日韩一区二区在线| 亚洲第一精品夜夜躁人人躁| 7m第一福利500精品视频| www国产精品com| 亚洲成人1234| 亚洲一区二区久久久久久久| 中文字幕亚洲第一| 国产91精品久久久久| 欧美丝袜美女中出在线| 欧美午夜电影在线| 亚洲跨种族黑人xxx| 欧美性猛交xxxx乱大交极品| 欧美丝袜美女中出在线| 国产精品视频色| 亚洲国产一区自拍| 成人久久一区二区三区| 日韩欧美在线免费观看| 一道本无吗dⅴd在线播放一区| 亚洲一区二区三区毛片| 日韩欧美在线国产| 国产成人啪精品视频免费网| 一本色道久久88亚洲综合88| 欧美巨大黑人极品精男| 91成人免费观看网站| 97精品国产91久久久久久| 欧美在线www| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品户外野外| 2019av中文字幕|