关于fastapi:项目中如何对XSS统一处理
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();}@Overridepublic String deserialize(JsonParser p, DeserializationContext context) throws IOException { String value = p.getValueAsString(); if( value != null) { // 去除掉html标签 如果想要本义的话 可应用 HtmlUtil.escape() return HtmlUtil.cleanHtmlTag(value); } return null;}@Overridepublic Class<String> handledType() { return String.class;}}复制代码配置自定义Xss过滤序列化器@Configurationpublic class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer{ @Overridepublic void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { // 防XSS脚本注入 jacksonObjectMapperBuilder.deserializers(new JsonHtmlXssTrimSerializer());}}复制代码如何反对富文本某一些字段可能是须要反对富文本的,比方公告栏里的内容之类的。此时咱们能够给特定的字段标注规范的JsonDeserializer来笼罩咱们自定义的序列化器。 以下是例子。/** @author valarchie */@Datapublic class NoticeAddCommand { /** * 想要反对富文本的话, 防止Xss过滤的话, 请加上@JsonDeserialize(using = StringDeserializer.class) 注解 */@NotBlank@JsonDeserialize(using = StringDeserializer.class)protected String noticeContent;protected String status;}复制代码这是笔者对于Xss的全局对立解决的实现,如有有余欢送大家评论斧正。 ...