spring - provided - postman invalid csrf token null was found on the request parameter
Token CSRF no válido ''null'' se encontró en el parámetro de solicitud ''_csrf'' o en el encabezado ''X-CSRF-TOKEN'' (12)
Después de configurar Spring Security 3.2, _csrf.token
no está vinculado a una solicitud o un objeto de sesión.
Esta es la configuración de seguridad de primavera:
<http pattern="/login.jsp" security="none"/>
<http>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/index.jsp"/>
<logout/>
<csrf />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_USER/>
</user-service>
</authentication-provider>
</authentication-manager>
El archivo login.jsp
<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<button id="ingresarButton"
name="submit"
type="submit"
class="right"
style="margin-right: 10px;">Ingresar</button>
<span>
<label for="usuario">Usuario :</label>
<input type="text" name="j_username" id="u" class="" value=''''/>
</span>
<span>
<label for="clave">Contraseña :</label>
<input type="password"
name="j_password"
id="p"
class=""
onfocus="vc_psfocus = 1;"
value="">
</span>
</form>
Y representa el siguiente html:
<input type="hidden" name="" value="" />
El resultado es 403 estado de HTTP:
Invalid CSRF Token ''null'' was found on the request parameter ''_csrf'' or header ''X-CSRF-TOKEN''.
ACTUALIZACIÓN Después de una depuración, el objeto de solicitud obtiene una buena versión de DelegatingFilterProxy, pero en la línea 469 de CoyoteAdapter ejecuta request.recycle (); que borra todos los atributos ...
Pruebo en Tomcat 6.0.36, 7.0.50 con JDK 1.7.
No he entendido este comportamiento, en lugar de, sería posible que alguien me señale una guerra de ejemplo de aplicación con Spring Security 3.2 que funciona con CSRF.
¿No deberías agregar al formulario de inicio de sesión?
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
Como se indica en el here en la documentación de seguridad de primavera
Con thymeleaf puede agregar:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
Creo que csrf solo funciona con formas de primavera
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
cambiar a form:form
etiqueta de form:form
y ver que funciona.
Documentación de Spring para desactivar csrf: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure
@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
En su controlador agregue lo siguiente:
@RequestParam(value = "_csrf", required = false) String csrf
Y en la página jsp agregar
<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
He usado el contenedor de versión Spring 4.2.3 para la seguridad de primavera, pero obtuve el mismo error. Luego bajé a 3.1.4 y esto funciona perfectamente.
Aquí están mis dependencias de pom.xml:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.5.4-Final</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.1.Final</version>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
Intenta cambiar esto: <csrf />
a esto: <csrf disabled="true"/>
. Debería deshabilitar csfr.
Ninguna de las soluciones funcionó de mí. El único que funcionó para mí en primavera es:
action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"
REEMPLAZADO CON:
action = "./ upload? _csrf = $ {_ csrf.token}"
(Spring 5 con csrf habilitado en la configuración java)
Parece que la protección CSRF (Cross Site Request Forgery) en su aplicación Spring está habilitada. En realidad, está habilitado por defecto.
De acuerdo con spring.io :
¿Cuándo debería usar la protección CSRF? Nuestra recomendación es usar protección CSRF para cualquier solicitud que pueda ser procesada por un navegador por usuarios normales. Si solo está creando un servicio que es utilizado por clientes que no pertenecen al navegador, es probable que desee desactivar la protección CSRF.
Entonces para deshabilitarlo:
@Configuration
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
Sin embargo, si desea mantener habilitada la protección CSRF, debe incluir en su formulario el csrftoken
. Puedes hacerlo así:
<form .... >
....other fields here....
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
Incluso puede incluir el token CSRF en la acción del formulario:
<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">
Por favor, consulte mi aplicación de muestra de trabajo en Github y compárela con su configuración.
Yo solia tener el mismo problema.
Su configuración usa security = "none", por lo que no puede generar _csrf:
<http pattern="/login.jsp" security="none"/>
puede establecer access = "IS_AUTHENTICATED_ANONYMOUSLY" para la página /login.jsp replace above config:
<http>
<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/index.jsp"/>
<logout/>
<csrf />
</http>
si aplica security = "none", no se generará ningún token csrf. la página no pasará a través del filtro de seguridad. Utilice el rol ANÓNIMO.
No he entrado en detalles, pero está funcionando para mí.
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.jsp" access="hasRole(''ANONYMOUS'')" />
<!-- you configuration -->
</http>