找回密码
 立即注册
首页 业界区 业界 项目中如何对XSS统一处理

项目中如何对XSS统一处理

扈季雅 2025-6-6 09:39:42
XSS攻击是什么?

XSS攻击是指攻击者利用网站中的漏洞,向页面中注入恶意脚本,从而获取用户的信息或者控制用户的计算机。
举一个通俗的例子,早期使用JSP页面渲染页面的项目,如果将用户名改成nick1,则当用户打开页面时,就会弹出一个警告框,而这个警告框可以被恶意脚本所替代,例如读取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过滤序列化器
  1. /**
  2. * 直接将html标签去掉
  3. * @author valarchie
  4. */
  5. public class JsonHtmlXssTrimSerializer extends JsonDeserializer<String> {
  6.     public JsonHtmlXssTrimSerializer() {
  7.         super();
  8.     }
  9.     @Override
  10.     public String deserialize(JsonParser p, DeserializationContext context) throws IOException {
  11.         String value = p.getValueAsString();
  12.         if( value != null) {
  13.             // 去除掉html标签    如果想要转义的话  可使用 HtmlUtil.escape()
  14.             return HtmlUtil.cleanHtmlTag(value);
  15.         }
  16.         return null;
  17.     }
  18.     @Override
  19.     public Class<String> handledType() {
  20.         return String.class;
  21.     }
  22. }
复制代码
配置自定义Xss过滤序列化器
  1. @Configuration
  2. public class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer{
  3.     @Override
  4.     public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
  5.         // 防XSS脚本注入
  6.         jacksonObjectMapperBuilder.deserializers(new JsonHtmlXssTrimSerializer());
  7.     }
  8. }
复制代码
如何支持富文本

某一些字段可能是需要支持富文本的,比如公告栏里的内容之类的。此时我们可以给特定的字段标注标准的JsonDeserializer来覆盖我们自定义的序列化器。  以下是例子。
  1. /**
  2. * @author valarchie
  3. */
  4. @Data
  5. public class NoticeAddCommand {
  6.     /**
  7.      * 想要支持富文本的话, 避免Xss过滤的话, 请加上@JsonDeserialize(using = StringDeserializer.class) 注解
  8.      */
  9.     @NotBlank
  10.     @JsonDeserialize(using = StringDeserializer.class)
  11.     protected String noticeContent;
  12.     protected String status;
  13. }
复制代码
这是笔者关于Xss的全局统一处理的实现,如有不足欢迎大家评论指正。
全栈技术交流群:1398880


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册