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