1. 程式人生 > >XSS安全漏洞的幾種修復方式

XSS安全漏洞的幾種修復方式

什麼是XSS

跨站指令碼攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS,跨站指令碼攻擊指的是惡意攻擊者往Web頁面裡插入惡意的html,javaScript程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html,javaScript程式碼會被執行,從而達到惡意的特殊目的,如,盜取使用者Cookie、破壞頁面結構、重定向到其它網站等。不過,因為是一種被動的攻擊手法,沒有相應的軟體來完成自動化攻擊,對website有http-only、crossdomian.xml(接下來會介紹這兩種方法)沒有用,有一定機率不成功,而且還耗時間,所以xss現在是一門熱門但不太受重視的Web攻擊手法。

XSS攻擊解決辦法

一、SpringMVC架構下@InitBinder方法
Controller方法的引數型別可以是基本型別,也可以是封裝後的普通Java型別。若這個普通Java型別沒有宣告任何註解,則意味著它的每一個屬性都需要到Request中去查詢對應的請求引數,服務端通過Request的getParameter方法取到的引數都是字串形式,WebDataBinder的作用就是把字串形式的引數轉換成服務端真正需要的型別。
每次請求到來後的引數解析都會利用WebDataBinderFactory建立一個binder物件,然後從這個binder中取得最終解析好的引數物件。WebDataBinderFactory是在InvocableHandlerMethod中定義的,即不同的Controller方法有著不同的WebDataBinderFactory。
@InitBinder用於在@Controller中標註於方法,表示為當前控制器註冊一個屬性編輯器或者其他,只對當前的Controller有效,所以要用@InitBinder實現過濾輸入,轉義輸出,就必須在每個需要的Controller中使用@InitBinder,我的方法就是建立一個BaseController,每個需要實現此業務的都去繼承它。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

@Controller
public class BaseController {
    @InitBinder
    public void webInitBinder(WebDataBinder binder){
        binder.registerCustomEditor(String.class, new
StringEditor()); } } public class StringEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isBlank(text)) { return; } try { //Spring自帶html標籤轉義與反轉義 super.setValue(HtmlUtils.htmlEscape(text)); } catch (Exception e) { throw new IllegalArgumentException(e); } } }

二、WebBindingInitializer
WebBindingInitializer:實現WebBindingInitializer,重寫initBinder註冊的屬性編輯器是全域性的屬性編輯器,對所有的Controller都有效

public class WebBinderInitializerUtils implements WebBindingInitializer{

    @Override
    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(String.class,new StringEditor());
    }
}

public class StringEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.isBlank(text)) {
            return;
        }

        try {
            //Spring自帶html標籤轉義與反轉義
            super.setValue(HtmlUtils.htmlEscape(text));
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
}

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="cacheSeconds" value="0"/>
        <property name="webBindingInitializer">
            <bean class="cn.gov.wu.biz.utils.WebBinderInitializerUtils"/>
        </property>
    </bean>

注:低於3.2版本的Spring請使用AnnotationMethodHandlerAdapter,我的Spring版本為4.2.1.RELEASE,所以配置項中使用RequestMappingHandlerAdapter,因為AnnotationMethodHandlerAdapter已經廢棄掉了

這裡寫圖片描述

三、HttpOnly
如果在cookie中設定了HttpOnly屬性,那麼通過javaScript指令碼將無法讀取到cookie資訊,這樣能有效的防止XSS攻擊,但是注意,只是不能讀取,但是可以覆蓋,攻擊者如果發現網站的XSS漏洞,就可以利用HttpOnly cookie發動session fixation攻擊。

response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");