一 什么是腳本注入
概念我就不說了 直接百度一份
XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。比如這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)。這種類型的漏洞由於被黑客用來編寫危害性更大的網絡釣魚(Phishing)攻擊而變得廣為人知。對於跨站腳本攻擊,黑客界共識是:跨站腳本攻擊是新型的“緩沖區溢出攻擊“,而JavaScript是新型的“ShellCode”。
簡單來說 用戶提交的數據中有js腳本 提交的數據再次顯示到頁面的時候會運行這個腳本。如
<script> window.location.href="xxxxxxxxx"; </script>
但是把html中的特殊符號 如 "<" 用 $lt; 表示那么html就會認為這是一個普通顯示的字符 。
二 解決腳本注入的方法
對輸入的字符做轉義,把特殊字符轉義 如 用 "$lt;" 表示 “<” 具體實現如下
繼承 HttpServletRequestWrapper 重寫其中的方法 在用到前端傳來的參數的地方做轉義
public class XssHttpServletRequestWraper extends HttpServletRequestWrapper { public XssHttpServletRequestWraper(HttpServletRequest request) { super(request); } @Override public String getHeader(String name) { String str = StringEscapeUtils.escapeHtml(super.getHeader(name)); return str; } @Override public String getQueryString() { String str = StringEscapeUtils.escapeHtml(super.getQueryString()); return str; } @Override public String getParameter(String name) { String str = StringEscapeUtils.escapeHtml(super.getParameter(name)); return str; } @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); if(values != null) { int length = values.length; String[] escapseValues = new String[length]; for(int i = 0; i < length; i++){ escapseValues[i] = StringEscapeUtils.escapeHtml(values[i]); } return escapseValues; } return super.getParameterValues(name); } }
注 :StringEscapeUtils.escapeHtml() 需要引入以下架包 具體使用請百度
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
寫過濾器 對所有請求進行過濾
@WebFilter(urlPatterns = "/*") public class XssFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { filterChain.doFilter(new XssHttpServletRequestWraper((HttpServletRequest) servletRequest),servletResponse); } @Override public void destroy() { }
這樣就可以了