首页 > 其他分享 >项目中如何对XSS统一处理

项目中如何对XSS统一处理

时间:2023-03-28 22:47:16浏览次数:47  
标签:XSS 自定义 Xss 处理 public JsonDeserializer class 统一

XSS攻击是什么?

XSS攻击是指攻击者利用网站中的漏洞,向页面中注入恶意脚本,从而获取用户的信息或者控制用户的计算机。
举一个通俗的例子,早期使用JSP页面渲染页面的项目,如果将用户名改成nick<alert>1</alert>,则当用户打开页面时,就会弹出一个警告框,而这个警告框可以被恶意脚本所替代,例如读取cookies或者其他敏感信息等操作。

如何在项目中防范XSS攻击呢

有一些项目使用Filter+注解的方式来过滤或者提示XSS攻击。
通过在参数中的字段上加上类似@Xss的注解,来表示这个字段是不允许输入XSS脚本的。
但是这种实现我觉得有几点不便之处。

  • 严格来说,其实普通系统内的绝大部分输入字段都不允许输入XSS文本。除非一些存储富文本的字段。因此需要在很多字段上去标注上@Xss注解。
  • Filter中的代码,需要重复去读Request类的数据,因此需要自己实现一个可重复读的RequestWrapper.

因此我使用了JsonDeserializer更简单的处理全局的防Xss处理。

完整全局XSS统一处理实现在开源项目中:https://github.com/valarchie/AgileBoot-Back-End

原理

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的全局统一处理的实现,如有不足欢迎大家评论指正。

全栈技术交流群:1398880

标签:XSS,自定义,Xss,处理,public,JsonDeserializer,class,统一
From: https://www.cnblogs.com/valarchie/p/17267053.html

相关文章

  • 实现公众号关注或取关后再处理我们自己的业务逻辑
    大家好,我是小悟在做微信小程序或公众号开发的有时候,难免会遇到需要在用户关注或取关公众号后处理业务逻辑的需求,只需要几步就可以搞定。1、配置首先我们需要在微信公众号后......
  • 跨域处理
    产生原因跨域产生的原因是由于前端地址与后台接口不是同源,从而导致ajax不能发送非同源产生的问题Cookie、LocalStorage和IndexDB无法获取DOM无法获得AJAX请求......
  • Python-异常处理
    Python中也有异常处理的方式:演示代码:try:user_weight=float(input("输入体重:"))user_height=float(input("输入身高:"))user_bmi=user_weight/......
  • 优雅的接口防刷处理方案
     前言本文为描述通过Interceptor以及Redis实现接口访问防刷Demo这里会通过逐步找问题,逐步去完善的形式展示原理通过ip地址+uri拼接用以作为访问者访问接口区......
  • OpenCV图像处理|1.1 OpenCV介绍与环境搭建
    1.1OpenCV介绍与环境搭建1.1.1介绍OpenCV(OpenSourceComputerVisionLibrary)开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV其......
  • Python 文件处理
    文件处理是任何Web应用程序的重要组成部分。Python有几个用于创建、读取、更新和删除文件的函数。文件处理在Python中使用文件的关键函数是 open() 函数。open......
  • 服务器处理能力估算(CPU、内存、存储)之二
    1  引题  但凡写过技术方案的都知道,在技术方案最终落实到工程实施部署时,必须编制出当前解决方案需要部署的IT设备及环境,包括:需要的网络环境、端口、带宽、组网......
  • jmeter处理验证码的几种方式
    1、验证码通过接口获取,接口返回为json,验证码为json中一个字段的值,该值为图片进行base64加密后的内容返回值的形式如下:{"code":200,"msg":"","data":"iVBORw0KGgoAA......
  • 缺失值处理基础语法
    1、Imputerfromsklearn.preprocessingimportImputerfromsklearn.model_selectionimporttrain_test_splitimportpandasaspdfileName='***/abc.xlsx'df=pd......
  • C#快捷编译并发布的批处理脚本
    发布批处理发布批处理::生成新的版本setyear=%date:~2,2%setmonth=%date:~5,2%setday=%date:~8,2%setVERSION=%year%%month%%day%setNEWVERSION=1.0.0.%VERS......