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>
Spring MVC架構內還有蠻多方法可以實現此種功能,具體可見:http://www.tuicool.com/articles/BzqUja
三、HttpOnly
如果在cookie中設置了HttpOnly屬性,那么通過javaScript腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊,但是注意,只是不能讀取,但是可以覆蓋,攻擊者如果發現網站的XSS漏洞,就可以利用HttpOnly cookie發動session fixation攻擊。\\
response.setHeader("Set-Cookie", "cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");