跨站点脚本编制 - 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
跨站点脚本编制 - SpringBoot配置XSS过滤器(基于mica-xss)的更多相关文章
- 跨站点脚本编制 - SpringBoot配置XSS过滤器(基于Jsoup)
1. 跨站点脚本编制 风险:可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务. 原因:未对用户输入正确执行危险字符清 ...
- 跨站点请求伪造 - SpringBoot配置CSRF过滤器
1. 跨站点请求伪造 风险:可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务. 原因:应用程序使用的认证方法不充分. ...
- 使用过滤器解决SQL注入和跨站点脚本编制
1 SQL注入.盲注 1.1 SQL注入.盲注概述 Web 应用程序通常在后端使用数据库,以与企业数据仓库交互.查询数据库事实上的标准语言是 SQL(各大数据库供应商都有自己的不同版本).Web 应用 ...
- 跨站点脚本编制-XSS 描述及解决方法
跨站点脚本编制可能是一个危险的安全性问题,在设计安全的基于 Web 的应用程序时应该考虑这一点.本文中,描述了这种问题的本质.它是如何起作用的,并概述了一些推荐的修正策略. 当今的大多数网站都对 We ...
- 跨站点脚本编制实例(AppScan扫描结果)
最近工作要求解决下web的项目的漏洞问题,扫描漏洞是用的AppScan工具,其中有很多是关于跨站点脚本编制问题的.下面就把这块东西分享出来. 原创文章,转载请注明 ------------------ ...
- js解决跨站点脚本编制问题
1.前台处理(容易绕过): <script type="text/javascript"> $(document).ready(function(){ var url= ...
- 【漏洞三】跨站点脚本(XSS)攻击
[漏洞] 跨站点脚本(XSS)攻击 [原因] 跨站点脚本(也称为xss)是一个漏洞,攻击者可以发送恶意代码(通常在(Javascript的形式)给另一个用户.因为浏览器无法知道脚本是否值得信任,所以它 ...
- ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- 跨站点脚本攻击XSS
来源:http://www.freebuf.com/articles/web/15188.html 跨站点脚本攻击是一种Web应用程序的攻击,攻击者尝试注入恶意脚本代码到受信任的网站上执行恶意操作.在 ...
随机推荐
- Linux系统学习07-Centos软件安装几种方法
配置好Centos一些基础设置后,接下来就是学习平时使用最多的软件安装. windwos下软件安装非常简单,就是下载好安装包,然后双击就会自动安装. 而Centos里面安装软件的方式方法有区别,熟悉几 ...
- RTP协议解析及H264/H265 音视频RTP打包分析
一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...
- JVM(一)-JVM入门
JVM的定义: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 ...
- 用MindManager做完思维导图后怎么加密
使用MindManager我们可以制作出很多简洁明了的思维导图,然而,不论是分享还是查看这些导图,我们往往需要对导图进行加密操作,尤其是制定公司或企业的下一步发展计划时,加密导图就显得很有必要了. M ...
- Boom 3D的本地音乐播放功能大放送
众所周知,Boom 3D是一款音效增强软件.但是Boom 3D不仅可以用来增强音效,还可以用作本地音乐播放器,以无与伦比的效果播放本地存储的歌曲,并创建播放列表来整理您的音乐收藏,就像个人音乐播放器应 ...
- Word文档数据被误删了怎么办,还能恢复吗
很多时候由于时间紧张或者是思路不想被打断,我们在编辑Word时不能及时的手动保存,一旦遇到电脑意外断电的情况可能就会导致编辑好的Word文档内容丢失.或者是文档编辑好了之后,Word提示是否保存时,误 ...
- SpringBoot整合Elasticsearch7
SpringBoot连接ElasticSearch有以下种方式, TransportClient,9300端口,在 7.x 中已经被弃用,据说在8.x 中将完全删除 restClient,9200端口 ...
- 自动化运维工具之Puppet常用资源(一)
前文我们聊到了puppet的架构,单机模型和master/agent模型的工作流程以及puppet的基础使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14 ...
- 浅尝 Elastic Stack (二) Logstash
一.安装与启动 Logstash 依赖 Java 8 或者 Java 11,需要先安装 JDK 1.1 下载 curl -L -O https://artifacts.elastic.co/downl ...
- Spring Boot 自带缓存及结合 Redis 使用
本文测试环境: Spring Boot 2.1.4.RELEASE + Redis 5.0.4 + CentOS 7 自带缓存 如果没有使用缓存中间件,Spring Boot 会使用默认的缓存,我们只 ...