Spring Boot:RequestRejectedException:请求被拒绝,因为URL包含潜在的恶意字符串“;”

时间:2018-09-29 07:56:03

标签: spring google-chrome spring-boot spring-security

发布Spring Boot应用程序的登录凭据时,出现以下异常。

  

org.springframework.security.web.firewall.RequestRejectedException:请求被拒绝,因为URL包含潜在的恶意字符串“;”

它正在发布到/dologin,然后重定向到/home,并在末尾附加jsessionid。它还会设置会话cookie。我没有更改任何会话设置,在session中没有提及application.properties

我尝试设置

server.servlet.session.cookie.http-only=true
server.servlet.session.tracking-modes=cookie

https://stackoverflow.com/a/31792535/148844中所述,但这没有用。

我添加了

@Bean
public ServletContextInitializer servletContextInitializer() {
    return new ServletContextInitializer() {
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
           servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
           SessionCookieConfig sessionCookieConfig=servletContext.getSessionCookieConfig();
           sessionCookieConfig.setHttpOnly(true);
        }
    };
}

但是现在它只是POST,设置cookie,然后重定向回登录屏幕。好像无法访问该会话。

我设置了server.session.tracking-modes=cookie(而不是server.servlet...),它现在仅使用cookie,但是Chrome浏览器在登录后不会将cookie发送回服务器!如果会话中的/home属性为null,则user操作将仅重新显示登录页面。

POST /dologin HTTP/1.1
Host: localhost:8080
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Referer: http://localhost:8080/home

HTTP/1.1 302
Set-Cookie: JSESSIONID=3B82AAA40CE94FF490FBF7B4DBD837DD; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Location: http://localhost:8080/home

GET /home HTTP/1.1
Host: localhost:8080
Upgrade-Insecure-Requests: 1
Referer: http://localhost:8080/home

HTTP/1.1 200
Set-Cookie: JSESSIONID=B60BF649068F7E85346691FD2F5D119B; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Language: en-US
Content-Length: 2742
Date: Sat, 29 Sep 2018 17:41:55 GMT

注意cookie是否不同,Chrome是否没有将cookie发送回服务器?为什么?

Spring Boot 1.5.13,Chrome版本69.0.3497.100(官方内部版本)(64位)

1 个答案:

答案 0 :(得分:2)

可以将server.servlet.session.cookie.http-only=true更改为server.session.tracking-modes=cookie并将http://localhost:8080更改为http://127.0.0.1:8080/可以。我找到了这个答案:

Chrome localhost cookie not being set

Chrome似乎一直在从允许localhost到禁止localhost的转变。它工作大约一个月或三个月前。 localhost正在使用Rails应用,而Chrome正在发送cookie。

实际上,Chrome还将_mt_rails_session的{​​{1}} Rails cookie发送到Spring Boot应用,但从未发送过localhost cookie。

我怀疑但尚未确认,这可能是由于在不相关的3rd Spring Boot应用程序的端口8080上设置了HTTPS造成的,并且Chrome内部有可能缓存了一些HSTS设置。这可能是Chrome中的错误。