Einführung in CSRF
CSRF (Cross-Site-Anfrage), chinesischer Name: Cross-Site-Anfrage-Fälschung, auch bekannt als: One-Klick-Angriffs-/Sitzungsreiten, Abkürzung: CSRF/XSRF.
Weitere Einführungen und Angriffsmethoden von SCRF finden Sie in der Einführung von Baidu Encyclopedia und der Analyse eines großen Mannes:
CSRF Baidu Encyclopedia diskutiert kurz CSRF -Angriffsmethoden
Konfigurationsschritte
1. Abhängig vom JAR -Paket
<properties> <spring.security.version> 4.2.2.Release </spring.security.version> </properties> <Deponcy> <GroupID> org.springFramework <De vorhöhe> <gruppe> org.springframework <artifactid> Spring-Security-Config </artifactId> <version> $ {Spring.Security.version} </Version> </abhängig> 2.Web.xml Konfiguration
<Filter> <Filter-name> SpringSecurityFilterChain </filter-name> <filterklasse> org.springframework.web.filter.delegatingfilterProxy </Filter-Class> </filter> <Filter-Mapping> <Filter-name <URL-Muster>/*</url-puster> </filtermapping>
3. Konfiguration der Federkonfigurationsdatei
<bean id="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" /> </Sicherheit: http>
4. Passen Sie die Implementierungsklasse von RequestMatcher CSRFSecurityRequestMatcher an
Diese Klasse wird verwendet, um anzupassen, welche Anfragen kein Abfangen und Filtern erfordern. Wenn CSRF konfiguriert ist, werden alle HTTP -Anforderungen von CSRFFilter abgefangen, und es gibt eine private Klasse DefaultrequirescsrfMatcher in CSRffilter.
Quellcode 1: DefaultrequirescsrfMatcher -Klasse
private statische endgültige Klasse DefaultrequirescsrfMatcher implementiert RequestMatcher {private endgültige Hashset <string> erlaubtMethods; private defaUltequIrescsrfMatcher () {this.allowedMethods = new Hashset (arrays.aslist (new String [] {"get", "head", "Trace", "Optionen"})); } public boolean Matches (httpServletRequest -Anfrage) {return! this.alowedMethods.contains (Request.getMethod ()); }} Aus diesem Quellcode können wir feststellen, dass die Post -Methode ausgeschlossen ist, dh nur die vier Arten von Methoden wie Get | Head | Trace | Optionen werden veröffentlicht. Die HTTP -Anforderungen anderer Methoden müssen überprüfen, ob das _csrf -Token korrekt ist. Wenn Sie den REST -Schnittstellendienst in der Post -Methode aufrufen, gibt es normalerweise kein _csrf -Token, was dazu führt, dass unsere REST -Schnittstelle fehlschlägt. Wir müssen eine Klasse anpassen, um die Schnittstelle dieses Typs zu veröffentlichen. Schauen wir uns unsere maßgeschneiderten Filter an:
Quellcode 2: CSRFSecurityRequestMatcher -Klasse
öffentliche Klasse csrfSecurityRequestMatcher implementiert RequestMatcher {private muster erlaubtMethods = muster.comPile ("^(Get | Head | Trace | Optionen) $"); private regexRequestMatcher ungeschütztMatcher = new RegexRequestMatcher ("^/rest /.*", null); @Override public boolean Matches (httpServletRequest -Anforderung) {if (erlaubteMethods.matcher (request.getMethod ()). Matches ()) {return false; } return! ungeschütztMatcher.Matches (Anfrage); }} HINWEIS: Im Allgemeinen sind die von uns definierten REST -Schnittstellendienste alle mit /ruhen /, wenn Ihr Projekt nicht verwendet wird oder es im Projekt keinen REST -Service gibt, kann diese Klasse vollständig weggelassen werden.
5. Konfiguration der Anforderung an Anforderung
Im Allgemeinen befindet sich in unserem Projekt eine gemeinsame JSP -Datei, auf die auf jeder Seite verwiesen wird, sodass wir in der gemeinsamen Datei die folgende Konfiguration erstellen können:
<meta name = "_ csrf" content = "$ {_ csrf.token}"/> <meta name = "_ csrf_header" content = "$ {_ csrf.hedeName}"/> <script> var token = $ ("meta [name = csrf ']. var header = $ ("meta [name = '_ csrf_header']"). attr ("Inhalt"); $ .ajaxSetUp ({Beforesend: function (xhr) {if (Header && token) {xhr.setRequestheader (Header, Token);}}}); </script> $ .AjaxSetup bedeutet, diesen Header und Token zu allen unseren Anfragen hinzuzufügen oder in Form eines Formulars zu setzen. Beachten Sie, dass _csrf mit der Konfiguration in der Konfigurationsdatei der Spring Security übereinstimmt und der Standardwert _csrf ist.
Quellcodeanalyse
Wir wissen, dass, da CSRF konfiguriert ist, alle HTTP -Anfragen von CSRFFilter abgefangen werden. Nachdem Sie sich den Quellcode von CSRFFilter angesehen haben, werden Sie das Prinzip auf einen Blick auf das Prinzip klarstellen. Hier schauen wir uns nur die spezifische Filtermethode an:
Quellcode 3: Dofilterinternale Methode von CSRFFilter
Protected Void DofilterInternal (httpServletRequest -Anforderung, HttpServletResponse -Antwort, Filterchain Filterchain) löst ServletException aus, ioException {request.setAttribute (httpServletResponus.class.getname (), Antwort); Csrftoken csrftoken = this.tokenRepository.loadToken (Anfrage); boolean fissionToken = csrftoken == null; if (fehlende teka) {// Wenn das Token leer ist, bedeutet dies, dass beim ersten Mal, wenn Sie darauf zugreifen, ein Token -Objekt csrftoken = this.tokenRepository.generatetoken (Anfrage); this.tokenRepository.saveteoken (csrftoken, Anfrage, Antwort); } request.setAttribute (csrftoken.class.getName (), csrftoken); // Steck das Token -Objekt in die Anforderung, beachten Sie, dass der Schlüssel hier csrftoken.getParametername () = _csrf ist, also schreiben wir es auf der Seite zu Tode. Request.SetAttribute (csrftoken.getParametername (), csrftoken); // Dieser Maschine ist der Filter, den wir in der Feder -Konfigurationsdatei anpassen, dh erhalten, Kopf, Verfolgung, Optionen und unsere Ruhe nicht behandeln, ob (! This.requirecsrfProtectionMatcher.Matches (Anfrage)) {Filterchain.dofilter (Anfrage, Antwort); } else {string trupleToken = request.getheader (csrftoken.getheadername ()); if (tructToken == null) {trupleToken = request.getParameter (csrftoken.getParameTername ()); } if (! csrftoken.getToken (). Equals (tatsächliche)) {if (this.logger.isdebugenabled ()) {this.logger.debug ("Ungültiges CSRF -Token für" + urlutils.buildFullEresturl (Anfrage)); } if (fehlte) {this.accessDeniedHandler.Handle (Anfrage, Antwort, neue vermissteCSrftokenException (tatsächlich)); } else {this.accessDeniedHandler.handle (Anfrage, Antwort, neu InvalidCSrftokenException (csrftoken, tatsächliche teen)); }} else {filterchain.dofilter (request, Antwort); }}}Wie aus dem Quellcode hervorgeht, erfordern andere Anfragen als unsere angepassten Filter eine Token -Überprüfung.
Ursprünglich wollte ich einen Screenshot machen, um einen Fall zu erhalten, und dann den Haltepunkt verwenden, um den Wertübertragungsstatus der Seite und den Hintergrund zu sehen ... Ich kann jedoch keine Bilder hier hochladen und verrückt werden. OK, so viel zu fassen! Wenn Sie falsches Schreiben haben oder andere Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.