Grundlegende und systematische Geschichte Zertifizierungs- / Autorisierungsgeschichte Remember-Me-Geschichte CSRF-Geschichte Session Management Story Method Security Story CORS-Geschichte Die Geschichte von Run-As ACL-Geschichte Teststory Sprechen Sie über die Zusammenarbeit mit MVC und Boot
Sonderedition Was Spring Security kann und was nicht
Bei Verwendung von Spring Security werden der Antwort standardmäßig die folgenden Header hinzugefügt.
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Strict-Transport-Security
wird nur für HTTPS hinzugefügt.Cache-Control
, Pragma
und Expires
sind alle so eingestellt, dass der Browser nicht zwischengespeichert werden kann.
Wenn Seiten zwischengespeichert werden, die ohne Anmeldung nicht angezeigt werden können, können böswillige Benutzer möglicherweise Informationen sehen, die geschützt werden sollen, indem sie den lokal verbleibenden Cache auch nach dem Abmelden anzeigen.
Daher ist festgelegt, dass das Caching auf diese Weise nicht zulässig ist.
X-Content-Type-Options: nosniff Einige Webbrowser versuchen, den Dateityp zu bestimmen, indem sie den Inhalt der Datei anstelle von "Inhaltstyp" betrachten. Dies scheint als Content Sniffing bezeichnet zu werden.
Wenn dies aktiviert ist, besteht die Gefahr, dass der Browser versehentlich den in der Datei enthaltenen Schadcode [^ 1] ausführt.
[^ 1]: Eine Bilddatei mit eingebettetem JavaScript-Code, die XSS erstellt
Wenn dieser Header (X-Content-Type-Options: nosniff
) in der Antwort gesetzt ist, ermittelt der Browser den Dateityp nicht automatisch (IE unterstützt 8 und höher).
Strict-Transport-Security Dieser Header wird standardmäßig nur für die HTTPS-Kommunikation festgelegt.
Angenommen, Sie greifen auf eine Site zu, indem Sie das Protokoll weglassen und nur den Hostnamen in das URL-Feld Ihres Browsers eingeben, z. B. "xxx.com / xxxx". Normalerweise wird das Protokoll unter dieser URL durch HTTP ergänzt und die Anforderung ausgeführt.
Einige Websites leiten Sie möglicherweise weiter, um zur HTTPS-Kommunikation zu wechseln, wenn eine HTTP-Anforderung eingeht.
Da die erste Kommunikation jedoch über HTTP erfolgt, wird Zwischenangriff Es besteht das Risiko,% E6% 94% BB% E6% 92% zu erhalten 83).
Mit dem Header "Strict-Transport-Security" erkennt der Browser, dass "der Host über HTTPS kommunizieren muss". Selbst wenn Sie das Protokoll weglassen und die URL eingeben, wird automatisch über HTTPS kommuniziert.
Da dieser Header jedoch ein Antwortheader ist, muss er mindestens einmal über HTTPS kommunizieren. Wenn Sie zum ersten Mal über HTTP zugreifen, ist die Kommunikation natürlich anfällig. (Es scheint, dass dies [TOFU (Trust On First Use)] genannt wird (https://en.wikipedia.org/wiki/Trust_on_first_use))
In diesem Header können Parameter für Namespaces und Java-Konfiguration angegeben werden:
namespace
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security"
...>
...
<sec:http>
...
<sec:headers>
<sec:hsts max-age-seconds="60"
include-subdomains="false" />
</sec:headers>
</sec:http>
...
</beans>
hsts
= HTTP Strict Transport Security
include-subdomains
sets includeSubDomains
.Java Configuration
python
package sample.spring.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import java.util.Collections;
@EnableWebSecurity
@ComponentScan
public class MySpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
...
.headers()
.httpStrictTransportSecurity()
.maxAgeInSeconds(60)
.includeSubDomains(false);
}
...
}
--Sie können mit ".headers (). HttpStrictTransportSecurity ()" "Strict-Transport-Security" einstellen.
X-Frame-Options Wenn Sie zulassen, dass Ihre Website mit
Obwohl es auf Englisch ist, ist Videokommentar auf Youtube aktiv (das Video, das in der Spring Security-Referenz vorgestellt wurde). In der ersten Hälfte wird "
Um dies zu verhindern, müssen Sie verhindern, dass Ihre Site mit "
Das von Spring Security festgelegte "DENY" lehnt standardmäßig das Einbetten mit "
Wenn Sie das Einbetten zulassen möchten, weil derselbe Ursprung (Kombination aus Schema, Host und Port) zuverlässig ist, stellen Sie Folgendes ein.
namespace
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security"
...>
...
<sec:http>
...
<sec:headers>
<sec:frame-options policy="SAMEORIGIN" />
</sec:headers>
</sec:http>
...
</beans>
--Set mit policy
des <frame-options>
-Tags.
Java Configuration
MySpringSecurityConfig.java
package sample.spring.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import java.util.Collections;
@EnableWebSecurity
@ComponentScan
public class MySpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
...
.headers()
.frameOptions().sameOrigin();
}
...
}
X-XSS-Protection Einige Webbrowser sind standardmäßig mit Funktionen zur Unterdrückung von reflektierendem XSS ausgestattet. Einige Browser tun jedoch nichts, um die Funktion zu aktivieren.
Wenn Sie "X-XSS-Protection" in den Antwortheader einfügen, können Sie die Funktion aktivieren, um das reflektierende XSS des Browsers zu unterdrücken.
Beachten Sie jedoch, dass diese Funktion XSS nicht vollständig verhindert, sondern nur den Angriff abschwächt (es ist nicht alles in Ordnung, wenn dies festgelegt ist).
Content-Security-Policy "Content-Security-Policy" ist ein Header, der XSS-Angriffe abschwächen und melden soll.
Zum Beispiel im Antwortheader
Content-Security-Policy: script-src 'self'
Auf diese Weise können Sie Versuche blockieren, JavaScript-Quellen von anderen Personen als Ihrem eigenen Ursprung zu laden. Der Punkt ist, dass es sich um eine Abwehrmaßnahme handelt, die einen Angreifer daran hindert, ein von einem Angreifer erstelltes unbeabsichtigtes Skript zu laden und auszuführen, indem es ermöglicht, Dateien usw. nur von einem zuverlässigen Ursprung im Voraus zu lesen.
Wie schreibe ich diesen Header selbst im Detail
Siehe diesen Bereich.
Wenn Sie es mit Spring Security verwenden, schreiben Sie wie folgt.
namespace
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security"
...>
<context:component-scan base-package="sample.spring.security" />
<sec:http>
...
<sec:headers>
<sec:content-security-policy policy-directives="script-src 'self'" />
</sec:headers>
</sec:http>
...
</beans>
Java Configuration
MySpringSecurityConfig.java
package sample.spring.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import java.util.Collections;
@EnableWebSecurity
@ComponentScan
public class MySpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
...
.headers()
.contentSecurityPolicy("script-src 'self'");
}
...
}
namespace
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security"
...>
<sec:http>
...
<sec:headers>
<sec:header name="Hoge" value="fuga" />
</sec:headers>
</sec:http>
...
</beans>
Java Configuration
MySpringSecurityConfig.java
package sample.spring.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.header.writers.StaticHeadersWriter;
import java.util.Collections;
@EnableWebSecurity
@ComponentScan
public class MySpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
...
.headers()
.addHeaderWriter(new StaticHeadersWriter("Hoge", "fuga"));
}
...
}
** Ausführungsergebnis **
Sie können das Schreiben von Headern programmgesteuert steuern, indem Sie eine Klasse erstellen, die die Schnittstelle "HeaderWriter" implementiert.
MyHeaderWriter.java
package sample.spring.security.header;
import org.springframework.security.web.header.HeaderWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHeaderWriter implements HeaderWriter {
@Override
public void writeHeaders(HttpServletRequest request, HttpServletResponse response) {
response.setHeader("My-Header", "My-Value");
}
}
namespace
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security"
...>
<sec:http>
...
<sec:headers>
<sec:header ref="myHeaderWriter" />
</sec:headers>
</sec:http>
<bean id="myHeaderWriter" class="sample.spring.security.header.MyHeaderWriter" />
...
</beans>
Java Configuration
python
package sample.spring.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import sample.spring.security.header.MyHeaderWriter;
import java.util.Collections;
@EnableWebSecurity
public class MySpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
...
.headers()
.addHeaderWriter(new MyHeaderWriter());
}
...
}
HeaderWriter
in addHeaderWriter ()
.** Ausführungsergebnis **
Recommended Posts