csrf防御

2550 ワード

httpでorigginの意味:ドメインをまたぐリソース共有ポリシー(cors)では、ブラウザがドメインをまたぐ要求を出すと、自動的にヘッダにオリジンヘッドを装着します。
保護csrfの方法:1.要求側の判断により、現在のページと同じソースでrefererフィールドを確認し、存在しない場合はその要求を拒否する。注意してください。検査の時は避けられやすいです。サイトがsite.comなら、refererの中でsite.com.atacker.comが許可されないようにしてください。
 //   HTTP      Referer  
 String referer=request.getHeader("Referer"); 
 //    Referer     bank.example   
 if((referer!=null) &&(referer.trim().startsWith(“bank.example”))){ 
    chain.doFilter(request, response); 
 }else{ 
    request.getRequestDispatcher(“error.jsp”).forward(request,response); 
 }
2.csrf tokenユーザがウェブページを要求すると、ウェブアプリケーションは現在のsessionに関するtokenを生成し、この値はサーバのsessionに存在し、tokenをクライアントに送信する。クライアントが「パスワードの変更」の要求を送信すると、フォームの中で隠しフィールドでtokenを送信し、サーバはsessionに記憶されているtokenとクライアントから送信されたtokenが同じかどうかを検証し、同じでないかまたはtokenがない場合はその要求を破棄する。
filterでの検証要求中のtoken
 HttpServletRequest req = (HttpServletRequest)request; 
 HttpSession s = req.getSession(); 

 //   session     csrftoken   
 String sToken = (String)s.getAttribute(“csrftoken”); 
 if(sToken == null){ 

    //      token    session  
    sToken = generateToken(); 
    s.setAttribute(“csrftoken”,sToken); 
    chain.doFilter(request, response); 
 } else{ 

    //   HTTP      csrftoken 
    String xhrToken = req.getHeader(“csrftoken”); 

    //          csrftoken 
    String pToken = req.getParameter(“csrftoken”); 
    if(sToken != null && xhrToken != null && sToken.equals(xhrToken)){ 
        chain.doFilter(request, response); 
    }else if(sToken != null && pToken != null && sToken.equals(pToken)){ 
        chain.doFilter(request, response); 
    }else{ 
        request.getRequestDispatcher(“error.jsp”).forward(request,response); 
    } 
 }

クライアントでtokenへの参加を要求する
function appendToken(){ 
    updateForms(); 
    updateTags(); 
 } 

 function updateForms() { 
    //          form   
    var forms = document.getElementsByTagName('form'); 
    for(i=0; i