如何预防CSRF攻击

news2024/11/28 16:40:14

CSRF 攻击的防范措施

CSRF(Cross-Site Request Forgery)攻击是一种常见的 Web 攻击,即攻击者在用户不知情的情况下,利用用户已登录的身份,向目标网站发送恶意请求,从而实现攻击目的。本文将介绍 CSRF 攻击的原理和常见的防范措施,以帮助 Web 开发者更好地保护用户信息安全。

在这里插入图片描述

CSRF 攻击的原理

CSRF 攻击的原理比较简单,攻击者利用用户已登录的身份,向目标网站发送恶意请求,从而实现攻击目的。具体来说,攻击者会在自己的网站上构造一个恶意链接或表单,然后诱导用户点击该链接或提交表单,从而触发向目标网站发送恶意请求。由于用户已经登录了目标网站,所以恶意请求会携带用户的身份信息,目标网站无法区分是用户自己发起的请求还是攻击者伪造的请求,因此容易受到攻击。

CSRF 攻击的防范措施

为了避免 CSRF 攻击,开发者需要采取一些防范措施,以增强 Web 应用程序的安全性。下面介绍几种常见的 CSRF 攻击防范措施:

1. 随机令牌

随机令牌是一种常见的 CSRF 攻击防范措施,即在每次向目标网站发送请求时,都要携带一个随机生成的令牌(Token),目标网站在处理请求时会校验该令牌的有效性,如果无效则拒绝请求。攻击者无法伪造有效的令牌,从而避免 CSRF 攻击。

下面是一个 PHP 的随机令牌生成和校验代码示例:

<?php
// 生成随机令牌
function generate_csrf_token()
{
    $token = bin2hex(random_bytes(32));
    $_SESSION['csrf_token'] = $token;
    return $token;
}

// 校验随机令牌
function verify_csrf_token()
{
    if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
        return true;
    }
    return false;
}

// 示例:生成随机令牌
$csrf_token = generate_csrf_token();

// 示例:校验随机令牌
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (verify_csrf_token()) {
        // 处理表单数据...
    } else {
        // 令牌校验失败,拒绝请求
        die("Invalid CSRF token");
    }
}
?>

在上面的示例代码中,我们定义了一个 generate_csrf_token() 函数和一个 verify_csrf_token() 函数,用于生成和校验随机令牌。具体来说,我们使用 random_bytes() 函数生成一个随机的字节数组,并使用 bin2hex() 函数将其转换为十六进制字符串,作为令牌。同时,我们将令牌保存在 PHP 的 $_SESSION 数组中,以便后续校验令牌的有效性。

在表单提交时,我们可以将令牌作为隐藏字段(hidden field)添加到表单中,然后在服务器端校验令牌的有效性。如果令牌无效,则拒绝请求。

2. Referer 校验

Referer 校验是一种简单的 CSRF 攻击防范措施,即在处理请求时,校验请求的 Referer 头部信息,确保请求来源是合法的。由于浏览器会自动发送 Referer头部信息,因此攻击者无法伪造合法的 Referer,从而避免 CSRF 攻击。

下面是一个 PHP 的 Referer 校验代码示例:

<?php
// 校验 Referer 头部信息
function verify_referer()
{
    if (isset($_SERVER['HTTP_REFERER']) && parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) === $_SERVER['HTTP_HOST']) {
        return true;
    }
    return false;
}

// 示例:校验 Referer 头部信息
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (verify_referer()) {
        // 处理表单数据...
    } else {
        // Referer 校验失败,拒绝请求
        die("Invalid Referer");
    }
}
?>

在上面的示例代码中,我们定义了一个 verify_referer() 函数,用于校验请求的 Referer 头部信息。具体来说,我们使用 $_SERVER['HTTP_REFERER'] 变量获取请求的 Referer 头部信息,并使用 parse_url() 函数解析该信息,提取其主机名(host)部分,与当前网站的主机名进行比较。如果两者相同,则认为请求来源合法,否则拒绝请求。

需要注意的是,Referer 校验虽然简单有效,但也存在一定的局限性。一些浏览器或安全软件可能会禁用或篡改 Referer 头部信息,从而导致校验失败。因此,建议采用多种防范措施,以增强 Web 应用程序的安全性。

3. SameSite Cookie

SameSite Cookie 是一种新的 CSRF 攻击防范措施,即在设置 Cookie 时,指定 Cookie 的 SameSite 属性为 Strict 或 Lax,以限制 Cookie 的跨站访问。具体来说,SameSite 属性有以下两个取值:

  • Strict:仅允许同站点访问,禁止任何跨站访问。
  • Lax:允许一定程度的跨站访问,例如链接跳转等,但禁止一些敏感操作的跨站访问。

通过设置 SameSite 属性,可以避免一些常见的 CSRF 攻击,例如 CSRF 利用用户的 Cookie 实现恶意操作、攻击者在链接中伪造请求等。

下面是一个 PHP 的 SameSite Cookie 设置代码示例:

<?php
// 设置 SameSite Cookie
session_set_cookie_params([
    'lifetime' => 3600,
    'path' => '/',
    'domain' => '.example.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
]);
session_start();
?>

在上面的示例代码中,我们使用 session_set_cookie_params() 函数设置 Session Cookie 的参数,包括 Cookie 的寿命、路径、域名、安全标志、HttpOnly 标志和 SameSite 属性。其中,我们将 SameSite 属性设置为 Strict,以禁止任何跨站访问。

需要注意的是,SameSite 属性并不能完全解决 CSRF 攻击,仍然存在一些攻击场景需要采取其他防范措施。此外,部分较老的浏览器可能不支持 SameSite 属性,因此需要结合其他防范措施,以增强 Web 应用程序的安全性。

总结

CSRF 攻击是一种常见的 Web 攻击,可以通过利用用户已登录的身份,向目标网站发送恶意请求,从而实现攻击目的。为了避免 CSRF 攻击,开发者需要采取一些防范措施,例如随机令牌、Referer 校验和 SameSite Cookie 等。建议采用多种防范措施,以增强 Web 应用程序的安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5. 状态

一、状态是什么 由一个任务维护&#xff0c;并且用来计算某个结果的所有数据&#xff0c;都属于这个任务的状态可以认为状态就是一个本地变量&#xff0c;可以被任务的业务逻辑访问Flink 会进行状态管理&#xff0c;包括状态一致性、故障处理以及高效存储和访问&#xff0c;以…

go通过pprof定位groutine泄漏

日常开发中除了会出现Panic、ErrorInfo等通过日志很容易捕捉到的错误&#xff0c;还会出现内存泄漏、CPU激增等日志难以捕捉的问题。今天小老虎就给大家介绍下如何使用pprof去捕捉内存、CPU这些日志难以排查到的问题。 pprof的访问 pprof是Golang的性能分析工具&#xff0c;可…

Inno Setup 打包的文件以管理员权限运行

在 Inno Setup 安装目录中找到文件 SetupLdr.e32&#xff0c;用软件 ResourceHacker 打开。如下图&#xff0c;点开清单&#xff0c;找到 <requestedExecutionLevel level"asInvoker" uiAccess"false"/></requestedPrivileges>改为 <requ…

Nomad系列-Nomad网络模式

系列文章 Nomad 系列文章 概述 Nomad 的网络和 Docker 的也有很大不同, 和 K8s 的有很大不同. 另外, Nomad 不同版本(Nomad 1.3 版本前后)或是否集成 Consul 及 CNI 等不同组件也会导致网络模式各不相同. 本文详细梳理一下 Nomad 的主要几种网络模式 在Nomad 1.3发布之前&a…

CSS_文字渐变

/* 定义渐变背景样式 */ .gradient-text {background-image: linear-gradient(to right, #ff0000, #00ff00); /* 渐变色范围 */background-clip: text; /* 应用渐变背景到文本 */-webkit-background-clip: text; /* Safari 和 Chrome 的前缀 */color: transparent; /* 将文本颜…

ADS1115 模拟IIC

ADS1115是16位ADC&#xff0c;基准源内部可选&#xff0c;PGA 可提供从 256mV 到 6.144V 的输入范围。 地址可由ADDR引脚决定&#xff0c;一般接地&#xff0c;地址为0x90 写寄存器地址为0x90&#xff0c;读寄存器地址为0x91 ADS1115有4个控制寄存器&#xff0c;0x00,0x01,0x0…

debian apt安装mysqlodbc

mysql的deb包下载地址 下载后上传到linux后&#xff0c; #安装deb包 apt install ./mysql-apt-config_0.8.26-1_all.deb #更新源 apt-get update #搜索包 apt search odbc #安装包 apt-get install mysql-connector-odbc

3. 自定义datasource

一、自定义DataSource ​ 自定义DataSource有两大类&#xff1a;单线程的DataSource和多线程的DataSource 单线程&#xff1a;继承 SourceFunction 多线程&#xff1a;继承 ParallelSourceFunction&#xff0c;继承 RichParallelSourceFunction&#xff08;可以有其他的很多操…

origin中optimal cluster安装报错解决

1.在安装之后程序运行出错&#xff0c;报错信息为缺少numpy包。解决办法&#xff1a;打开窗口-脚本窗口&#xff0c;用pip安装numpy&#xff0c;其他缺少的包可用同样方法解决。 2.有的包在外部python中才有&#xff0c;通过origin无法下载。解决办法&#xff1a;在连接-python…

WIFI版本云音响设置教程阿里云平台版本

文章目录 WIFI本云音响设置教程介绍一、申请设备三元素1.登录阿里云物联网平台2.创建产品3.设置产品参数4.添加设备5.获取三元素 二、设置设备三元素1.打开MQTTConfigTools2.计算MQTT参数3.使用windows电脑的WIFI连接到设备热点4.设置参数5.配置设备连接路由器 三、阿里云物联网…

有始有终!

作者 | 磊哥 来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09; 转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09; 开始是立秋之日&#xff08;8.8 号&#xff09;&#xff0c;结束是白露之时&#xff08;9.8 号&#xff09;。 为期一月&…

Day60|leetcode 84.柱状图中最大的矩形

leetcode 84.柱状图中最大的矩形 题目链接&#xff1a;84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 视频链接&#xff1a;单调栈&#xff0c;又一次经典来袭&#xff01; LeetCode&#xff1a;84.柱状图中最大的矩形_哔哩哔哩_bilibili 题目概述 给定 n 个…

CSS3技巧36:backdrop-filter 背景滤镜

CSS3 有 filter 滤镜属性&#xff0c;能给内容&#xff0c;尤其是图片&#xff0c;添加各种滤镜效果。 filter 滤镜详见博文&#xff1a;CSS3中强大的filter(滤镜)属性_css3滤镜_stones4zd的博客-CSDN博客 后续&#xff0c;CSS3 又新增了 backdrop-filter 背景滤镜。 backdr…

卷积概念理解

卷积(convolution)最容易理解的解释_一点一点的进步的博客-CSDN博客 图像处理之卷积模式及C实现_利用卷积模型分类图片 c_扫地工的博客-CSDN博客 卷积的重要的物理意义是&#xff1a;一个函数&#xff08;如&#xff1a;单位响应&#xff09;在另一个函数&#xff08;如&…

进程

目录 进程定义 进程与程序对比 进程分类 系统进程 用户进程 交互进程 批处理进程 守护进程 进程状态 进程组成 ​编辑正文段&#xff08;text&#xff09;和用户数据段 用户数据段 正文段 PCB进程控制块 进程标识信息 处理机状态 进程调度信息 进程控制信息 …

通达信自定义副图行业指标K线指标 HYZS_QD

行业指数:HY_INDEXC,NODRAW; DRAWKLINE(HY_INDEXH,HY_INDEXO,HY_INDEXL,HY_INDEXC); MA5:MA(HY_INDEXC,5),COLORWHITE; {MA10:MA(HY_INDEXC,10),COLORYELLOW,LINETHICK2}; DRAWTEXT_FIX(1,1,1,1,STRCAT(STRCAT(CON2STR(HY_INDEXADV,0),/),STRCAT(CON2STR(HY_INDEXDEC,0), ))),…

06_瑞萨GUI(LVGL)移植实战教程之驱动EC11旋转编码器(GPIO)

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 6. 驱动EC11旋转编码器(GPIO) 本次实验我们驱动EC11旋转编码器。 6.1 复制工程 上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。 如果你不清…

XCE18T4K1P40-FJJP40、F4Z1P40规格书(泰兴创航)

关于XCE18T4K1P40-FJJP40、F4Z1P40电连接器规格书 主要性能指标 工作温度&#xff1a;-55℃~200℃相对湿度&#xff1a;温度40℃2℃时达98%振动&#xff1a;频率10-2000Hz&#xff0c;加速度196m/s2冲击&#xff1a;加速度980m/s2机械寿命&#xff1a;5000次壳体材料&#xff1…

05_瑞萨GUI(LVGL)移植实战教程之添加LVGL库,对接显示和触摸驱动

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 5. 添加LVGL库&#xff0c;对接显示和触摸驱动 本次实验我们会融合前面实验的成果&#xff0c;添加LVGL库&#xff0c;对接显示和触摸驱动&#xff0c;让屏幕能显示…

金蝶云星空与泛微OA集成的方案落地与实践

打破信息孤岛&#xff0c;泛微OA集成的方案落地与实践 在现代企业内部&#xff0c;不同类型的业务系统和泛微OA平台层出不穷。企业需要找到一种高效的方法来整合和协同这些多样化的系统&#xff0c;同时将它们与泛微OA平台融合&#xff0c;以实现资源整合和高度协同的办公环境…