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

2023-10-28

目录

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字段,确保请求是来自合法的来源页面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨站请求伪造(CSRF)攻击原理及预防手段 的相关文章

  • CORS 中的 POST/GET 与 PUT/DELETE

    我刚刚读过this https www w3 org Security wiki Same Origin Policy 同源策略允许使用 GET 和 POST 的跨源 HTTP 请求 方法 但拒绝源间 PUT 和 DELETE 请求 PUT
  • 如何在Reactjs中生成CSRF令牌并发送到Play框架?

    我试图从反应表单发送发布请求到播放框架 它抛出以下错误 Caused by java lang RuntimeException No CSRF token was generated for this request Is the CSR
  • Symfony 2 - 删除表单和 CSRF 令牌

    我有一个来自数据库的条目列表 我希望在每一行的末尾都有一个 删除按钮 这样用户就不必先转到编辑 显示页面来删除条目 我尝试使用 csrf 令牌创建一个隐藏的输入字段 如下所示 return this gt createFormBuilder
  • MVC 2 AntiForgeryToken - 为什么对称加密 + IPrinciple?

    我们最近将解决方案更新为 MVC 2 这更新了AntiForgeryToken作品 不幸的是 这不再适合我们的 AJAX 框架 问题是 MVC 2 现在使用对称加密来编码有关用户的一些属性 包括用户的Name财产 来自IPrincipal
  • 如何使用 Struts 预防 XSS 漏洞

    我们需要在 Struts 应用程序中添加反 XSS 支持 最具体地说 架构师要求所有用户输入在存储到数据库之前必须进行 清理 由于我不想重新发明方轮 我可以使用哪个 Java 库来实现此目的 以及把它放在哪里 理想情况下 它应该是可配置的
  • 我怎样才能看到csrftoken?

    有没有办法直接在View中获取csrftoken 我想获取当前的 csrftoken 但有时会发生变化 因此从 Cookie 获取它不是一个好主意 有什么办法可以做到这一点吗 Thanks 我相信您正在寻找这个 django middlew
  • 无模板 Django + AJAX:Django 的 CSRF 令牌会在浏览会话过程中更新吗?

    我当前的设置是 AngularJS Django 1 5 我完全放弃了 Django 模板引擎的使用 即后端几乎是一个 API 服务器 由于我没有使用csrf tokentemplate 标签 Django 反过来 不会设置和发送csrft
  • 将用户输入显示为输入值而不进行清理是否安全?

    假设我们有一个表单 用户可以在其中输入各种信息 我们验证了信息 发现有些问题 字段丢失 电子邮件无效等等 当再次向用户显示表单时 我当然不希望他必须再次输入所有内容 因此我想填充输入字段 如果不进行消毒 这样做安全吗 如果没有 首先应该进行
  • 设置配置项 (csrf) 在 Codeigniter 中不起作用

    我只想在我的几个控制器中打开 csrf 保护 所以我有 function construct parent construct this gt load gt library form validation this gt load gt
  • 保护登录和评论表单免受 CSRF 攻击

    我读过很多关于CSRF保护的文章 这个不错 http seclab stanford edu websec csrf csrf pdf 以及关于SO的各种问题 但它们似乎都没有足够的信息来回答我的问题 我正在开发自己的 CMS 我想保护我的
  • ASP.NET MVC - ValidateAntiForgeryToken 过期

    在网页中 我们提供一个超链接 GET 用户可以单击该超链接进行身份验证 Html ActionLink Please Login MyMethod MyController 这映射到以下返回视图的控制器方法 RequireHttps pub
  • 防止语言环境文件中的 HTML 字符实体被 Rails3 xss 保护破坏

    我们正在构建一个应用程序 这是我们第一个使用 Rails 3 的应用程序 并且我们必须从一开始就构建 I18n 作为完美主义者 我们希望在我们的视图中使用真正的排版 破折号 卷曲引号 省略号等 这意味着在我们的 locales xx yml
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • 使用 Flask/WTForms 和 React 进行 CSRF 保护

    有没有人成功地为使用 React 作为受控组件 提交到 Flask 后端 最好使用 WTForms 的表单实现了 CSRF 保护 我看过很多部分答案 其中一个是关于 Django 的 但找不到任何关于 Flask 的明确答案 我的大问题似乎
  • Spring MVC 中的 CSRF(跨站请求伪造)保护

    我对春季的 CSRF 跨站请求伪造 保护有点困惑 不 我有我的 jsp 我的控制器和一个 Web 服务 我想要做的是在 Web 服务级别验证令牌 如果令牌匹配 则运行 Web 服务 在我的例子中执行数据库插入 JSP file
  • 同一域上的多个 Django 站点 - CSRF 失败

    我有两个应用程序在同一域的不同端口上运行 都使用 csrf 中间件 当我登录其中一个应用程序时POST从另一个提交失败 我推测是因为SESSION COOKIE DOMAIN是一样的 我尝试改变SESSION COOKIE NAME 但是
  • Rails API 设计无需禁用 CSRF 保护

    早在 2011 年 2 月 Rails 就改为需要 CSRF 令牌all non GET http weblog rubyonrails org 2011 2 8 csrf protection bypass in ruby on rail
  • 什么时候最好清理用户输入?

    用户等于不可信 永远不要相信不可信的用户输入 我明白了 但是 我想知道清理输入的最佳时间是什么时候 例如 您是否盲目存储用户输入 然后在访问 使用时对其进行清理 或者您是否立即清理输入 然后存储此 清理 版本 也许除了这些之外还有一些我没有
  • Chrome:ERR_BLOCKED_BY_XSS_AUDITOR 详细信息

    我在尝试发布然后获得一个简单的表单时收到了这个 chrome 标志 问题是开发者控制台没有显示任何相关内容 我自己无法找到问题的根源 是否有任何选项可以更详细地查看此内容 查看触发错误的代码片段以修复它 在开发中绕过此错误的简单方法是将标头
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕

随机推荐

  • anaconda使用系列教程--4)环境迁移

    概述 跨平台尽量避免 比如windows和linux就不要跨平台 就在linux之间跨还是可以的 直接copy整体环境文件 适合于无法联网或网速不佳的新环境 anaconda最好是同版本的 迁移方法 使用requirement文件 A机器
  • pytorch 目标检测数据处理(二)提取困难样本,低ap样本

    摘要 比赛当中数据处理有很多种 对图像数据的分析 和分析之后该如何加强比较低的ap类别 今天就讲解我最近使用的几种困难样本学习和专注低ap的数据增强后的处理 困难样本就是loss比较大的 在每一个批次训练当中都占有很大部分的loss 导致l
  • 蓝牙之五-bludroid协议栈和厂商代码的交互

    协议栈和厂商代码交互 完整的蓝牙调用图 协议栈所在的目录是 system bt 厂商代码所在的目录是hardware broadcom libbt 这两个不同的目录反应的是协议栈和厂商固件的交互流程 它们通过hci层进行交互 在bluez时
  • SCWS分词库自定义

    最近因为要进行搜索功能的实现 而实现搜索给用户一个更好的体验就需要对输入的内容进行分词 所以静下心来 好好看看分词的知识 并记录下来 还是很有必要的 今天主要做了写关于SCWS的分词的词库的一些了解学习 首先就是需要知道SCWS这个分词的词
  • XSSLabs Less1-10

    Xsslabs下载地址 https github com do0dl3 xss labs Less 1 常规插入语句 把test的值改成跨站脚本语句即可name Less 2 gt 闭合前面的语句
  • 代理IP和Socks5代理:跨界电商与全球爬虫的关键技术

    跨界电商在全球化市场中崭露头角 而代理IP和Socks5代理则成为实现全球市场洞察和数据采集的不可或缺的工具 本文将深入探讨这两种代理技术在跨界电商 爬虫技术和出海战略中的关键作用 引言 介绍跨界电商的崛起和全球市场的机遇与挑战 引出代理I
  • 说句“圣诞快乐”不容易!

    1 圣诞快乐 嘿 别以为我们这里都是基督教徒 2 哦 好吧 光明节快乐 犹太教节日 宽扎节快乐 非裔美国人的节日 3 那些节日到了吗 4 好吧 只能说节日快乐了 别说 快乐 抑郁的人伤不起
  • Python对接LDAP/AD的过程详解

    不同公司的 LDAP AD 服务配置各不相同 很难封装一个通用的方法 所以我们在对接 LDAP AD 的过程中 需要了解自己公司的 LDAP AD 服务配置是怎么样的 才能写出正确的对接代码 因此下面将拆解过程并提供相关的文档地址 首先需要
  • 从源码角度分析RabbitMQ重启后,消费者停止消费怎么解决

    前段时间的RabbitMQ broker服务端由于某个队列一直积压消息 运维在凌晨对mq服务端机器pod进行了扩容 重启了RabbitMQ 然后早上发现自己的服务在mq重启之后一直报异常 停止消费了 导致影响了业务的运行 虽然mq重启成功了
  • 服务器虚拟化设计与实现拓扑图,VMware服务器虚拟化解决具体技术方案(详细).doc...

    文档介绍 虚拟化解决方案 目 录 一 V ware解决方案概述 3 1 VMw re服务器整合解决方案 3 1 2 VMware商业连续性解决方案 1 3 VMwar 测试和开发解决方案 8 二 VMware虚拟化实施方案设计 9 2 1
  • 微信小程序:搜索动画显示

    摘要 有时候 我们再加载时 搜索蓝牙和wifi时 需要一个搜索中的动画来渲染我们的页面 动画如下图所示 搜索动画函数wx showLoading wx showLoading函数的所有参数如下 而我们一般用到的是title 如图一中的tit
  • 010.汇编语言基于x86处理器教材习题4.2.8:①-⑤程序

    386 model flat stdcall stack 4096 ExitProcess proto dwExitCode dword data val1 byte 10h val2 word 8000h val3 dword 8000h
  • VUE渲染后端返回含有script标签的html字符串

    在接入支付宝支付模块的时候 支支返回的是一个form串 细看一下还有一个script标签 如何将其渲染出来给大家分享一下经验 注意点 不能在当前页面追加任何元素例如原生js innerHtml appendChiled等等 Vue原生v h
  • JavaCV FrameGrabber问题汇总

    JavaCV FrameGrabber问题汇总 Date 2018 09 27 FrameGrabber类 JavaCV中FrameGrabber类可以连接直播流地址 进行解码 获取Frame帧信息 常用方式如下 FrameGrabber
  • 匈牙利算法

    趣写算法系列之 匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds于1965年提出 因而得名 匈牙利算法是基于Hall定理中充分性证明的思想 它是部图匹配最常见的算法 该算法的核心就是寻找增广路径 它是一种用增广路径求二分图最大匹配的算法
  • vtk体绘制代码报错的解决办法(代码在vtk7,8,9中都能运行),以及VTK数据集网站

    链接 vtk7 1 1官方文档 链接 官方示例代码 链接 VTK资源网站 需要什么资源搜索就行 官网示例中的数据集 资源基本都有 体绘制代码运行不了 一直报错的解决方案 大家应该都看过VTK图形图像进阶那本书了 那本书的VTK版本为5 10
  • 运用Python解析HTML页面获取资料

    在网络爬虫的应用中 我们经常需要从HTML页面中提取图片 音频和文字资源 本文将介绍如何使用Python的requests库和BeautifulSoup解析HTML页面 获取这些资源 一 环境准备 首先 确保您已经安装了Python环境 接
  • 懒加载异常 处理方法

    首先看一下什么是懒加载 所谓懒加载 lazy 就是延时加载 延迟加载 什么时候用懒加载呢 我只能回答要用懒加载的时候就用懒加载 至于为什么要用懒加载呢 就是当我们要访问的数据量过大时 明显用缓存不太合适 因为内存容量有限 为了减少并发量 减
  • Unity3d 图片拼接 混合模式改成点线性过滤

    从效率上来说 点线性过滤 gt 二线性过滤 gt 三线性过滤 如果点线性过滤好用的话为什么NGUI要用三线性过滤呢 1 UISprite是可以随便缩放的 如果不缩放的话点线性没问题 可是一旦缩放因为用点像素来填充那么图片必然糙了 2 我觉得
  • 跨站请求伪造(CSRF)攻击原理及预防手段

    目录 1 什么是跨站请求伪造 2 基本原理 举一个最简单的CSRF攻击例子 3 CSRF攻击的对象和预防思路 4 预防手段介绍 5 Referer检查简单实现 注册拦截器 1 什么是跨站请求伪造 CSRF Cross site Reques