共计 1658 个字符,预计需要花费 5 分钟才能阅读完成。
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 的全局对立解决的实现,如有有余欢送大家评论斧正。