惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
博客园 - Franky
IT之家
IT之家
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
腾讯CDC
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
博客园_首页
G
Google Developers Blog

博客园 - lzhdim

25个每个开发人员都应该掌握的JavaScript 数组方法 20260831 - 个人小作品更新 C#使用SQLite数据库例子 - 开源研究系列文章 20260830 - 个人小作品更新 20260829 - 个人小作品更新 13、JavaScript事件循环机制 - JavaScript学习系列文章 首款媲美分体水冷的一体水冷!微星CORELIQUID E15 360水冷散热器评测:目前为止 锐龙9 9950X3D最强性能释放 JavaScript常见的内存泄露问题 - JavaScript学习系列文章 C#开发的颜色取色器 - 开源研究系列文章 - 个人小作品 成长环境 - 我的闪存 提高 SQL 语句执行速度的方法 关闭iPhone一些默认设置,让iPhone更流畅 20260814 - 个人小作品更新 JavaScript对象与元编程 20260812 - 个人小作品更新 JavaScript 模块化系统 Markdown 语法完全指南 C# 通过 Windows API 实现进程内存读写操作 JavaScript 函数进阶课题 C#开发的基于钩子技术监测键鼠事件的例子 - 开源项目研究文章 JavaScript异步编程的演进 近十年最帅风冷!酷冷至尊V8 ACE 3DHP散热器评测:单塔能干翻双塔 20260723 - 个人小作品更新 C# 中读取CPU、硬盘和内存温度 雷柏VT3s MAX鼠标评测:中小手型用户也没有被遗忘 顶尖性能的小号电竞鼠标来了 JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册 专为AI而生的企业级QLC SSD!长江存储PE501 61.44TB评测:超过1PB的写入测试
JavaScript安全最佳实践
lzhdim · 2026-08-16 · via 博客园 - lzhdim

今天咱们来聊聊JavaScript开发中那些至关重要的安全实践. 作为前端开发者, 我们不仅要让页面好看、交互流畅, 更重要的是要保护好用户的数据安全. 

一、XSS防御

XSS(跨站脚本攻击)就像有人偷偷在你家墙上乱涂乱画. 攻击者往你的网页里注入恶意脚本, 当其他用户访问时, 这些脚本就会执行, 可能偷走cookie, 篡改页面或者干其他坏事. 常见的三种XSS类型: 1)反射型XSS: 像钓鱼, 诱骗用户点击恶意链接: 

// 恶意URL示例:http://example.com?search=<script>alert('你被黑了')</script>const search = new URL(location.href).searchParams.get('search');document.write(`你搜索的是: ${search}`);  

2)存储型XSS:恶意脚本被存到数据库, 每次访问都执行:

// 假设评论内容直接存入数据库并显示// 攻击者提交:<script>stealCookies()</script>const comment = getCommentFromDatabase(); document.getElementById('comment').innerHTML = comment; 

3)DOM型XSS: 纯前端操作导致的漏洞: 

// 攻击者构造:http://example.com#<img src=x onerror=alert('hacked')>const hash = location.hash.substring(1);document.body.innerHTML = hash; 

那么我们如何来防御XSS的攻击呢, 下面我们来列一下防御XSS的五大招:1)转义输出内容:

function escapeHtml(unsafe) {  return unsafe    .replace(/&/g"&amp;")    .replace(/</g"&lt;")    .replace(/>/g"&gt;")    .replace(/"/g"&quot;")    .replace(/'/g"&#039;");}
// 使用document.getElementById('output').textContent = escapeHtml(userInput);

2)使用textContent代替innerHTML: 

// 不好的做法element.innerHTML = userInput; 
// 好的做法element.textContent = userInput;

3) 使用安全的API: 

// 使用DOMPurify库净化HTMLconst clean = DOMPurify.sanitize(dirtyHtml);element.innerHTML = clean;

4) 设置CSP(Content Security Policy)在HTTP头加入: 

Content-Security-Policydefault-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'

5)使用HttpOnly Cookie: 

// 服务端设置cookie时Set-Cookie: sessionId=abc123; HttpOnlySecure

二、CSRF防御

CSRF(跨站请求伪造)就像有人伪造你的签名去办事. 攻击者诱骗用户浏览器向你的网站发送请求, 利用用户已登录的状态完成恶意操作.CSRF的攻击示例:假设银行转账接口是: 

POST /transferaccount=攻击者账号&amount=1000

攻击者可以在自己的网站放: 

<form action="https://bank.com/transfer" method="POST">  <input type="hidden" name="account" value="攻击者账号">  <input type="hidden" name="amount" value="1000"></form><script>document.forms[0].submit();</script>

如何防御CSRF,下面我们来列一些常用避险的方案: 1)CSRF Token: 

// 服务端生成并返回tokenconst csrfToken = generateRandomToken();res.cookie('XSRF-TOKEN', csrfToken);
// 前端在请求中带上tokenfetch('/api/transfer', {  method'POST',  headers: {    'X-XSRF-TOKEN'getCookie('XSRF-TOKEN')  },  body: JSON.stringify({account, amount})});

2) SameSite Cookie属性: 

// 服务端设置cookie时Set-Cookie: sessionId=abc123; SecureSameSite=Strict

3)验证Origin/Referer头: 

// 服务端中间件app.use((req, res, next) => {  const origin = req.get('Origin');  if (!origin.includes('yourdomain.com')) {    return res.status(403).send('Forbidden');  }  next();});

三 、沙箱机制

给你的代码造个隔离间: 1)iframe沙箱: 

<iframe sandbox="allow-scripts allow-same-origin"         src="https://third-party.com/widget"></iframe>

沙箱属性: 

  1. allow-scripts: 允许执行脚本.

  2. allow-same-origin: 保持同源.

  3. allow-forms: 允许提交表单.

  4. allow-popups: 允许弹出窗口.

2) Web Workers处理不可信代码: 

// 主线程const worker = new Worker('untrusted-code-handler.js');worker.postMessage(userInput);worker.onmessage = (e) => {  // 安全地处理返回结果};
// untrusted-code-handler.jsself.onmessage = (e) => {  const result = processInput(e.data);  self.postMessage(result);};

3)使用Shadow DOM隔离样式: 

// 创建Shadow DOMconst host = document.getElementById('host');const shadowRoot = host.attachShadow({ mode: 'closed' });
// 添加隔离的内容shadowRoot.innerHTML = `  <style>    /* 这里的样式不会影响外部 */    p { color: red; }  </style>  <p>安全隔离的内容</p>`;

四、总结

JavaScript安全就像给你的网站穿上防弹衣, 虽然不能保证100%安全, 但能挡住大部分攻击. 记住几个关键点: 

  1. 永远不要信任用户输入--验证、过滤、转义三连.

  2. 最小权限原则--只给必要的权限

  3. 深度防御--多层防护比单层更可靠

  4. 保持更新--及时更新依赖库和安全策略