项目中如何对XSS统一处理
项目 如何 处理 统一 XSS
2023-06-13 09:18:22 时间
XSS攻击是什么?
XSS攻击是指攻击者利用网站中的漏洞,向页面中注入恶意脚本,从而获取用户的信息或者控制用户的计算机。
举一个通俗的例子,早期使用JSP页面渲染页面的项目,如果将用户名改成nick<alert>1</alert>
,则当用户打开页面时,就会弹出一个警告框,而这个警告框可以被恶意脚本所替代,例如读取cookies或者其他敏感信息等操作。
如何在项目中防范XSS攻击呢
有一些项目使用Filter+注解的方式来过滤或者提示XSS攻击。 通过在参数中的字段上加上类似@Xss的注解,来表示这个字段是不允许输入XSS脚本的。 但是这种实现我觉得有几点不便之处。
- 严格来说,其实普通系统内的绝大部分输入字段都不允许输入XSS文本。除非一些存储富文本的字段。因此需要在很多字段上去标注上@Xss注解。
- Filter中的代码,需要重复去读Request类的数据,因此需要自己实现一个可重复读的RequestWrapper.
因此我使用了JsonDeserializer
更简单的处理全局的防Xss处理。
完整全局XSS统一处理实现在开源项目中:github.com/valarchie/A…
原理
Jackson框架允许自定义JsonDeserializer
,因此可以在自定义的JsonDeserializer
中剔除恶意XSS脚本注入。
自定义Xss过滤序列化器
/**
* 直接将html标签去掉
* @author valarchie
*/
public class JsonHtmlXssTrimSerializer extends JsonDeserializer<String> {
public JsonHtmlXssTrimSerializer() {
super();
}
@Override
public String deserialize(JsonParser p, DeserializationContext context) throws IOException {
String value = p.getValueAsString();
if( value != null) {
// 去除掉html标签 如果想要转义的话 可使用 HtmlUtil.escape()
return HtmlUtil.cleanHtmlTag(value);
}
return null;
}
@Override
public Class<String> handledType() {
return String.class;
}
}
复制代码
配置自定义Xss过滤序列化器
@Configuration
public class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer{
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
// 防XSS脚本注入
jacksonObjectMapperBuilder.deserializers(new JsonHtmlXssTrimSerializer());
}
}
复制代码
如何支持富文本
某一些字段可能是需要支持富文本的,比如公告栏里的内容之类的。此时我们可以给特定的字段标注标准的JsonDeserializer
来覆盖我们自定义的序列化器。 以下是例子。
/**
* @author valarchie
*/
@Data
public class NoticeAddCommand {
/**
* 想要支持富文本的话, 避免Xss过滤的话, 请加上@JsonDeserialize(using = StringDeserializer.class) 注解
*/
@NotBlank
@JsonDeserialize(using = StringDeserializer.class)
protected String noticeContent;
protected String status;
}
复制代码
这是笔者关于Xss的全局统一处理的实现,如有不足欢迎大家评论指正。
相关文章
- 如何创建springboot项目[通俗易懂]
- 如何评估客户之声(VOC)项目的有效性?
- idea如何运行Java Web项目(Servlet、JSP)
- 实时即未来,车联网项目之远程诊断实时故障分析【七】
- Vue3.0商店后台管理系统项目实战-vuex是什么(5大语法)
- 2022-07-25:xiu是用rust语言编写的流媒体服务器软件项目。k8s安装xiu,drone文件如何写?
- IDEA 如何快速创建 Springboot 项目[通俗易懂]
- 聊聊springboot项目如何优雅的修改或者填充请求参数
- 如何在SpringBoot项目中,实现记录用户登录的IP地址及归属地信息?
- 利用wbs如何计算项目工期 ?
- 需求变更当作一个项目来看待,如何处理 ?
- 聊聊如何解决官方提供的onpremise项目安装sentry速度过慢问题
- 记录一次 laravel 项目队列拥堵的问题
- 从0开始学管理系列(三) —— 如何打造一个高效的项目团队?
- 第04步《前端篇》第1章创建第一个小游戏项目第1课
- 牛逼!Github上最有价值的一个开源项目!
- flask web项目部署
- Nuxt项目整合Element UI
- 干货|六西格玛项目辅导的流程有哪些?
- 近百个大数据开源项目,你该如何选型?|《开源大数据热力报告2022》入围项目公示
- 4个令人惊艳的ChatGPT项目,开源了!AIGC也太猛了...
- Eclipse中新建项目后jsp页面报错,如何处理详解程序员
- 开源开创:Linux服务器的新机遇(linux服务器开源项目)
- 学习Redis项目源码剖析:从学习到运用(redis项目源码)
- 开源项目是如何被搞砸的?
- 如何选择一个适合自己的开源项目来阅读
- 针对Python开发人员的10个“疯狂”的项目构想
- 「如何在项目中使用Redis优化性能」(redis怎么用在项目上)
- 运算效率最高提升20倍!30多个项目落地!英特尔AI百佳创新激励计划持续加速AI生态突破发展
- 英搏尔:北方基地项目一期投产,可年产 20 万套新能源汽车零部件
- 实现Redis集群架构开启更大可能性(redis集群的项目描述)
- Redis如何帮助完美搭配项目(redis跟项目怎么配置)
- 想知道 GitHub 上各开源项目的生存状况如何?这个软件告诉你!