如何解决 RESTful API 中出现的 CSRF 攻击?

什么是 CSRF 攻击?

CSRF(Cross-Site Request Forgery)攻击是一种利用用户已登录的身份在不知情的情况下完成非法操作的攻击方式。攻击者通过欺骗用户点击链接或访问恶意站点的方式,向目标站点发送伪造的请求,从而完成一些非法操作,比如修改用户信息、发表评论、转账等。

CSRF 攻击的原理

在 CSRF 攻击中,攻击者会创建一个恶意站点,在该站点中包含一个请求目标站点的链接或表单。当用户访问恶意站点时,恶意站点中的链接或表单会向目标站点发送请求,而此时用户在目标站点中已经登录,请求会被目标站点认为是合法的,从而完成攻击。

如何防范 CSRF 攻击?

1. 验证来源站点

在发送请求时,验证请求的来源站点是否为合法站点。可以在服务端中设置一个白名单,只允许合法站点发送请求。如果请求的来源不在白名单中,则直接拒绝请求。

示例代码:

const whitelist = ['https://www.example.com', 'https://www.example.net'];

function checkOrigin(req) {
  const origin = req.get('Origin');
  if (whitelist.includes(origin)) {
    return true;
  }
  return false;
}

app.post('/api/update_user_info', (req, res) => {
  if (!checkOrigin(req)) {
    res.status(403).send('Forbidden');
    return;
  }
  // 处理请求
});

2. 添加 CSRF Token

在发送请求时,为每个请求添加一个唯一的 CSRF Token,服务端在接收到请求时验证 Token 的合法性。Token 可以在服务端中生成,并在每个请求中添加一个名为 X-CSRF-Token 的请求头。

示例代码:

const csrf = require('csurf');
const csrfProtection = csrf({ cookie: true });

app.get('/user_info', csrfProtection, (req, res) => {
  res.render('user_info', { csrfToken: req.csrfToken() });
});

app.post('/api/update_user_info', csrfProtection, (req, res) => {
  // 处理请求
});

3. 添加 Referer 验证

在发送请求时,验证请求的 Referer 是否为合法站点。Referer 是 HTTP 请求头中的一个字段,用来标识请求的来源地址。可以在服务端中设置一个白名单,只允许合法站点作为 Referer。

示例代码:

const whitelist = ['https://www.example.com', 'https://www.example.net'];

function checkReferer(req) {
  const referer = req.get('Referer');
  const url = new URL(referer);
  if (whitelist.includes(url.origin)) {
    return true;
  }
  return false;
}

app.post('/api/update_user_info', (req, res) => {
  if (!checkReferer(req)) {
    res.status(403).send('Forbidden');
    return;
  }
  // 处理请求
});

总结

CSRF 攻击是一种常见的网络攻击方式,可以通过验证来源站点、添加 CSRF Token、添加 Referer 验证等方式来防范。在开发 RESTful API 时,需要注意防范 CSRF 攻击,保护用户信息安全。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6589b558eb4cecbf2df07603


纠错
反馈