Histoire de base et systématique Histoire de certification / d'autorisation Histoire Remember-Me Histoire CSRF Histoire de gestion de session Histoire de la sécurité de la méthode Histoire CORS L'histoire de Run-As L'histoire d'ACL Test story Parlez de la coopération avec MVC et Boot
Édition supplémentaire Ce que Spring Security peut et ne peut pas faire
Lors de l'utilisation de Spring Security, les en-têtes suivants sont ajoutés par défaut à la réponse.
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
est ajouté uniquement pour HTTPS.Cache-Control
, Pragma
, ʻExpires` sont tous configurés pour empêcher le navigateur de se mettre en cache.
Si les pages qui ne peuvent pas être affichées sans se connecter sont mises en cache, les utilisateurs malveillants peuvent être en mesure de voir les informations à protéger en examinant le cache laissé localement même après la déconnexion.
Par conséquent, il est configuré pour ne pas autoriser la mise en cache de cette manière.
X-Content-Type-Options: nosniff Certains navigateurs Web essaient de déterminer le type de fichier en examinant le contenu du fichier au lieu de «Content-Type». Cela semble s'appeler Content Sniffing.
Lorsque cette option est activée, il existe un risque que le navigateur exécute accidentellement du code malveillant [^ 1] contenu dans le fichier.
[^ 1]: un fichier image avec du code JavaScript intégré qui établit XSS
Si cet en-tête (X-Content-Type-Options: nosniff
) est défini dans la réponse, le navigateur ne déterminera pas automatiquement le type de fichier (IE prend en charge 8 et plus).
Strict-Transport-Security Cet en-tête est défini par défaut uniquement pour la communication HTTPS.
Supposons que vous accédiez à un site en omettant le protocole et en entrant uniquement le nom d'hôte dans le champ URL de votre navigateur, tel que «xxx.com / xxxx». Normalement, le protocole à cette URL est complété par HTTP et la requête est exécutée.
Certains sites peuvent vous rediriger pour basculer vers la communication HTTPS lorsqu'une requête HTTP arrive.
Cependant, comme la première communication se fait par HTTP, [Attaque intermédiaire](http://www.weblio.jp/content/%E4%B8%AD%E9%96%93%E8%80%85] Il existe un risque de recevoir% E6% 94% BB% E6% 92% 83).
Avec l'en-tête Strict-Transport-Security
, le navigateur reconnaîtra que" l'hôte doit communiquer via HTTPS ".
Ensuite, même si vous omettez le protocole et entrez l'URL, il communiquera automatiquement via HTTPS.
Cependant, puisque cet en-tête est un en-tête de réponse, il doit communiquer sur HTTPS au moins une fois. Bien sûr, si vous accédez pour la première fois via HTTP, la communication est vulnérable. (Il semble que cela s'appelle TOFU (Trust On First Use))
Les paramètres peuvent être spécifiés dans cet en-tête, pour les espaces de noms et la configuration Java:
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>
--Ajoutez une balise <headers>
sous <http>
, et ajoutez une balise <hsts>
en dessous pour la contrôler.
--hsts
= HTTP Strict Transport Security
--max-age-seconds
est max-age
,
--ʻInclude-subdomains définit ʻincludeSubDomains
respectivement.
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);
}
...
}
Strict-Transport-Security
avec .headers (). HttpStrictTransportSecurity ()
.X-Frame-Options Si vous autorisez l'intégration de votre site Web avec `
Bien qu'il soit en anglais, Video commentary on Youtube est en place (la vidéo présentée dans la référence Spring Security). Dans la première moitié, «
Pour éviter cela, vous devez empêcher votre site d'être intégré avec `
Le DENY
défini par Spring Security rejette par défaut l'intégration avec <iframe>
de tous les sites.
Si vous souhaitez autoriser l'incorporation parce que la même origine (combinaison du port hôte du schéma) est fiable, définissez comme suit.
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>
policy
de la balise <frame-options>
.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-Frame-Options
avec frameOptions ()
.X-XSS-Protection Certains navigateurs Web sont livrés en standard avec des fonctionnalités permettant de supprimer le XSS réfléchissant. Cependant, certains navigateurs ne font rien pour activer la fonctionnalité.
Si vous mettez X-XSS-Protection
dans l'en-tête de la réponse, vous pouvez activer la fonction pour supprimer le XSS réfléchissant du navigateur.
Cependant, notez que cette fonctionnalité n'empêche pas complètement XSS, mais atténue seulement l'attaque (tout n'est pas OK si cela est défini).
Content-Security-Policy
Content-Security-Policy
est un en-tête destiné à atténuer et à signaler les attaques XSS.
Par exemple, dans l'en-tête de la réponse
Content-Security-Policy: script-src 'self'
Cela vous permettra de bloquer les tentatives de chargement de sources JavaScript de toute autre personne que votre propre origine. Le fait est qu'il s'agit d'une mesure défensive qui empêche un attaquant de charger et d'exécuter un script involontaire préparé par un attaquant en permettant de lire des fichiers, etc. uniquement à partir d'une origine fiable à l'avance.
Comment écrire cet en-tête lui-même en détail
Voir cette zone.
Lorsque vous l'utilisez avec Spring Security, écrivez comme suit.
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>
--Ajoutez la balise <content-security-policy>
et définissez-la avec l'attribut policy-directives
.
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'");
}
...
}
--Définissez avec la méthode contentSecurityPolicy ()
.
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"));
}
...
}
――Passez une instance de StaticHeadersWriter
à l'argument de ʻaddHeaderWriter (). --Dans le constructeur de
StaticHeadersWriter`, le premier argument est le nom de l'en-tête et le second argument est la valeur de l'en-tête.
** Résultat d'exécution **
Vous pouvez contrôler par programme l'écriture des en-têtes en créant une classe qui implémente l'interface HeaderWriter
.
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>
--Spécifiez le Bean de HeaderWriter
dans l'attribut ref
de la balise<header>
.
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());
}
...
}
--Définissez une instance de HeaderWriter
dans ʻaddHeaderWriter ()`.
** Résultat d'exécution **
Recommended Posts