csrf防御
2550 ワード
httpでorigginの意味:ドメインをまたぐリソース共有ポリシー(cors)では、ブラウザがドメインをまたぐ要求を出すと、自動的にヘッダにオリジンヘッドを装着します。
保護csrfの方法:1.要求側の判断により、現在のページと同じソースでrefererフィールドを確認し、存在しない場合はその要求を拒否する。注意してください。検査の時は避けられやすいです。サイトがsite.comなら、refererの中でsite.com.atacker.comが許可されないようにしてください。
filterでの検証要求中のtoken
保護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