【架构】:项目中如何对XSS统一处理

createh55个月前 (12-28)技术教程51

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


链接:https://juejin.cn/post/7215569601160708154

相关文章

10 个常问的 JS 面试题 js面试中经常问到的问题

作者:Joanne Lee-(Vivi)译者: 前端小智来源:medium1.如何理解 JS 中的`this`关键字?JS 初学者总是对 this 关键字感到困惑,因为与其他现代编程语言相比,JS 中...

Java代码审计-XSS审计 java 审计日志

一、漏洞简介XSS是Cross Site Scripting的缩写,意为"跨站脚本攻击",为了避免与层叠样式表(Cascading Style Sheet,CSS)的缩写混淆,故将跨站...

一张图让你彻底掌握Java中的异常层次结构

在Java中,可以选中或取消选中异常。它们都适合于类层次结构。下图显示了Java异常类的层次结构。红色为已检查的异常。必须在方法的throws子句中捕获或声明任何可能在方法中引发的检查异常。已检查的异...

Java内存泄漏的介绍 java内存泄漏怎么处理

Java的最大优势之一是其内存管理。您只需创建对象,Java Garbage Collector便会分配和释放内存。但是,情况并非如此简单,因为Java应用程序中经常发生内存泄漏。本教程说明什么是内存...

SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis

  今天项目不忙,想搞一下shardingJDBC分库分表看看,主要想实现以下几点:舍弃xml配置,使用.yml或者.properties文件+java的方式配置spring。使用 Druid 作为数...

JAVASCRIPT、PYTHON和JAVA位列语言排行榜前列

RedMonk 和 TIOBE 排名显示顶级语言的稳定性,JavaScript 和 Python 领先,而 C 面临挑战,像 Ballerina 这样的新语言显示出越来越大的吸引力。译自 JavaSc...