Da es zu den obigen Kombinationen nur wenige Informationen gab, habe ich sie zusammengefasst.
Als Maßnahme gegen CSRF (Cross-Site Request Forgery) wird eine allgemeine Token-Ausstellungsmethode verwendet. Es ist einfach, Set-Cookie zu verwenden, um die Token-Informationen vom Server an den Client zu benachrichtigen. Spring Boot erledigt das für Sie. [^ 1] Die Tokenübertragung vom Client zum Server wird unabhängig in JavaScript geschrieben, und Cookie-Informationen werden mit Ausnahme der GET-Anforderung [^ 2] in den http-Header geschrieben.
[^ 1]: Selbst wenn Sie das Token mit Cookie übergeben (zunächst aus Versehen), sendet der Browser es ohne Erlaubnis, als hätten Sie die Sitzungs-ID mit Cookie, sodass es als CSRF-Maßnahme bedeutungslos ist. Ich dachte, aber beim Überprüfen des CSRF-Tokens in Spring Boot wird nicht der Cookie-Wert, sondern "_csrf der Formulardaten" oder "X-XSRF-TOKEN des http-Headers" angezeigt. Es war ein Miso. Es ist notwendig, das Token aus dem Cookie zu ersetzen, um Daten oder einen http-Header zu bilden. Dies ist jedoch mit Cross-Origin-JS nicht möglich (Sie können das Cookie der legitimen Domain nicht sehen), daher ist dies eine Gegenmaßnahme.
[^ 2]: In Anbetracht der Merkmale von CSRF-Angriffen ist eine Überprüfung mit einer GET-Anforderung nicht erforderlich. Spring Boot führt keine serverseitigen Überprüfungen durch.
Spring Boot
CSRF-Kennzahlen sind standardmäßig aktiviert, aber das Token-Speicherziel ist angegeben und httpOnly ist deaktiviert.
SecurityConfig.java
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
...//Ausgelassen. Definieren Sie die erforderlichen Definitionen entsprechend.
}
}
Ext JS
Da es notwendig ist, allen von Ajax übersprungenen Anforderungen Token zu geben, wird es an der Stelle definiert, die als höher bezeichnet wird.
Durch die Definition als "vor der Anforderung" wird die Verarbeitung vor dem Ausgeben einer Ajax-Anforderung ausgeführt, sodass sie nicht einzeln implementiert werden muss.
app.js
Ext.Ajax.on('beforerequest', function (conn, request, eOpts) {
//Gewähren Sie ein CSRF-Token in anderen Fällen als GET-Anforderungen.
if (request.method === 'GET') {
return;
}
//Cookie XSRF-TOKEN-Elementwert, beliebiger http-Header X.-XSRF-Grant als TOKEN.
if (document.cookie) {
var cookies = document.cookie.split(";");
for (var i = 0; i < cookies.length; i++) {
var str = cookies[i].split("=");
if (str[0] == 'XSRF-TOKEN') {
conn.setDefaultHeaders({ 'X-XSRF-TOKEN': unescape(str[1]) });
break;
}
}
}
});
Recommended Posts