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的大局一致处理的完成,如有不足欢迎我们谈论指正。

全栈技术交流群:1398880