CSRF漏洞修复
问题说明:
在原系统框架中,未采用有效的手段防止CSRF漏洞,故而会存在安全问题。
漏洞的危害为:
该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性
解决方案:
1、添加referer验证组件
增加referer验证组件,组件当中会对请求源中的referer地址进行验证合法性,若为非法源地址,或源地址与实际请求地址不符则会直接返回错误页面。
2、添加过滤器
在web.xml文件中添加
FrameFilter
com.sinosig.rsa.referer.FrameTao
FrameFilter
/*
java类如下:
package com.sinosig.rsa.referer;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RefererFilter extends HttpServlet implements Filter {
private static final long serialVersionUID = 1L;
private FilterConfig filterConfig;
public void init(FilterConfig config) {
this.filterConfig = config;
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 链接来源地址
String referer = request.getHeader("referer");
if (referer == null || !referer.contains(request.getServerName())) {
/**
* 如果 链接地址来自其他网站,则返回错误页面
*/
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
} else {
chain.doFilter(request, response);
}
}
public void destroy() {
this.filterConfig = null;
}
}
而其中对于一些老框架想要不过滤某些请求的话,只需要在类中修改一些即可实现,本次针对struts2来做的排除。
将图中test.do 替换成跳转的action.do即可。