防止CSRF filter拦截验证

参考: https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/


0 拦截每个页面并为其设置sessionToken cookie 

1 需要特殊拦截验证(涉及数据更新保存)哪些页面 在web.xml 配置 

2 在拦截器 拦截 ajax 提交的header 进行对比


web.xml 设置需要拦截验证的页面


<!-- xxxxxxFilter start -->

<filter>

<filter-name>xxxxxxFilter</filter-name>

<filter-class>xx.xxxxxx.xxxx.filters.xxxxFilter</filter-class>

<init-param>

<param-name>interceptList</param-name>

<param-value>/xxxxxxSave.htm,/xxxxxxxxSave.htm,/xxxxxSave.htm,/xxxxx.htm</param-value>

</init-param>

</filter>

<!-- xxxxxxFilter end -->


<!-- xxxxxxFilter URL start -->

<filter-mapping>

<filter-name>xxxxxxFilter</filter-name>

<url-pattern>*.htm</url-pattern>

</filter-mapping>

<!-- xxxxxxFilter URL --> 



package xx.xxxx.xxxx.filters;


import java.io.IOException;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.UUID;


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.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;


import org.apache.commons.lang.StringUtils;

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

import org.springframework.stereotype.Component;


@Component

public class XxxxxFilterextends HttpServlet implements Filter {


/**

* CSRF Filter

*/

private static final long serialVersionUID = 5497744146730186671L;

private static final Logger log = LogManager.getLogger(RequestFilter.class);


privatestatic final StringCSRF_TOKEN ="csrftoken";

List<String> interceptList =new ArrayList<String>();


@Override

public void doFilter(ServletRequest arg0, ServletResponsearg1, FilterChain chain)

throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) arg0;

HttpServletResponse response = (HttpServletResponse) arg1;

HttpSession session =request.getSession();

String uri =request.getRequestURI();


// GET SESSION CSRFTOKEN

String sToken = (String)session.getAttribute(CSRF_TOKEN);

if (isIntercept(uri)) {

//   获取 ajax 提交的 header 

String xhrToken =request.getHeader(CSRF_TOKEN);

if (sToken ==null || xhrToken ==null || !sToken.equals(xhrToken)) {

response.sendError(400);

log.info("Error Code 400 ");

return;

}

}


// CREATE NEW TOKEN INPUT SESSION

sToken = UUID.randomUUID().toString();

session.setAttribute(CSRF_TOKEN,sToken);

Cookie cookie =new Cookie(CSRF_TOKEN,sToken);

cookie.setMaxAge(-1);// BROWSER CLOSE COOKIE LOSE EFFICACY

response.addCookie(cookie);


chain.doFilter(request,response);


}


public void init(FilterConfig config) throws ServletException {


String strInterceptList =config.getInitParameter("interceptList");

if (strInterceptList !=null && strInterceptList.length() > 0) {

interceptList = Arrays.asList(strInterceptList.split(","));

} else {

interceptList =new ArrayList<String>();

}

}


private boolean isIntercept(String uri) {

return isContained(uri,interceptList);

}


private boolean isContained(String uri, List<String>listTmp) {

for (Stringtmp : listTmp) {

if (StringUtils.contains(uri,tmp)) {

returntrue;

}

}

returnfalse;

}

}



《写的不好 如果有好的方法请指点一二 谢谢 !!!》

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 Java 编写的 CSRF 过滤器的示例代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.UUID; public class CsrfFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,如果需要的话 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; if (httpRequest.getMethod().equalsIgnoreCase("POST")) { HttpSession session = httpRequest.getSession(false); String csrfToken = httpRequest.getParameter("csrfToken"); if (session == null || csrfToken == null || !csrfToken.equals(session.getAttribute("csrfToken"))) { httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid CSRF Token"); return; } } chain.doFilter(request, response); } @Override public void destroy() { // 销毁操作,如果需要的话 } } ``` 在上述示例中,`CsrfFilter` 是一个实现了 `javax.servlet.Filter` 接口的过滤器。它会拦截所有的请求,并在 POST 请求中验证 CSRF 令牌的有效性。 你可以在 `web.xml` 文件中配置该过滤器,例如: ```xml <filter> <filter-name>CsrfFilter</filter-name> <filter-class>com.example.CsrfFilter</filter-class> </filter> <filter-mapping> <filter-name>CsrfFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样,所有的请求都会通过 `CsrfFilter` 进行过滤,并在需要的时候进行 CSRF 令牌的验证。 请注意,这只是一个简单的示例,你可能需要根据你的应用程序和框架进行适当的调整。确保在生成 CSRF 令牌时使用安全的随机数生成算法,并在验证令牌时采取适当的安全措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值