首页 > 解决方案 > Spring 获取请求被拒绝,因为 URL 包含潜在的恶意字符串“;”

问题描述

我正在将 spring SAML 与 IDP 集成。从应用程序(SP)重定向到 IDP 登录屏幕时,IDP 正在附加 jsessionid 并在浏览器中获取以下异常。第一次从应用程序页面重定向到 IDP 登录页面时出现以下异常,但第二次如果我输入应用程序 url,它将成功重定向到 idp 登录页面。

没有得到什么问题,对于低于异常的其他 IDP,我没有得到,但是对于自定义编写的特定 IDP,我第一次得到异常。任何事情都需要从 SP 或 IDP 方面进行更改。

以下是从 SP 重定向到 IDP 登录页面时出现的异常。( Note: example.com is IDP domain) 在此处输入图像描述

标签: springsecurityspring-security

解决方案


Spring Security 的默认行为是拒绝 URL 中带有分号的请求,因为这是执行反射文件下载攻击的常用方法。JSESSIONID不应该在路径中,因为它可能导致泄漏,相反,您可以为此使用 cookie 。

StrictHttpFirewall的Spring Security 文档解释了这种行为。

确定 URL 中是否允许使用分号(即矩阵变量)。默认情况下禁用此行为,因为它是尝试执行反射文件下载攻击的常用方法。它也是许多绕过基于 URL 的安全性的漏洞的来源。

如果您希望允许使用分号,请重新考虑,因为它是一种非常常见的安全绕过来源。下面列出了用户需要分号和替代项的一些常见原因:

在路径中包含 JSESSIONID - 您不应在 URL 中包含会话 ID(或任何敏感信息),因为它可能导致泄漏。而是使用 Cookie。矩阵变量 - 想要利用矩阵变量的用户应该考虑使用 HTTP 参数。

请注意,您仍然可以通过使用自定义实例来禁用此行为,StrictHttpFirewall但请重新考虑,因为它是安全绕过的非常常见的来源。

@Bean
public HttpFirewall allowSemicolonHttpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowSemicolon(true);
    return firewall;
}

@Override
public void configure(WebSecurity web) throws Exception {
  super.configure(web);
  web.httpFirewall(allowSemicolonHttpFirewall());
}

推荐阅读