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

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

毒舌时刻

这代码写得跟筛子似的,到处都是漏洞。

各位前端同行,咱们今天聊聊前端安全。别告诉我你还在忽略安全问题,那感觉就像在没有锁的房子里放贵重物品——能放,但随时可能被偷。

为什么你需要关注前端安全

最近看到一个项目,直接在前端存储用户密码,没有任何加密措施。我就想问:你是在做网站还是在做慈善?

反面教材

// 反面教材:不安全的代码 function Login() { const [username, setUsername] = React.useState(''); const [password, setPassword] = React.useState(''); const handleSubmit = async (e) => { e.preventDefault(); // 直接发送密码,没有加密 const response = await fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }) }); const data = await response.json(); // 直接存储 token 在 localStorage localStorage.setItem('token', data.token); }; return ( <form onSubmit={handleSubmit}> <input type="text" placeholder="用户名" value={username} onChange={(e) => setUsername(e.target.value)} /> <input type="password" placeholder="密码" value={password} onChange={(e) => setPassword(e.target.value)} /> <button type="submit">登录</button> </form> ); } export default Login; 

毒舌点评:这代码,就像在大街上裸奔,一点隐私都没有。

正确姿势

1. 密码安全

// 正确姿势:密码安全 // 1. 使用 HTTPS // 2. 密码加密传输 function Login() { const [username, setUsername] = React.useState(''); const [password, setPassword] = React.useState(''); const handleSubmit = async (e) => { e.preventDefault(); // 使用 HTTPS 传输 const response = await fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }) }); const data = await response.json(); // 使用 httpOnly cookie 存储 token // 服务端设置: res.cookie('token', token, { httpOnly: true, secure: true }); }; return ( <form onSubmit={handleSubmit}> <input type="text" placeholder="用户名" value={username} onChange={(e) => setUsername(e.target.value)} /> <input type="password" placeholder="密码" value={password} onChange={(e) => setPassword(e.target.value)} /> <button type="submit">登录</button> </form> ); } export default Login; 

2. XSS 防护

// 正确姿势:XSS 防护 // 1. 使用 dangerouslySetInnerHTML 时要小心 // 2. 对用户输入进行转义 function CommentList({ comments }) { return ( <div> {comments.map(comment => ( <div key={comment.id}> {/* 安全的方式:直接渲染文本 */} <p>{comment.content}</p> {/* 不安全的方式 */} {/* <p dangerouslySetInnerHTML={{ __html: comment.content }} /> */} </div> ))} </div> ); } // 后端转义 // server.js app.post('/api/comments', (req, res) => { const { content } = req.body; // 转义用户输入 const escapedContent = escapeHtml(content); // 存储转义后的内容 db.insert({ content: escapedContent }); res.json({ success: true }); }); function escapeHtml(text) { return text .replace(/&/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/"/g, '&quot;') .replace(/'/g, '&#039;'); } 

3. CSRF 防护

// 正确姿势:CSRF 防护 // 1. 使用 CSRF token // 2. 验证 Origin/Referer 头 function Form() { const [csrfToken, setCsrfToken] = React.useState(''); React.useEffect(() => { // 从服务端获取 CSRF token async function getCsrfToken() { const response = await fetch('/api/csrf-token'); const data = await response.json(); setCsrfToken(data.token); } getCsrfToken(); }, []); const handleSubmit = async (e) => { e.preventDefault(); const response = await fetch('/api/submit', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken }, body: JSON.stringify({ /* 表单数据 */ }) }); const data = await response.json(); console.log(data); }; return ( <form onSubmit={handleSubmit}> <input type="hidden" name="_csrf" value={csrfToken} /> {/* 表单字段 */} <button type="submit">提交</button> </form> ); } // 服务端验证 // server.js app.post('/api/submit', (req, res) => { const csrfToken = req.headers['x-csrf-token'] || req.body._csrf; if (!csrfToken || !validateCsrfToken(csrfToken)) { return res.status(403).json({ error: 'CSRF token invalid' }); } // 处理请求 res.json({ success: true }); }); 

4. 依赖安全

// 正确姿势:依赖安全 // 1. 定期更新依赖 // 2. 使用 npm audit 检查漏洞 // 3. 使用 Snyk 等工具监控 // package.json { "name": "my-app", "version": "1.0.0", "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0" }, "scripts": { "audit": "npm audit", "update": "npm update" } } // 运行命令 // npm run audit // npm run update 

毒舌点评:这才叫前端安全,让你的网站固若金汤,再也不用担心黑客攻击了。

Read more

2026年,我整理了中国 200 多家机器人(具身智能)公司名单

2026年,我整理了中国 200 多家机器人(具身智能)公司名单

近几年,机器人行业突然变得异常热闹。尤其是2022年9月特斯拉首次亮相具身智能人形机器人 Optimus 之后,国内外都掀起了一波浪潮。2023年之后,国内出现了一批新的人形机器人公司,为了更好地理解这个行业,我整理了一份中国机器人企业名单,包含200 多家企业,涵盖人形机器人、工业机器人、移动机器人、服务机器人、特种机器人等领域。 注:名单中的企业排序没有特殊含义,仅表示本人收集信息的先后顺序。 序号企业简称总部成立时间主营产品网址企业全称1优必选深圳2012年人形机器人、轮式机器人https://ubtrobot.com深圳市优必选科技股份有限公司2宇树科技杭州2016年四足机器狗、人形机器人https://unitree.com宇树科技股份有限公司3智元上海2023年四足、轮式、双足人形机器人、具身模型https://zhiyuan-robot.com智元创新(上海)科技股份有限公司4海康机器人杭州2016年机器视觉、移动机器人https://hikrobotics.com杭州海康机器人股份有限公司5傅利叶上海2015年康复机器人、双足人形机器人、灵巧手https://f

openclaw webUI 空白页问题

部分使用win10安装openclaw,可能会出现OpenClaw启动WebUi,什么也看不到,就显示Not Found,这是因为使用的pnpm或npm安装的,web-ui路径没有指定,新版的没有这个问题了。 如图 解决办法是手动配置we-ui路径 # 一般的安装路径如下: C:\Users\你的用户名\AppData\Roaming\npm\node_modules\openclaw\dist\control-ui 修改openclaw.json文件,添加以下参数 {"controlUi":{"root":"C:/Users/86135/AppData/Roaming/npm/node_modules/openclaw/dist/control-ui"},}

前端加密(常用加密方式及使用)

一. 什么是前端加密?(先纠正一个常见误区) 前端加密,指的是在浏览器(js环境)中,对数据进行加密/签名/混淆/校验等操作,再发送给后端 重要认知: 前端加密 ≠ 绝对安全 前端代码是可被查看,可被调试,可被篡改的.  所以前端加密的核心目的不是[防止高手],而是:  * 防止明文传输 * 防止低成本抓包,脚本刷接口 * 提高攻击门槛 * 与后端做配合校验 二 . 前端常见的加密[分类] 1. 哈希(不可逆) : (哈希也叫散列,是一种将任意长度的输入如数据,文件,消息)通过哈希函数转换成固定长度输出的过程,这个输出通常成为哈希值,散列值或摘要 用途:  1. 密码处理 2. 签名校验 3. 数据完整性校验 常见算法:  1. MD5(已不安全)

前端Bug修复专家:从现象到根因,再到测试闭环的SOP

引言:Bug 排查的“猜谜游戏” 作为一名前端工程师,你是否经历过这样的场景:测试人员扔过来一个 Bug 描述——“用户点了某个按钮后,页面就卡死了,偶尔复现,请尽快修复”。你打开代码,面对几百行业务逻辑,只能凭感觉加个 try-catch 或 setTimeout,推上去后却被告知“还是不行”。更令人头疼的是,某些问题只在 iOS Safari 上出现,某些问题需要快速连续点击才能复现。 这种“面向猜测编程”的排查方式,往往导致修复方案治标不治本,甚至引入新的 Bug。如何摆脱这种困境?今天,我想向大家介绍一套我从多年实战中总结出的前端缺陷诊断与修复专家技能(可以称之为 bugfix-expert),它不仅帮你“修好代码”,更帮你建立一套“现象 → 根因 → 修复 → 测试”的标准化作业程序(SOP)。 技能概述:不仅仅是修 Bug