SpringSecurity的防Csrf攻擊實現代碼解析-創新互聯

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為One Click Attack或者Session Riding,通常縮寫為CSRF或XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝成受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。

創新互聯是一家集網站建設,龍子湖企業網站建設,龍子湖品牌網站建設,網站定制,龍子湖網站建設報價,網絡營銷,網絡優化,龍子湖網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。

CSRF是一種依賴web瀏覽器的、被混淆過的代理人攻擊(deputy attack)。

如何防御

使用POST請求時,確實避免了如img、script、iframe等標簽自動發起GET請求的問題,但這并不能杜絕CSRF攻擊的發生。一些惡意網站會通過表單的形式構造攻擊請求

public final class CsrfFilter extends OncePerRequestFilter {
 public static final RequestMatcher DEFAULT_CSRF_MATCHER = new
   CsrfFilter.DefaultRequiresCsrfMatcher();
 private final Log logger = LogFactory.getLog(this.getClass());
 private final CsrfTokenRepository tokenRepository;
 private RequestMatcher requireCsrfProtectionMatcher;
 private AccessDeniedHandler accessDeniedHandler;
 public CsrfFilter(CsrfTokenRepository csrfTokenRepository) {
  this.requireCsrfProtectionMatcher = DEFAULT_CSRF_MATCHER;
  this.accessDeniedHandler = new AccessDeniedHandlerImpl();
  Assert.notNull(csrfTokenRepository, "csrfTokenRepository cannot be null");
  this.tokenRepository = csrfTokenRepository;
 }
 //通過這里可以看出SpringSecurity的csrf機制把請求方式分成兩類來處理
 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) {
   csrfToken = this.tokenRepository.generateToken(request);
   this.tokenRepository.saveToken(csrfToken, request, response);
  }
  request.setAttribute(CsrfToken.class.getName(), csrfToken);
  request.setAttribute(csrfToken.getParameterName(), csrfToken);
//第一類:"GET", "HEAD", "TRACE", "OPTIONS"四類請求可以直接通過
  if (!this.requireCsrfProtectionMatcher.matches(request)) {
   filterChain.doFilter(request, response);
  } else {
//第二類:除去上面四類,包括POST都要被驗證攜帶token才能通過
   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);
   }
  }
 }
 public void setRequireCsrfProtectionMatcher(RequestMatcher requireCsrfProtectionMatcher) {
  Assert.notNull(requireCsrfProtectionMatcher, "requireCsrfProtectionMatcher cannot be
  null");
  this.requireCsrfProtectionMatcher = requireCsrfProtectionMatcher;
 }
 public void setAccessDeniedHandler(AccessDeniedHandler accessDeniedHandler) {
  Assert.notNull(accessDeniedHandler, "accessDeniedHandler cannot be null");
  this.accessDeniedHandler = accessDeniedHandler;
 }
 private static final class DefaultRequiresCsrfMatcher implements RequestMatcher {
  private final HashSet<String> allowedMethods;
  private DefaultRequiresCsrfMatcher() {
   this.allowedMethods = new HashSet(Arrays.asList("GET", "HEAD", "TRACE", "OPTIONS"));
 }
  public boolean matches(HttpServletRequest request) {
   return !this.allowedMethods.contains(request.getMethod());
  }
 }
}

另外有需要云服務器可以了解下創新互聯建站m.kartarina.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

當前題目:SpringSecurity的防Csrf攻擊實現代碼解析-創新互聯
文章路徑:http://m.kartarina.com/article20/dcjhco.html

成都網站建設公司_創新互聯,為您提供全網營銷推廣動態網站面包屑導航云服務器網站設計靜態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站優化排名
主站蜘蛛池模板: 亚洲 另类 无码 在线| 无码人妻丰满熟妇啪啪网站牛牛| 亚洲国产日产无码精品| 未满小14洗澡无码视频网站| 亚洲熟妇无码一区二区三区| 无码h黄肉3d动漫在线观看| 国产AV无码专区亚洲精品| 亚洲大尺度无码无码专线一区| 本道天堂成在人线av无码免费| 精品人妻无码区在线视频| 中文无码精品一区二区三区| 乱色精品无码一区二区国产盗| 人妻无码久久久久久久久久久| 在线看无码的免费网站| 中文无码精品一区二区三区| 亚洲AV成人噜噜无码网站| 免费无码一区二区三区蜜桃| 黑人巨大无码中文字幕无码 | 国产成人AV片无码免费| 无码视频免费一区二三区| 国精品无码一区二区三区在线 | 日韩精品人妻系列无码av东京| 无码中文字幕乱在线观看| 国产精品热久久无码av| 内射人妻无码色AV天堂| 亚洲一区AV无码少妇电影| 亚洲日韩欧洲无码av夜夜摸| 特级无码a级毛片特黄| 亚洲av成人无码网站…| 亚洲中文字幕无码mv| 久久精品亚洲中文字幕无码麻豆 | 精品久久久无码中文字幕| 亚洲午夜无码久久久久小说| 亚洲国产超清无码专区| 亚洲国产成AV人天堂无码| 无码国产精品一区二区免费式直播| 国产无遮挡无码视频免费软件| 亚洲精品色午夜无码专区日韩| 亚洲日韩v无码中文字幕| 国产成人AV一区二区三区无码| 大桥久未无码吹潮在线观看|