前端开发必须知道的网络安全防护指南

更新日期: 2025-11-27 阅读: 12 标签: 安全

作为前端开发者,我们每天都要处理用户输入、与后端交互、操作页面元素。我们是网站安全的第一道防线。如果前端安全工作没做好,用户的个人信息、登录凭证都可能被攻击者窃取。

今天我们来聊聊前端开发中最常见的几种网络攻击,以及怎么防范它们。


跨站脚本攻击(XSS) - 最常见的前端威胁

XSS攻击就是攻击者把恶意代码注入到网页中,当其他用户访问这个网页时,恶意代码就会在他们的浏览器里执行。

XSS的三种类型

1. 存储型XSS

  • 恶意代码被永久保存在服务器上,比如数据库里的用户评论

  • 每个访问这个页面的用户都会受到影响

  • 危害范围最大

2. 反射型XSS

  • 恶意代码作为请求的一部分发送到服务器,然后立刻在页面响应中执行

  • 通常通过URL参数传递

  • 需要诱骗用户点击恶意链接

3. dom型XSS

  • 完全在浏览器端发生,不经过服务器

  • 通过不安全的DOM操作引入恶意代码

如何防范XSS攻击

对用户输入进行严格检查

// 不好的做法 - 直接使用用户输入
document.getElementById('content').innerhtml = userInput;

// 好的做法 - 使用textContent
document.getElementById('content').textContent = userInput;

// 或者对HTML进行转义
function escapeHtml(text) {
  const div = document.createElement('div');
  div.textContent = text;
  return div.innerHTML;
}

// 使用转义后的内容
element.innerHTML = escapeHtml(userInput);

处理富文本内容
如果需要允许用户输入HTML,使用白名单过滤:

// 使用DOMPurify库净化HTML
import DOMPurify from 'dompurify';

const cleanHtml = DOMPurify.sanitize(userHtml, {
  ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a'],
  ALLOWED_ATTR: ['href', 'title']
});

设置内容安全策略(CSP)
在HTTP响应头中添加:

text
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'

这个策略告诉浏览器:

  • 只能加载同源的资源

  • 只能执行同源的JavaScript

  • 样式可以来自同源或内联样式

使用现代前端框架
reactvue等框架默认会对动态内容进行转义,但要注意:

jsx
// 危险 - 这会绕过React的XSS保护
<div dangerouslySetInnerHTML={{__html: userContent}} />

// 安全 - React会自动转义
<div>{userContent}</div>


跨站请求伪造(CSRF) - 冒充用户操作

CSRF攻击的原理是:用户登录了A网站后,在没有退出的情况下去访问恶意网站B。B网站伪造一个指向A网站的请求,利用浏览器会自动携带A网站Cookie的机制,让用户在不知情的情况下执行操作(比如转账)。

如何防范CSRF攻击

使用CSRF Token
这是最有效的方法。服务器生成一个随机的Token,前端在每次请求时携带这个Token。

// 从meta标签获取Token
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

// 发送请求时在header中携带
fetch('/api/transfer-money', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-CSRF-Token': csrfToken
  },
  body: JSON.stringify({
    amount: 100,
    to: 'account123'
  })
});

后端代码示例(Node.js):

// 生成CSRF Token
app.use((req, res, next) => {
  res.locals.csrfToken = generateCSRFToken();
  next();
});

// 验证CSRF Token
app.post('/api/*', (req, res, next) => {
  const clientToken = req.headers['x-csrf-token'];
  const serverToken = req.session.csrfToken;
  
  if (!clientToken || clientToken !== serverToken) {
    return res.status(403).json({ error: 'CSRF token validation failed' });
  }
  next();
});

设置SameSite Cookie属性

// 服务器设置Cookie时
Set-Cookie: sessionId=abc123; SameSite=Lax; Secure
  • SameSite=Strict:完全禁止跨站发送Cookie

  • SameSite=Lax:在安全的导航中允许发送Cookie(推荐)

  • SameSite=None:允许跨站发送,但必须同时设置Secure


点击劫持 - 视觉欺骗攻击

攻击者用一个透明iframe覆盖在诱骗页面上,用户以为点击的是页面上的按钮,实际上点击的是隐藏页面里的敏感操作。

防范点击劫持

设置HTTP响应头

// 完全禁止被嵌入到iframe中
X-Frame-Options: DENY

// 或者只允许同源网站嵌入
X-Frame-Options: SAMEORIGIN

// 使用更现代的CSP方式
Content-Security-Policy: frame-ancestors 'none';


第三方依赖安全 - 供应链攻击

我们项目中使用的大量npm包可能包含漏洞,攻击者可能利用这些漏洞入侵我们的网站。

保护措施

使用子资源完整性(SRI)
对于从CDN引入的脚本,添加integrity属性:

<script 
  src="https://cdn.example.com/vue.js"
  integrity="sha384-xxxxx"
  crossorigin="anonymous">
</script>

浏览器会检查文件哈希值,如果不匹配就拒绝执行。

管理npm依赖

# 定期检查漏洞
npm audit

# 自动修复可修复的漏洞
npm audit fix

# 使用安全工具
npx snyk test

锁定依赖版本
确保使用package-lock.json或yarn.lock,避免安装不确定版本的依赖。


前端安全开发清单

数据传输安全

  • 全站使用HTTPS

  • 设置HSTS头强制使用HTTPS

  • 敏感信息绝不硬编码在前端代码中

数据存储安全

// 不安全 - 在localStorage存储敏感信息
localStorage.setItem('token', 'secret-token');

// 相对安全 - 使用sessionStorage,会话结束就清除
sessionStorage.setItem('userPrefs', JSON.stringify(prefs));

// 最安全 - 使用HttpOnly Cookie,JavaScript无法访问

输入输出处理

// 客户端验证(用户体验)
function validateEmail(email) {
  const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return re.test(email);
}

// 但记住:后端验证才是真正的保障

错误处理

// 不安全 - 显示详细错误信息
app.use((err, req, res, next) => {
  res.status(500).send(`Error: ${err.stack}`);
});

// 安全 - 显示友好错误页面
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('抱歉,服务器出了点问题');
});

持续学习与代码审查

  • 定期学习新的安全威胁

  • 在代码审查中重点关注安全问题

  • 使用自动化安全扫描工具


实际项目中的安全实践

1. 表单安全处理

class SecureForm {
  constructor(formId) {
    this.form = document.getElementById(formId);
    this.setupValidation();
  }
  
  setupValidation() {
    this.form.addEventListener('submit', (e) => {
      e.preventDefault();
      if (this.validate()) {
        this.submit();
      }
    });
  }
  
  validate() {
    const inputs = this.form.querySelectorAll('input, textarea');
    for (let input of inputs) {
      if (!this.sanitizeInput(input.value, input.type)) {
        this.showError(input, '包含不安全的字符');
        return false;
      }
    }
    return true;
  }
  
  sanitizeInput(value, type) {
    // 根据输入类型进行不同的清理
    switch(type) {
      case 'email':
        return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
      case 'text':
        return !/[<>]/.test(value); // 禁止HTML标签
      default:
        return true;
    }
  }
}

2. 安全的API调用

class SecureAPI {
  constructor() {
    this.baseURL = '/api';
    this.csrfToken = this.getCSRFToken();
  }
  
  async request(endpoint, options = {}) {
    const url = `${this.baseURL}${endpoint}`;
    
    const config = {
      headers: {
        'Content-Type': 'application/json',
        'X-CSRF-Token': this.csrfToken,
        ...options.headers
      },
      credentials: 'same-origin', // 不发送跨站Cookie
      ...options
    };
    
    try {
      const response = await fetch(url, config);
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }
      return await response.json();
    } catch (error) {
      console.error('API request failed:', error);
      throw error;
    }
  }
  
  getCSRFToken() {
    return document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '';
  }
}


总结

前端安全不是可选项,而是必选项。记住这几个核心原则:

  1. 永远不要信任用户输入 - 对所有输入进行检查和转义

  2. 实施深度防御 - 不要依赖单一安全措施

  3. 保持更新 - 定期更新依赖和学习新的安全知识

  4. 与后端配合 - 前端安全需要前后端共同努力

安全是一个持续的过程,不是一次性的任务。每次写代码时都要想着:如果我是攻击者,会怎么攻击这个功能?用这种思路来开发,你的网站就会安全很多。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13218

Web前端安全同样不可忽视,编写前端代码时保持安全意识

随着网络的普及,黑客进行网络攻击的手段越来也多,越来越复杂。前端的HTML、JavaScript、CSS、Flash等技术变成了前端攻击者和开发者的战场,网站安全问题也开始向前端倾斜。

AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。

AJAX请求真的不安全么?AJAX请求哪里不安全?怎么样让AJAX请求更安全?本文包含的内容较多,包括AJAX,CORS,XSS,CSRF等内容,要完整的看完并理解需要付出一定的时间。

第三方 CSS 并不安全

第三方内容在其沙箱区域内具有强大的能力。如果你担心恶意用户诱使你的网站加载第三方资源,可以通过 CSP 用作防护手段,其可以限制加载图片,脚本和样式的来源。

WEB应用程序安全检查列表

检查页面隐藏或丢失的内容:检查webserver元数据文件,如:robots.txt, sitemap.xml,.DS_Store, .htaccess,检查搜索功能可能的注入或攻击方式,检查不同agent代理访问网站显示内容的是否一致

利用CSS注入(无iFrames)窃取CSRF令牌

要做到无iFrame,我将使用一种类似于之前我讨论过的方法:我将创建一个弹窗,然后在设置计时器后更改弹出窗口的位置。使用这种方法,我仍然可以加载受害者的CSS,但我不再依赖于受害者是否允许iFrame。

30 分钟理解 CORB 是什么

我当前的 chrome 版本是 v68,如果是 v66 或更低版本可能提示的警告信息略有不同。印象中只对 CORS 比较熟悉,CORB 是个什么鬼?好奇心迫使我想要了解一下它到底是什么,于是暂时把手头工作放下查了一些资料并花时间汇总了一下,就有了这篇文章

谈 target=‘_blank’的安全问题

大家都喜欢target=_blank, 因为新页面打开不影响原来的页面。但是这个存在安全问题, 由target=_blank打开的页面, 可以通过window.opener访问原来的窗口。遍可以简单的将网页导航到其他网站, 这就存在很多的安全隐患了, 比如钓鱼,这种问题解决起来也很简单, 在链接中加入rel=noreferrer noopener属性就可以了

Web安全测试检查单

Web安全测试检查单。上传功能:绕过文件上传检查功能,上传文件大小和次数限制。注册功能:注册请求是否安全传输,注册时密码复杂度是否后台检验,激活链接测试

一些安全相关的HTTP header

HTTP Strict-Transport-Security,简称为HSTS。X-Frame-Options:是否允许一个页面可在<frame>、<iframe>、<object>中展现的标记。X-XSS-Protection作用:防范XSS攻击。

第三方CSS安全吗?

第三方内容在其沙箱中具有很高的影响力。 虽然图像或沙盒iframe有着非常小的沙箱,但脚本和样式的作用范围却影响你的整个页面,甚至是整个站点。如果你担心用户会欺骗你的网站去加载第三方资源,可以使用CSP(内容安全策略)保证安全

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!