跨站点脚本编制 - SpringBoot配置XSS过滤器(基于mica-xss)

1. 简介

  XSS,即跨站脚本编制,英文为Cross Site Scripting。为了和CSS区分,命名为XSS。
  XSS是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。

2. XSS相关博客

  跨站点脚本编制 - SpringBoot配置XSS过滤器(基于Jsoup)

3. 其他安全相关博客

  SQL盲注、SQL注入 - SpringBoot配置SQL注入过滤器跨站点请求伪造 - SpringBoot配置CSRF过滤器

4. 基于mica-xss解决

  参考:https://gitee.com/596392912/mica

  • pom.xml添加依赖
<dependency>
	<groupId>net.dreamlu</groupId>
	<artifactId>mica-core</artifactId>
	<version>2.0.9-GA</version>
</dependency>
<dependency>
	<groupId>net.dreamlu</groupId>
	<artifactId>mica-xss</artifactId>
	<version>2.0.9-GA</version>
</dependency>

  添加依赖后,已经完成了XSS过滤配置。

5. 测试
  • 编写测试Controller
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户Controller
 * 
 * @author CL
 *
 */
@RestController
@RequestMapping(value = "user")
public class UserController {

	/**
	 * 获取用户信息
	 * 
	 * @param user 用户Entity
	 * @return
	 */
	@RequestMapping(value = "get")
	public String get(User user) {
		return user.toString();
	}

}

/**
 * 用户Entity
 * 
 * @author CL
 *
 */
class User {

	/**
	 * 用户ID
	 */
	private String id;

	/**
	 * 用户名称
	 */
	private String username;

	public User() {
		super();
	}

	public User(String id, String username) {
		super();
		this.id = id;
		this.username = username;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + "]";
	}

}
  • 跳过过滤
      在Controller上添加注解@XssCleanIgnore即可。
/**
 * 注册Controller
 * 
 * @author CL
 *
 */
@XssCleanIgnore
@RestController
@RequestMapping(value = "register")
public class RegisterController {

	/**
	 * 获取信息
	 * 
	 * @param username 用户名称
	 * @return
	 */
	@RequestMapping(value = "get")
	public String get(String username) {
		return username;
	}

}
  • Postman测试
6. mica-xss原理
  • 自定义WebDataBinder过滤Form表单
      WebDataBinder的作用是从request将请求中的parameters绑定到对应的JavaBean上,在Controller方法中的参数类型可以是基本类型,也可以是普通Java类型。SpringMVC提供了在绑定的过程中用户自定义编辑绑定的接口,因此可以在绑定过程中进行过滤。
/**
 * 表单 xss 处理
 *
 * @author L.cm
 */
@AutoIgnore
@ControllerAdvice
@RequiredArgsConstructor
public class FormXssClean {
	private final XssCleaner xssCleaner;

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		// 处理前端传来的表单字符串
		binder.registerCustomEditor(String.class, new StringPropertiesEditor(xssCleaner));
	}
	
	//......
}
  • 自定义JsonDeserializer(反序列化)过滤Json
      SpringBoot中默认是使用Jackson对Json数据进行序列化和反序列化,也可以自定义JsonSerializer和JsonDeserializer类自主实现。用户提交的Json报文会通过JsonDeserializer绑定到Java Bean中。因此可以在JsonDeserializer中进行过滤。
/**
 * jackson xss 处理
 *
 * @author L.cm
 */
@Slf4j
@RequiredArgsConstructor
public class JacksonXssClean extends JsonDeserializer<String> {
	private final XssCleaner xssCleaner;

	@Override
	public String deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
		// XSS filter
		String text = p.getValueAsString();
		if (text == null) {
			return null;
		} else if (XssHolder.isEnabled()) {
			String value = xssCleaner.clean(text);
			log.debug("Json property value:{} cleaned up by mica-xss, current value is:{}.", text, value);
			return value;
		} else {
			return text;
		}
	}

}
  • XssUtil
      mica-xss的XSS工具类其实也是基于Jsoup工具实现的。
/**
 * xss clean
 *
 * <p>
 * 参考自 jpress:https://gitee.com/fuhai/jpress
 * </p>
 *
 * @author L.cm
 * @author michael
 */
public class XssUtil {
	private static final HtmlWhitelist WHITE_LIST = new HtmlWhitelist();

	/**
	 * xss 清理
	 *
	 * @param html html
	 * @return 清理后的 html
	 */
	public static String clean(String html) {
		if (StringUtils.hasText(html)) {
			return Jsoup.clean(html, WHITE_LIST);
		}
		return html;
	}
	
	//......
}
7. mica.xss配置

  mica-xss提供的配置类如下:

/**
 * Xss配置类
 *
 * @author L.cm
 */
@Getter
@Setter
@ConfigurationProperties("mica.xss")
public class MicaXssProperties {

	/**
	 * 开启xss
	 */
	private boolean enabled = true;
	/**
	 * 拦截的路由,默认为空
	 */
	private List<String> pathPatterns = new ArrayList<>();
	/**
	 * 放行的规则,默认为空
	 */
	private List<String> excludePatterns = new ArrayList<>();

}

  可以看出,默认是开启XSS过滤的,我们可以通过application配置文件,来开启或关闭过滤,并指定相应的拦截路由(默认为全部:/**)和放行规则(默认为空)。如果默认的配置已经满足需求,则不需要再自定义配置mica.xss。

mica:
    xss:
        enabled: true
        excludePatterns:
            - /login
            - /logout
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Spring Boot应用程序中配置XSS过滤器并返回结果,可以按照以下步骤操作: 1. 创建一个名为XSSFilter的类并实现javax.servlet.Filter接口。 2. 在doFilter()方法中实现XSS过滤逻辑。 3. 在Spring Boot应用程序的配置类中注册该过滤器。 以下是一个示例XSSFilter类的代码: ``` import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class XSSFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // Do nothing because there is no initialization needed for this filter } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // Prevent XSS attacks XSSRequestWrapper wrappedRequest = new XSSRequestWrapper(httpRequest); chain.doFilter(wrappedRequest, httpResponse); } @Override public void destroy() { // Do nothing because there is no cleanup needed for this filter } } ``` 在上面的代码中,我们实现了XSSFilter类并覆盖了init(), doFilter()和destroy()方法。在doFilter()方法中,我们使用XSSRequestWrapper类对HttpServletRequest进行包装,以防止XSS攻击。接下来,我们需要在Spring Boot应用程序的配置类中注册该过滤器: ``` import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public FilterRegistrationBean<XSSFilter> xssFilterRegistrationBean() { FilterRegistrationBean<XSSFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new XSSFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; } } ``` 在上面的代码中,我们创建了一个名为AppConfig的配置类,并使用@Bean注解注册了一个名为xssFilterRegistrationBean的过滤器注册bean。我们通过调用addUrlPatterns()方法将该过滤器应用于Spring Boot应用程序中的所有URL。现在,当Spring Boot应用程序处理请求时,XSS过滤器将自动应用于所有传入请求,以防止XSS攻击,并且响应将返回过滤后的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值