跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptNode.js大前端

前端安全实战:密码存储、XSS 及 CSRF 防护策略

前端安全实战涵盖密码传输加密、XSS 跨站脚本攻击防护、CSRF 跨站请求伪造防御及依赖包漏洞管理。核心措施包括使用 HTTPS 协议、通过 httpOnly Cookie 存储 Token、对用户输入进行转义处理、实施 CSRF Token 验证机制以及定期执行 npm audit 检查依赖漏洞。开发者应避免明文存储敏感信息,结合前后端协同防护,构建安全的 Web 应用环境。

协议工匠发布于 2026/4/9更新于 2026/5/2113 浏览

前端安全实战:密码存储、XSS 及 CSRF 防护策略

安全警示

代码存在漏洞将导致严重的安全风险。

前端安全至关重要,忽视安全如同在开放环境中存放贵重物品。

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

最近看到一个项目,直接在前端存储用户密码,没有任何加密措施。

反面案例
// 反面案例:不安全的代码
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

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

目录

  1. 前端安全实战:密码存储、XSS 及 CSRF 防护策略
  2. 安全警示
  3. 为什么你需要关注前端安全
  4. 反面案例
  5. 正确姿势
  6. 1. 密码安全
  7. 2. XSS 防护
  8. 3. CSRF 防护
  9. 4. 依赖安全
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Vue 响应式数据失效原理与工程实践
  • AI日报 - 2026年03月31日
  • Gemini in Chrome 功能介绍与使用配置指南
  • 基于 MAI-UI-8B 实现 Android UI 自动化:从元素定位到多步导航
  • Win10 升级后频繁弹出 Copilot 窗口?彻底禁用与关闭方法
  • Java WebP 图像处理与高效压缩技术
  • OpenAI Whisper 模型版本对照与官方下载链接
  • GPT、LLaMA 与 MOE:自回归模型与混合专家架构演进
  • Web 开发者实战:多模态 Agent 图像识别与全栈处理方案
  • C 语言多线程与并发编程:提高程序执行效率
  • GitHub Copilot vs Cursor vs Codeium 对比与选择指南
  • 程序员进阶指南:精选在线学习、兼职与交流平台汇总
  • 基于 IPIDEA API 的 eBay 商品数据 Python 采集实战
  • 利用 DeepSeek 提示词与工具降低论文 AIGC 检测率实战
  • 零基础与其他行业转行是否适合学习 Python
  • 前端监控:别让你的应用在黑暗中运行
  • 计算机视觉基础与实战应用指南
  • C++ 毕达哥拉斯四元组检测算法
  • Go 语言零基础入门核心知识点详解
  • ESP-Drone 开源无人机平台 5 步快速入门

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online