JavaScript如何实现CSRF防御?JavaScript安全编程实用指南

来源:IPIPP.com作者:南京SEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《JavaScript如何实现CSRF防御?JavaScript安全编程实用指南》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript如何实现CSRF防御?JavaScript安全编程实用指南》有用,将其分享出去将是对创作者最好的鼓励。

CSRF即跨站请求伪造,是一种利用用户已登录的合法身份,在用户不知情的情况下发起恶意请求的攻击方式。攻击者通常会构造恶意页面,诱导用户访问后自动触发对目标站点的请求,由于浏览器会自动携带用户的登录凭证,目标站点会误认为是用户主动发起的合法请求,从而执行攻击者预设的操作。

JavaScript如何实现CSRF防御?JavaScript安全编程实用指南

CSRF攻击的常见场景

常见的CSRF攻击场景包括修改用户账户信息、发起转账操作、删除重要数据等。比如攻击者构造一个隐藏的表单,当用户访问恶意页面时,表单会自动提交到目标银行的转账接口,携带用户的登录Cookie,完成恶意转账操作。这类攻击之所以能成功,主要是因为Web的身份验证机制依赖Cookie,且浏览器会自动在请求中携带对应域名的Cookie。

JavaScript层面的CSRF防御手段

1. 利用同源策略限制跨域请求

同源策略是浏览器最核心的安全机制之一,它限制了一个源加载的文档或脚本如何与另一个源的资源进行交互。同源要求协议、域名、端口三者完全一致。如果请求不满足同源要求,浏览器会直接拦截响应,避免恶意站点获取敏感数据。

我们可以通过以下代码检查请求是否符合同源要求:

// 检查目标URL是否与当前页面同源
function isSameOrigin(targetUrl) {
    const currentOrigin = window.location.origin;
    const targetOrigin = new URL(targetUrl).origin;
    return currentOrigin === targetOrigin;
}

// 示例:检查转账接口是否同源
const transferUrl = 'https://ippipp.com/api/transfer';
if (isSameOrigin(transferUrl)) {
    console.log('请求符合同源策略,可正常发起');
} else {
    console.log('请求跨域,需额外处理');
}

2. 合理配置CORS跨域资源共享

如果业务需要跨域请求,需要正确配置CORS规则,避免将Access-Control-Allow-Origin设置为通配符*,否则会允许任意第三方站点发起跨域请求,增加CSRF攻击风险。正确的做法是只允许信任的域名跨域访问。

以下是Node.js服务端配置CORS的示例:

const express = require('express');
const app = express();

// 允许跨域的白名单
const allowedOrigins = ['https://ipipp.com', 'https://trusted-site.com'];

app.use((req, res, next) => {
    const origin = req.headers.origin;
    if (allowedOrigins.includes(origin)) {
        res.setHeader('Access-Control-Allow-Origin', origin);
        res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE');
        res.setHeader('Access-Control-Allow-Headers', 'Content-Type,CSRF-Token');
        // 不允许携带凭证的通配符配置,避免安全风险
        res.setHeader('Access-Control-Allow-Credentials', 'true');
    }
    next();
});

app.listen(3000);

3. 使用CSRF Token验证请求合法性

CSRF Token是目前最有效的防御手段之一,核心思路是服务端生成一个随机的、不可预测的Token,嵌入到前端页面的表单或请求头中,每次发起敏感请求时携带该Token,服务端验证Token的有效性,如果Token不存在或不匹配,则拒绝请求。

前端获取并携带CSRF Token的示例:

// 从页面meta标签中获取CSRF Token
function getCSRFToken() {
    const metaTag = document.querySelector('meta[name="csrf-token"]');
    return metaTag ? metaTag.content : '';
}

// 发起转账请求时携带CSRF Token
async function sendTransferRequest(amount, targetAccount) {
    const csrfToken = getCSRFToken();
    try {
        const response = await fetch('https://ipipp.com/api/transfer', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'CSRF-Token': csrfToken
            },
            body: JSON.stringify({
                amount: amount,
                target: targetAccount
            }),
            credentials: 'include' // 携带Cookie
        });
        const result = await response.json();
        console.log('转账结果:', result);
    } catch (error) {
        console.error('请求失败:', error);
    }
}

4. 避免使用GET请求处理敏感操作

GET请求的参数会暴露在URL中,且容易被恶意站点通过<img>、<script>等标签自动发起,因此敏感操作如转账、修改密码等必须使用POST、PUT等请求方法,降低被CSRF攻击的概率。

其他辅助防御措施

  • 设置Cookie的SameSite属性为Strict或Lax,限制Cookie在跨站请求中不被携带,从根源上避免CSRF利用Cookie的问题
  • 敏感操作增加二次验证,比如短信验证码、人脸验证等,即使请求被伪造,攻击者也无法完成验证
  • 定期检查前端代码,避免存在可被利用的XSS漏洞,因为XSS可以窃取CSRF Token,绕过Token验证机制

总结

CSRF防御需要前后端配合完成,JavaScript在前端层面可以通过同源检查、正确携带验证信息、规范请求方法等方式提升防御能力。开发者需要充分理解CSRF的攻击原理,结合业务场景选择合适的防御方案,同时做好相关安全配置的检查,才能有效降低CSRF攻击带来的风险,保障用户和业务的财产安全。

CSRF防御JavaScript安全编程同源策略CORSCSRF_token修改时间:2026-06-16 22:00:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。