今天咱们来聊聊JavaScript开发中那些至关重要的安全实践. 作为前端开发者, 我们不仅要让页面好看、交互流畅, 更重要的是要保护好用户的数据安全.
一、XSS防御
XSS(跨站脚本攻击)就像有人偷偷在你家墙上乱涂乱画. 攻击者往你的网页里注入恶意脚本, 当其他用户访问时, 这些脚本就会执行, 可能偷走cookie, 篡改页面或者干其他坏事. 常见的三种XSS类型: 1)反射型XSS: 像钓鱼, 诱骗用户点击恶意链接:
2)存储型XSS:恶意脚本被存到数据库, 每次访问都执行:// 恶意URL示例:http://example.com?search=<script>alert('你被黑了')</script>const search = new URL(location.href).searchParams.get('search');document.write(`你搜索的是: ${search}`); // 危险!直接输出未处理的内容
3)DOM型XSS: 纯前端操作导致的漏洞:// 假设评论内容直接存入数据库并显示// 攻击者提交:<script>stealCookies()</script>const comment = getCommentFromDatabase();document.getElementById('comment').innerHTML = comment; // 危险!
那么我们如何来防御XSS的攻击呢, 下面我们来列一下防御XSS的五大招:1)转义输出内容:// 攻击者构造:http://example.com#<img src=x onerror=alert('hacked')>const hash = location.hash.substring(1);document.body.innerHTML = hash; // 危险!
2)使用textContent代替innerHTML:function escapeHtml(unsafe) {return unsafe.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");}// 使用document.getElementById('output').textContent = escapeHtml(userInput);
3) 使用安全的API:// 不好的做法element.innerHTML = userInput;// 好的做法element.textContent = userInput;
4) 设置CSP(Content Security Policy)在HTTP头加入:// 使用DOMPurify库净化HTMLconst clean = DOMPurify.sanitize(dirtyHtml);element.innerHTML = clean;
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'
5)使用HttpOnly Cookie:
// 服务端设置cookie时Set-Cookie: sessionId=abc123; HttpOnly; Secure
二、CSRF防御
CSRF(跨站请求伪造)就像有人伪造你的签名去办事. 攻击者诱骗用户浏览器向你的网站发送请求, 利用用户已登录的状态完成恶意操作.CSRF的攻击示例:假设银行转账接口是:
攻击者可以在自己的网站放:POST /transferaccount=攻击者账号&amount=1000
如何防御CSRF,下面我们来列一些常用避险的方案: 1)CSRF Token:<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>
2) SameSite Cookie属性:// 服务端生成并返回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})});
3)验证Origin/Referer头:// 服务端设置cookie时Set-Cookie: sessionId=abc123; Secure; SameSite=Strict
// 服务端中间件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>
沙箱属性:
-
allow-scripts:允许执行脚本. -
allow-same-origin:保持同源. -
allow-forms:允许提交表单. -
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%安全, 但能挡住大部分攻击. 记住几个关键点:
-
永远不要信任用户输入--验证、过滤、转义三连.
-
最小权限原则--只给必要的权限
-
深度防御--多层防护比单层更可靠
-
保持更新--及时更新依赖库和安全策略
![]() |
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |




浙公网安备 33010602011771号