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");