前端安全:别让你的网站成为黑客的游乐场

前端安全:别让你的网站成为黑客的游乐场

毒舌时刻

前端安全?这不是后端的事吗?

"我只是个前端,安全关我什么事?"——结果网站被XSS攻击,用户信息泄露,
"我用了框架,应该很安全吧?"——结果框架有漏洞,被人轻松突破,
"我的网站小,没人会攻击的"——结果被黑客当作练手的靶子。

醒醒吧,前端安全不是可有可无的,而是必须重视的!

为什么你需要这个?

  • 保护用户数据:防止用户信息被窃取
  • 维护网站声誉:避免安全事件影响品牌形象
  • 遵守法律法规:如GDPR、CCPA等数据保护法规
  • 防止业务损失:避免因安全问题导致的经济损失

反面教材

// 反面教材:直接拼接HTML字符串 function renderUserInput() { const userInput = document.getElementById('user-input').value; // 危险!直接将用户输入插入到DOM中 document.getElementById('output').innerHTML = userInput; } // 反面教材:不安全的API调用 function login() { const username = document.getElementById('username').value; const password = document.getElementById('password').value; // 危险!在前端存储敏感信息 localStorage.setItem('username', username); localStorage.setItem('password', password); // 危险!明文传输密码 fetch('https://api.example.com/login', { method: 'POST', body: JSON.stringify({ username, password }) }); } // 反面教材:使用不安全的第三方库 // package.json { "dependencies": { "some-old-library": "1.0.0" // 存在已知安全漏洞 } } 

正确的做法

// 正确的做法:使用安全的DOM操作 function renderUserInput() { const userInput = document.getElementById('user-input').value; // 安全!使用textContent或createElement document.getElementById('output').textContent = userInput; // 或者使用DOMPurify净化HTML // const sanitizedInput = DOMPurify.sanitize(userInput); // document.getElementById('output').innerHTML = sanitizedInput; } // 正确的做法:安全的API调用 function login() { const username = document.getElementById('username').value; const password = document.getElementById('password').value; // 安全!使用HTTPS传输 fetch('https://api.example.com/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }) }) .then(res => res.json()) .then(data => { // 安全!使用token而不是存储密码 localStorage.setItem('token', data.token); }); } // 正确的做法:定期更新依赖 // package.json { "dependencies": { "some-library": "^2.0.0" // 使用最新版本,避免已知漏洞 }, "scripts": { "security": "npm audit" // 定期检查安全漏洞 } } // 正确的做法:实现内容安全策略(CSP) // 在HTML头部添加 /* <meta http-equiv="Content-Security-Policy" content=" default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' https://trusted-cdn.com; img-src 'self' https://trusted-cdn.com data:; connect-src 'self' https://api.example.com; frame-src 'none'; "> */ // 正确的做法:防止CSRF攻击 function submitForm() { // 获取CSRF token const csrfToken = document.querySelector('meta[name="csrf-token"]').content; fetch('https://api.example.com/submit', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken // 添加CSRF token }, body: JSON.stringify({ data: 'some data' }) }); } 

毒舌点评

看看,这才叫前端安全!不是简单地说"我用了HTTPS"就完事了,而是从输入验证、API调用、依赖管理等多个方面入手。

记住,前端安全是一个系统性的工程,不是靠一两个措施就能解决的。你需要时刻保持警惕,关注最新的安全漏洞和防护措施。

所以,别再觉得前端安全不重要了,它可能是你网站的最后一道防线!

总结

  • 输入验证:使用textContent或DOMPurify净化用户输入
  • HTTPS传输:确保所有API调用使用HTTPS
  • 敏感信息保护:不在前端存储密码等敏感信息
  • 依赖管理:定期更新依赖,避免已知安全漏洞
  • 内容安全策略(CSP):限制资源加载来源,防止XSS攻击
  • CSRF防护:使用CSRF token防止跨站请求伪造
  • 安全头部:设置适当的安全相关HTTP头部
  • 定期安全审计:使用工具检查代码中的安全漏洞

前端安全不是选择题,而是必答题!

Read more

【Java Web学习 | 第三篇】CSS(2) - 元素显示模式

【Java Web学习 | 第三篇】CSS(2) - 元素显示模式

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * CSS元素显示模式 * 2.1 什么是元素显示模式? * 2.2 三大核心显示模式详解 * 1. 块级元素(Block Level Elements) * 2. 行内元素(Inline Elements) * 3. 行内块元素(Inline-Block Elements) * 2.3元素显示模式的转换语法 * 1. 转为块级元素:`display: block` * 2. 转为行内元素:`display: inline` * 3. 转为行内块元素:`display: inline-block` * 2.4 实战案例:小米侧边栏实现 * 2.

前端代码分割与懒加载:让你的应用飞起来

前端代码分割与懒加载:让你的应用飞起来 毒舌时刻 代码分割和懒加载?听起来就像是前端工程师为了掩饰自己代码写得太烂而发明的借口。你写的代码那么大,加载时间那么长,不分割能行吗? 你以为随便分割一下代码就能解决性能问题?别做梦了!如果分割策略不合理,反而会导致更多的网络请求,让应用变得更慢。 为什么你需要这个 1. 减少初始加载时间:通过代码分割,只加载当前页面所需的代码,减少初始加载时间,提高用户体验。 2. 优化资源利用:只加载用户需要的代码,避免加载不必要的资源,优化内存和带宽使用。 3. 提高首屏渲染速度:快速加载首屏所需的代码,让用户尽快看到页面内容。 4. 支持大型应用:对于大型应用,代码分割可以避免打包后的文件过大,导致加载时间过长。 反面教材 // 这是一个典型的不使用代码分割的应用 import React from 'react'; import ReactDOM from 'react-dom'; import Home

前端小白别慌:HTML表格边线重合问题一招搞定(附避坑指南)

前端小白别慌:HTML表格边线重合问题一招搞定(附避坑指南)

前端小白别慌:HTML表格边线重合问题一招搞定(附避坑指南) * 前端小白别慌:HTML表格边线重合问题一招搞定(附避坑指南) * 开篇先唠两句 * 这玩意儿到底是啥 * 深入扒一扒collapse的脾气 * 边框合并的规则 * border-spacing直接报废 * 浏览器的小脾气 * 这招好用但也有坑 * 先说说好处 * 但麻烦事儿也不少 * 实际项目里咋用才稳 * 后台管理系统表格 * 财务报表类表格 * 响应式布局下的注意事项 * 踩坑了怎么救场 * 边框消失不见 * 双线变单线失败 * 颜色不对 * 移动端变形 * 打印样式悲剧 * 老前端私藏的几个骚操作 * CSS变量管理边框颜色 * 第一行和最后一行单独处理 * hover效果配合transition * 表头固定时的边框陷阱 * 暗色主题下调色 * 最后唠点实在的 前端小白别

前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了

前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了

亲爱的前端开发者(以及所有关心界面未来的人),我最近把大量精力砸进了一个听起来小众、实则能重塑整个网页布局范式的项目。过去几年,我们一直在抱怨 CSS 强大却难以捉摸,DOM 测量方便却代价高昂。尤其在 AI 时代,界面需要动态、响应式、甚至上万元素同时运行时,文本测量成了卡死一切创新的最后瓶颈——它既是基础,又是地狱。 现在,这个瓶颈被彻底攻破了。我发现了一个开源纯 TypeScript 的用户态文本测量引擎,名叫 Pretext。它不需要 CSS、不依赖 DOM 测量,就能精准计算任意文本在任意宽度下的排版结果,支持整个网页的完整布局。体积只有几 KB,却能处理浏览器所有怪癖,支持全球语言(包括韩文混排 RTL 阿拉伯文和平台表情),还能轻松跑出 120fps 的复杂交互。 看效果 TypeScript 的用户态文本测量引擎,名叫 Prete 很多人以为 CSS