CRSF跨站请求防御

本文详细介绍了CSRF攻击原理及防御措施,强调了服务端防御的重要性,包括验证HTTP Referer字段、添加token验证、自定义HTTP头属性验证等方法,并提供了Java代码示例,帮助开发者有效地防止CSRF攻击。
摘要由CSDN通过智能技术生成

一、CRSF跨站请求防御实践

前段时间网站被渗透扫面发现了全站CRSF漏洞,当时安全中心给出的处置建议是:

整改建议:

1、在敏感操作时添加二次认证措施(推荐)。

2、使用验证码手段。

但是实际整改起来,这个操作有一个很大的问题,整改实践长,而且特别容易漏掉地方。我就一直想找一个更加简便的方案去做这个整改。百度了很久,找到的方案都大同小异,感觉最靠谱的就是下头转载的这部分内容。(附在我的方案下面,有兴趣的筒子可以跳过第一部分直接往下翻)

网站采用的是JAVA语言编辑的,所以我这边用的是他们提供的方案1 。实际用的时候,发现它的语句有一点问题,就稍微调整了一下:

        // 从 HTTP 头中取得 Referer 值
        String referer = ((HttpServletRequest) request).getHeader("Referer");//getHeader("Referer");
        System.out.println("========================================header=" + referer);
        // 判断 Referer 是否以 bank.example 开头
        if ((referer == null) || (referer.trim().startsWith("http://localhost:8080/example/"))) {
            chain.doFilter(request, response);
        } else {
            request.getRequestDispatcher("error.jsp").forward(request, response);
        }

 最主要的就是,首次首次运行项目,打开welcom页面时,referer的值是null,如果按照原来的语句走的话,在我的项目里头项目就跑不起来了。 

这样调整完之后,运行起来没有问题了,但是特别奇怪的一点就是,项目的页面变形了,会将一个jsp的内容在同一页面上重复加载两次,页面报了好多错误。

后面查出来问题出在啥地方,主要是之前偷懒,将上面的语句直接补充在了一个原来写好的过滤器文件里头,实际上,如果新起一个文件写,就没有问题了。

下面附上完整的RefererFilter文件:

package com.ffff.example.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * referer过滤器,用于防御全站CSRF攻击
 *
 * @Author: zxl
 * @Date: Created in 14:29 2018/11/29
 */
public class RefererFilter implements Filter {


    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;


        // 从 HTTP 头中取得 Referer 值
        String referer = httpRequest.getHeader("Referer");//getHeader("Referer");
        System.out.println("========================================header=" + referer);
        // 判断 Referer 是否以 本网站地址 开头
        if ((referer == null) || (referer.trim().startsWith("http://localhost:8080/example/"))) {
            chain.doFilter(request, response);
        } else {
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值