【网络安全】一文带你了解什么是【CSRF攻击】

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,它利用已认证用户在受信任网站上的身份,诱使用户在不知情的情况下执行恶意操作。具体来说,攻击者通过各种方式(如发送恶意链接、在第三方网站上嵌入恶意代码等)诱导用户的浏览器发送未经授权的请求到受信任的网站。这些请求会携带用户的认证信息(如Cookie、Session),从而让受信任的网站误以为是用户本人发起的合法请求。

目录

1 CSRF攻击的基本原理

2 预防CSRF攻击的方法 

3 使用CSRF令牌(Token)的具体实现

3.1 在服务器端生成CSRF令牌

3.2 在HTML表单中包含CSRF令牌

3.3 在服务器端验证CSRF令牌

3.4 解析请求体(中间件)

3.5 完整的示例代码

3.7 注意事项


1 CSRF攻击的基本原理

  • 用户登录受信任的网站:用户在受信任的网站上登录,浏览器保存了该网站的会话Cookie。
  • 用户访问恶意网站:攻击者诱导用户访问恶意网站或点击恶意链接。
  • 恶意网站发送请求:恶意网站构造一个请求,利用用户的浏览器发送到受信任的网站。由于用户已经登录,浏览器会自动附带用户的会话Cookie。
  • 受信任的网站处理请求:受信任的网站接收到请求后,看到附带的合法会话Cookie,以为这是用户发起的合法请求,从而执行相应的操作。

2 预防CSRF攻击的方法 

  • 使用CSRF令牌(Token):在每次提交表单时,服务器生成一个唯一的CSRF令牌,并将其包含在表单中。服务器在处理请求时验证令牌的有效性,确保请求来自合法的来源。
  • 验证HTTP头部:检查请求的来源(Referer或Origin头部),确保请求是从受信任的域名发出的。
  • 使用双重提交Cookie:在请求中同时包含会话Cookie和一个自定义的CSRF令牌,服务器验证这两个值是否一致。
  • 使用SameSite Cookie属性:设置Cookie的SameSite属性为Strict或Lax,限制Cookie的跨站使用,从而减少CSRF攻击的风险。

CSRF攻击的目标通常是执行用户不希望的操作,例如更改账户设置、进行交易或发送敏感数据等。因此,理解和防范CSRF攻击对于保护用户的安全至关重要。

3 使用CSRF令牌(Token)的具体实现

使用CSRF令牌(Token)是防范CSRF攻击的一种有效方法。下面是一个具体的实现步骤,假设你使用的是Node.js和Express框架,前端使用HTML和JavaScript。

3.1 在服务器端生成CSRF令牌

首先,需要在服务器端生成一个唯一的CSRF令牌,并将其存储在用户的会话中。

const express = require('express');
const session = require('express-session');
const crypto = require('crypto');

const app = express();

app.use(session({
  secret: 'your_secret_key',
  resave: false,
  saveUninitialized: true
}));

// 中间件:生成CSRF令牌并存储在会话中
app.use((req, res, next) => {
  if (!req.session.csrfToken) {
    req.session.csrfToken = crypto.randomBytes(32).toString('hex');
  }
  next();
});

3.2 在HTML表单中包含CSRF令牌

在服务器端的响应中,需要将CSRF令牌包含在HTML表单中,通常以隐藏字段的形式。

app.get('/form', (req, res) => {
  res.send(`
    <form action="/submit" method="POST">
      <input type="hidden" name="csrfToken" value="${req.session.csrfToken}">
      <!-- 其他表单字段 -->
      <button type="submit">Submit</button>
    </form>
  `);
});

3.3 在服务器端验证CSRF令牌

在处理表单提交请求时,服务器需要验证提交的CSRF令牌是否有效。

app.post('/submit', (req, res) => {
  const { csrfToken } = req.body;
  if (csrfToken !== req.session.csrfToken) {
    return res.status(403).send('CSRF token mismatch');
  }
  // 处理表单提交
  res.send('Form submission successful');
});

3.4 解析请求体(中间件)

为了从POST请求中解析CSRF令牌,需要使用body-parser中间件。

const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

3.5 完整的示例代码

下面是完整的示例代码,将上述步骤结合起来:

const express = require('express');
const session = require('express-session');
const crypto = require('crypto');
const bodyParser = require('body-parser');

const app = express();

app.use(session({
  secret: 'your_secret_key',
  resave: false,
  saveUninitialized: true
}));

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.use((req, res, next) => {
  if (!req.session.csrfToken) {
    req.session.csrfToken = crypto.randomBytes(32).toString('hex');
  }
  next();
});

app.get('/form', (req, res) => {
  res.send(`
    <form action="/submit" method="POST">
      <input type="hidden" name="csrfToken" value="${req.session.csrfToken}">
      <!-- 其他表单字段 -->
      <button type="submit">Submit</button>
    </form>
  `);
});

app.post('/submit', (req, res) => {
  const { csrfToken } = req.body;
  if (csrfToken !== req.session.csrfToken) {
    return res.status(403).send('CSRF token mismatch');
  }
  // 处理表单提交
  res.send('Form submission successful');
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

3.7 注意事项

  • CSRF令牌的生成和验证应尽量使用加密安全的随机数生成方法
  • 确保CSRF令牌的存储和传输安全,避免令牌被第三方窃取。
  • 每次会话开始时生成新的CSRF令牌,确保令牌的唯一性和不可预测性。

### WSL2 编译过程卡死的原因分析与解决方案 WSL2(Windows Subsystem for Linux 2)作为 Windows 上运行 Linux 的一种高效方式,其性能和兼容性得到了显著提升。然而,在某些情况下,编译过程可能会出现卡死现象。以下是可能原因及其对应的解决方法: #### 可能原因一:网络连接不稳定 如果编译过程中涉及下载依赖项或更新包列表,则网络问题可能导致进程挂起。 - **解决方法** 确保网络稳定并尝试重新执行命令。可以临时切换到更稳定的网络环境来验证是否为网络引起的问题[^3]。 #### 可能原因二:磁盘 I/O 性能瓶颈 WSL2 使用虚拟化技术模拟硬件设备,当大量读写操作发生时,尤其是访问位于 NTFS 文件系统的目录时,可能出现性能下降甚至卡顿的情况。 - **优化措施** - 将源码及相关工作文件存储于 `/mnt/wslg` 或者其他专门分配给 WSL 的 ext4 格式的分区中而非直接映射至 C:\ 驱动器路径下。 - 调整 `wsl.conf` 设置减少不必要的同步开销: ```bash [automount] enabled = true options = "metadata" [mount] c:/ = none bind-cwd rw,noatime,nofollow,uid=1000,gid=1000,umask=22,fmask=117 ``` #### 可能原因三:资源不足 类似于 VMware 中遇到的操作系统卡死情况,内存过载也可能影响 WSL2 正常运作。 - **缓解策略** 通过修改 `.wslconfig` 来增加分配给 WSL 实例的 RAM 和 CPU 数量: ```ini [wsl2] memory=8GB # 设定最大可用内存大小,默认单位 GB processors=4 # 分配核心数 swap=2GB # 启用交换空间以应对突发需求 localhostForwarding=true # 开启本地端口转发功能以便调试服务程序 ``` 重启 WSL (`wsl --shutdown`) 让更改生效后再试一次构建流程[^4]。 #### 可能原因四:特定工具链版本冲突 不同软件组件间可能存在版本不匹配的现象,比如 GCC 版本较旧无法满足现代库的要求或者 Python 环境变量污染等问题都会引发异常行为。 - **排查手段** 确认所使用的开发套件均为最新稳定版;对于像 ORB-SLAM 这样的复杂工程尤其要注意第三方依赖关系表单里指定的确切标签号克隆仓库分支而不是 master/main 头部提交记录[^1]。 --- ### 示例代码片段展示如何调整 wsl.conf 参数改善性能表现 编辑 ~/.profile 添加如下内容启用高性能模式: ```bash export MAKEFLAGS="-j$(nproc)" alias ls='ls --color=auto' alias ll='ls -lhF' ``` 同时创建全局范围内的配置文件 /etc/wsl.conf 如果尚未存在的话: ```bash sudo nano /etc/wsl.conf ``` 填入上述提到过的 automount 和 mount 配置节段保存退出即可应用新设定。 ---
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经海路大白狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值