天天看點

【架構】:項目中如何對XSS統一處理

作者:Java小熊
【架構】:項目中如何對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();
    }
    @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

繼續閱讀