CSRF 소개
CSRF (크로스 사이트 요청 위조), 중국 이름 : 크로스 사이트 요청 위조, 또한 : 원 클릭 공격/세션 라이딩, 약어 : CSRF/XSRF.
SCRF의 특정 소개 및 공격 방법은 Baidu 백과 사전의 소개 및 큰 사람의 분석을 참조하십시오.
CSRF Baidu 백과 사전은 CSRF 공격 방법에 대해 간단히 설명합니다
구성 단계
1. JAR 패키지에 의존합니다
<properties> <spring.security.version> 4.2.2. Release </spring.security.version> </properties> <pectionency> <groupid> org.springframework.security </groupICID> <artifActID> spring-security-core </artifactid> <version> $ {spring.security.version} </version> <groupid> org.springframework.security </groupid> <artifactid> spring-security-web </artifactid> <버전> $ {spring.security.version} </version> </dependency> <pelection> <groupid> org.springframework.security </GroupId> <artifactid> Spring-eCutifIg <버전> $ {spring.security.version} </version> </fectionency> 2.Web.xml 구성
<filter> <filter-name> springsecurityfilterchain </filter-name> <filter-class> org.springframework.wilter.delegatingfilterproxy </filter-class> </filter> <filter-mapping> <filter-name> springsecurityfilterchain </urltern>/**/*/filtern> </필터 매핑>
3. 스프링 구성 파일 구성
<bean id = "csrfsecurityrequestmatcher"> </bean> <security : http auto-config = "true"use-pexpressions = "true"> <보안 : 보안 : 보안 : 프레임-옵션 비활성화 = "true"/</security : headers> <보안 : csrf request-matcher-ref = "csrfsecurityRequestmatcher"/>. </보안 : http>
4. requestmatcher csrfsecurityrequestmatcher의 구현 클래스를 사용자 정의합니다
이 클래스는 가로 채기 및 필터링이 필요하지 않은 요청을 사용자 정의하는 데 사용됩니다. CSRF가 구성되면 모든 HTTP 요청은 CSRFFILTER에 의해 차단되며 CSRFFILTER에는 개인 클래스 DefaultRequirescsrfmatcher가 있습니다.
소스 코드 1 : DefaultRequirescsrfmatcher 클래스
개인 정적 최종 클래스 DefaultRequirescsrfmatcher는 RequestMatcher {private final Hashset <string> 허용 메드를 구현합니다. private defaultrequirescsrfmatcher () {this.hallowedMethods = new Hashset (arrays.aslist (new String [] { "get", "head", "trace", "옵션"})); } public boolean matches (httpservletrequest 요청) {return! this.allowedMethods.contains (request.getMethod ()); }} 이 소스 코드에서 게시물 메소드가 제외되었음을 알 수 있습니다. 다른 방법의 HTTP 요청은 _CSRF 토큰이 올바른지 확인해야합니다. 일반적으로 Post 메소드에서 REST 인터페이스 서비스를 호출 할 때 _CSRF 토큰이 없으므로 REST 인터페이스가 실패하게됩니다. 이 유형의 인터페이스를 해제하려면 클래스를 사용자 정의해야합니다. 맞춤형 필터를 살펴 보겠습니다.
소스 코드 2 : CSRFSecurityRequestMatcher 클래스
공개 클래스 CSRFSECURITEREQUESTMATCHER는 RequestMatcher를 구현합니다. private regexRequestMatcher 보호되지 않은 matcher = 새로운 regexRequestMatcher ( "^/rest /.*", null); @override public boolean matches (httpservletrequest request) {if (alledmethods.matcher (request.getMethod ()). matches ()) {return false; } return! 보호되지 않은 matcher.matches (요청); }} 참고 : 일반적으로, 우리가 정의하는 나머지 인터페이스 서비스는 모두 /REST /이므로 프로젝트를 사용하지 않거나 프로젝트에 REST 서비스가없는 경우이 클래스를 완전히 생략 할 수 있습니다.
5. 게시물 요청 구성
일반적으로 프로젝트에는 공통 JSP 파일이 있으며 각 페이지에서 참조되므로 공통 파일에서 다음 구성을 만들 수 있습니다.
<meta name = "_ csrf"content = "$ {_ csrf.token}"/> <meta name = "_ csrf_header"content = "$ {_ csrf.headername}"/> <cript> var token = $ ( "meta [name = '_ csrf']")). var header = $ ( "meta [name = '_ csrf_header']"). attr ( "content"); $ .ajaxSetup ({beforesend : function (xhr) {if (header && token) {xhr.setRequestHeader (header, token);}}); </스크립트> $ .AjaxSetup은 모든 요청 에이 헤더와 토큰을 추가하거나 양식 양식에 넣는 것을 의미합니다. _CSRF는 스프링 보안의 구성 파일의 구성과 일치하고 기본값은 _CSRF입니다.
소스 코드 분석
CSRF가 구성되므로 모든 HTTP 요청은 CSRFFILTER에 의해 가로 채므로 CSRFFILTER의 소스 코드를 살펴보면 한눈에 원리에 대해 분명하게 될 것입니다. 여기서는 특정 필터링 방법 만 살펴 봅니다.
소스 코드 3 : CSRFFILTER의 DOFILTERINTERNAL 방법
보호 된 void dofilterInternal (httpservletrequest 요청, httpservletResponse 응답, 필터 체인 필터 체인)은 servletexception, ioexception {request.setAttribute (httpservletResponse.class.getName (), 응답); csrftoken csrftoken = this.tokenrepository.loadtoken (요청); 부울 누락 = csrftoken == null; if (missingToken) {// 토큰이 비어 있으면 처음 액세스 할 때 토큰 객체 csrftoken = this.tokenRepository.generateToken (요청)을 생성한다는 것을 의미합니다. this.tokenrepository.savetoken (csrftoken, 요청, 응답); } request.setAttribute (csrftoken.class.getName (), csrftoken); // 토큰 객체를 요청에 넣고 여기의 키는 csrftoken.getParameterName () = _csrf이므로 페이지에서 죽음으로 씁니다. request.setattribute (csrftoken.getParameterName (), csrftoken); //이 컴퓨터는 스프링 구성 파일에서 사용자 정의하는 필터입니다. } else {string realyToken = request.getHeader (csrftoken.getheaderName ()); if (realtoken == null) {actualToken = request.getParameter (csrftoken.getParameterName ()); } if (! csrftoken.getToken (). equals (realteToken))) {if (this.logger.isdebugenabled ()) {this.logger.debug ( " + urlutils.buildfullrequesturl (request)에 대해 찾은 csrf 토큰); } if (MissingToken) {this.accessdeniedhandler.handle (요청, 응답, 새로운 MissingCsrftokenexception (realtoken)); } else {this.accessdeniedhandler.handle (요청, 응답, 새로운 invalidcsrftokenexception (csrftoken, realtoken)); }} else {filterchain.dofilter (요청, 응답); }}}소스 코드에서 볼 수 있듯이 사용자 정의 필터 이외의 게시물은 토큰 확인이 필요합니다.
원래, 나는 케이스를 얻기 위해 스크린 샷을 찍고, 중단 점을 사용하여 페이지와 배경의 값 전송 상태를 확인하고 싶었습니다. 그러나 여기에 사진을 업로드하고 미쳐 버릴 수 없습니다. 좋아요, 요약 할 예정입니다! 글쓰기가 잘못되었거나 다른 질문이 있으면 의사 소통 할 메시지를 남길 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.