跨站点脚本编制 - 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应用程序的攻击,攻击者尝试注入恶意脚本代码到受信任的网站上执行恶意操作.在 ...
随机推荐
- python之对元组的初步了解
元组: 元组与列表类似但是又有不同,主要的不同就是元组属于不可变序列,一旦创建,任何方法都不可以修改元素. 元组使用小括号( )表示,这与列表不一样,列表是用方括号表示[ ]. a=('a','b') ...
- python-网络安全编程第三天(正则表达式)
python 正则表达式 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用 ...
- vue在移动端使用alloyfinger手势库操作图片拖拽、缩放
最近开发一个活动需要在手机上给上传的头像加上边框.装饰,需要拖拽.手势缩放边框下的头像图片,因为是vue项目,开始尝试了vue-drag-resize这个组件,对图片拖拽支持很完美,但是无法手势缩放, ...
- 面试官:小伙子,给我说一下mysql 乐观锁和悲观锁吧
悲观锁介绍 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实现,往往依靠数据库 ...
- 攻克弹唱第八课(吉他演奏的律动与funk音乐)
在本期文章中,笔者将为通过Guitar Pro 7吉他打谱软件与大家分享一下吉他律动与funk音乐的经验. 想必正在看这篇文章的进阶者和高手,都会考虑这样一个问题.我辛辛苦苦练习的大段solo和指弹曲 ...
- 使用FL Studio来制作停顿的效果
停顿效果是一种在音乐创作中非常常用的音效,它能起到缓冲的作用,而且能使这段旋律更具节奏感,在比较激情的歌曲中尤为常见.例如知名歌手王力宏演唱的<火力全开>中就使用了停顿效果,为歌曲加了不少 ...
- XML、XSL、XSLT、DTD、XSD的区别
前言: 在众神的努力之下,js已经可以跨出浏览器走向不同的领域了 也因为这个,对前端工程师的要求也不仅仅是会写写h5页面做交互.前端涉及的领域越来越广,对开发人员对素质能力要求越高. 以前因设备不同导 ...
- objetive-C中属性变量和成员变量
属性变量 @property和@synthesize可以自动生成某个类成员变量的存取方法. readwrite:这个属性是默认的情况,会自动生成存取器 assign:这个属性一般用来处理基础类型,比如 ...
- Eclipse改字体大小
Windows ->Perferences ->General ->Appearance ->Colors and Fonts ->Basic ->Text Fon ...
- LaTeX中的表格
表格插入代码及注释: 显示效果: 更多命令可以看相关文档,通过在命令行终端输入 texdoc booktab 等命令打开文档.