跨站请求伪造(CSRF)攻击原理及预防手段

目录

1、什么是跨站请求伪造?

2、基本原理:

举一个最简单的CSRF攻击例子:

3、CSRF攻击的对象和预防思路

4、预防手段介绍

5、Referer检查简单实现

注册拦截器


1、什么是跨站请求伪造?

CSRF(Cross-site Request Forgery,跨站请求伪造)攻击是一种常见的Web攻击,它利用用户在登录某个网站后的有效session来发送恶意请求。攻击者通过引导用户访问恶意网站,将用户的数据提交到目标网站,欺骗目标网站相信该请求是用户发送的。

CSRF攻击的关键是攻击者可以在不知情的情况下利用用户当前已登录的Web应用程序身份进行操作,而简单的身份验证只能证明请求是来自某个特定的用户,但无法证明请求是该用户自愿发出的,这是CSRF攻击能够成功的因素之一。

相比较XSS攻击而言,XSS攻击主要是通过向目标网站中注入恶意的脚本代码,利用用户对该网站的信任来获取用户数据。因此,它们之间的攻击方式确实有很大区别。

2、基本原理:

举一个最简单的CSRF攻击例子:

  1. 用户A登录某在线电商网站B,保留cookie。
  2. A在网站B上添加了一件价格为100元的商品到购物车,但是没有结账。
  3. 攻击者E诱导A访问危险网站C。
  4. 危险网站C上有一个表单,里面的“提交”按钮实际上是发起了向网站B的购物车结账请求,请求购买了一件价格为1000元的商品。
  5. 由于A的浏览器上有cookie,这样浏览器发出的结账请求就能得到响应执行。
  6. 这样A最终支付了1000元,而且她自己并不知情,这就是一个CSRF攻击的例子。

3、CSRF攻击的对象和预防思路

  • 简单来说,为了防范CSRF攻击,我们需要保护那些可以对数据进行增删改操作的服务,比如说银行转账、添加商品到购物车、发表评论等。而对于那些只涉及数据读取、展示的服务,则不需要进行CSRF的保护。
  • 在进行防范时,关键之处在于如何在请求中放入黑客所不能伪造的信息,以保证该请求来源的可靠性。常用的防范策略包括随机Token机制、Referer检查、限制HTTP方法等。这些策略旨在在请求中加入黑客难以制造的信息,让服务端能够验证请求的来源合法性并拒绝不合法的请求,从而有效防止CSRF攻击的发生。

4、预防手段介绍

  1. 随机化Token(CSRF Token):Token是用于验证网站请求者身份的一种机制,可以防止CSRF攻击。该Token会在每次访问页面时刷新,以确保每次请求都需要新的Token。例如,在web应用程序中,可以通过hidden field的方式将Token加入到表单中,提交时验
  2. Referer检查:在服务端校验请求头中的Referer字段,确保请求是来自合法的来源页面,常用于辅助Token机制的验证。
  3. Cookie SameSite 属性:应用于Cookie,防止跨站请求伪造攻击,避免恶意网站使用认证(sso)cookie 访问目标网站或者欺骗cookie 窃取用户数据。
  4. 限制cookies操作:不能在cookie中加入用户敏感信息,避免cookie的信息外泄。
  5. 明确HTTP方法:在服务端校验HTTP请求方法,确保请求的HTTP方法是明确的GET或POST,避免利用浏览器默认采用GET方法提交表单的漏洞情况的出现;

5、Referer检查简单实现

/**
 * CSRF - Referer 拦截器
 */
@Component
public class RefererInterceptor extends HandlerInterceptorAdapter {
    /**
     * 白名单 指定信任的地址
     */
    private String[] refererDomain = new String[]{"http://127.0.0.1:8080/","https://www.baidu.com/"};
    /**
     * 是否开启referer校验
     */
    private Boolean check =true;


    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        if (!check) {
            return true;
        }
        String referer = req.getHeader("referer");
        String host = req.getServerName();
        // 可以设置判断过滤get或post请求等
        //if (!"GET".equals(req.getMethod())) {
            if (referer == null) {
                // 状态置为404
                resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
                return false;
            }
            java.net.URL url = null;
            try {
                url = new java.net.URL(referer);
            } catch (MalformedURLException e) {
                // URL解析异常,也置为404
                resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
                return false;
            }
            // 首先判断请求域名和referer域名是否相同
            if (!host.equals(url.getHost())) {
                // 如果不等,判断是否在白名单中
                if (refererDomain != null) {
                    for (String s : refererDomain) {
                        if (s.equals(String.valueOf(url))) {
                            return true;
                        }
                    }
                }
                return false;
            }
        //}
        return true;
    }
}

注册拦截器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Autowired
    private RefererInterceptor refererInterceptor;
    /**
     * 注册过滤器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(refererInterceptor).addPathPatterns("/**").excludePathPatterns("/", "/login", "/logout");
    }
}

这里只是简单的实现了通过对比Referer字段,确保请求是来自合法的来源页面。

  • 25
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
表单CSRF攻击验证是为了防止CSRF攻击而采取的一种措施。在客户端向后端请求界面数据时,后端会往响应中的cookie中设置csrf_token的值,并在表单中添加一个隐藏的字段,值也是csrf_token。这样,当用户提交表单时,后端会验证表单中的csrf_token与cookie中的csrf_token是否匹配,如果不匹配,则认为可能存在CSRF攻击,并拒绝该请求。通过这种验证方式,可以有效地防止CSRF攻击。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Flask模拟实现CSRF攻击的方法](https://download.csdn.net/download/weixin_38557727/13768777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [2021-03-31](https://blog.csdn.net/m0_55876880/article/details/115344657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [html表单csrf攻击的解决方案](https://blog.csdn.net/sunchanglan151/article/details/125516455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值