XSS攻擊是什麼? XSS攻擊是指攻擊者利用網站中的漏洞,向頁面中註入惡意腳本,從而獲取用戶的信息或者控制用戶的電腦。 舉一個通俗的例子,早期使用JSP頁面渲染頁面的項目,如果將用戶名改成nick<alert>1</alert>,則當用戶打開頁面時,就會彈出一個警告框,而這個警告框可以被惡意腳本所 ...
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 = 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的全局統一處理的實現,如有不足歡迎大家評論指正。