XSS攻擊是什么?
XSS攻擊是指攻擊者利用網站中的漏洞,向頁面中注入惡意腳本,從而獲取用戶的資訊或者控制用戶的計算機,
舉一個通俗的例子,早期使用JSP頁面渲染頁面的專案,如果將用戶名改成nick<alert>1</alert>,則當用戶打開頁面時,就會彈出一個警告框,而這個警告框可以被惡意腳本所替代,例如讀取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過濾序列化器
/**
* 直接將html標簽去掉
* @author valarchie
*/
public class JsonHtmlXssTrimSerializer extends JsonDeserializer<String> {
public JsonHtmlXssTrimSerializer() {
super();
}
@Override
public String deserialize(JsonParser p, DeserializationContext context) throws IOException {
String value = https://www.cnblogs.com/valarchie/archive/2023/03/28/p.getValueAsString();
if( value != null) {
// 去除掉html標簽 如果想要轉義的話 可使用 HtmlUtil.escape()
return HtmlUtil.cleanHtmlTag(value);
}
return null;
}
@Override
public Class 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/548493.html
標籤:其他
上一篇:專案中如何對XSS統一處理
下一篇:UML 類圖
