防止xss(腳本攻擊)的方法之過濾器


一  什么是腳本注入

概念我就不說了 直接百度一份

  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() {

    }

 

 

 這樣就可以了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM