前端常见安全问题 + 防御方法 + 面试回答

目录

  1. XSS(跨站脚本攻击)
  2. CSRF(跨站请求伪造)
  3. [SQL 注入](#SQL 注入)
  4. 文件上传漏洞
  5. 其他前端常见安全问题
  6. 面试常见问答

1. XSS(跨站脚本攻击)

定义

XSS(Cross-Site Scripting)是一种 通过注入恶意脚本执行非预期操作 的攻击。

分为三类:

  • 存储型:代码存储在数据库中,用户访问时执行(评论区、论坛)。
  • 反射型:代码通过 URL 参数返回执行。
  • DOM 型:前端 JS 动态插入数据时执行。

危害

  • 窃取 Cookie、Token,盗取用户身份。
  • 伪造请求(转账、发帖)。
  • 植入恶意脚本、广告、木马。

防御手段

  • 输入过滤 + 输出转义
  • CSP(Content Security Policy) 限制脚本来源。
  • HttpOnly Cookie,防止通过 JS 获取。
  • 前端框架(React/Vue)默认转义 HTML。

示例

❌ 漏洞代码
js 复制代码
document.body.innerHTML = location.search; 

访问:

复制代码
http://site.com?msg=<script>alert(1)</script>
✅ 安全代码
js 复制代码
document.body.textContent = location.search;

2. CSRF(跨站请求伪造)

定义

CSRF(Cross-Site Request Forgery)利用 用户已登录状态 ,诱导其访问恶意链接,伪造合法请求。

浏览器会自动带上用户 Cookie,从而冒充用户身份。


危害

  • 转账、盗刷。
  • 修改密码、邮箱。
  • 批量操作(删帖、发帖)。

防御手段

  1. CSRF Token 验证(每个请求附带随机 Token)。
  2. SameSite Cookie:阻止跨站请求携带 Cookie。
  3. 验证码 / 二次确认
  4. Referer / Origin 校验

示例

❌ 漏洞
html 复制代码
<img src="http://bank.com/transfer?to=attacker&amount=1000">
✅ 安全(CSRF Token)
html 复制代码
<form method="POST" action="/transfer">
  <input type="hidden" name="csrfToken" value="random123">
  <input name="to">
  <input name="amount">
  <button>提交</button>
</form>

3. SQL 注入

定义

SQL 注入是攻击者 在输入中注入恶意 SQL 代码,拼接后数据库直接执行。


危害

  • 绕过登录验证。
  • 窃取/篡改数据。
  • 删除数据库。

防御手段

  1. 参数化查询 / 预编译(Prepared Statement)
  2. 输入校验(过滤 ', --, ; 等特殊符号)。
  3. 最小权限(避免删库)。
  4. 使用 ORM 框架

示例

❌ 漏洞
js 复制代码
const sql = `SELECT * FROM users WHERE username='${username}' AND password='${password}'`;
db.query(sql);

输入:

复制代码
' OR '1'='1
✅ 安全
js 复制代码
const sql = 'SELECT * FROM users WHERE username=? AND password=?';
db.query(sql, [username, password]);

4. 文件上传漏洞

定义

文件上传漏洞是指:攻击者上传恶意文件(如 WebShell),服务器未严格校验,导致代码执行或 DoS 攻击


危害

  • 上传脚本木马,控制服务器。
  • 上传恶意文档,攻击用户。
  • 上传大文件,导致拒绝服务。

防御手段

  1. 白名单文件类型(校验扩展名 + MIME + 文件头)。
  2. 重命名文件(避免保留原始扩展名)。
  3. 存储到非 Web 目录
  4. 限制大小/数量
  5. 前端校验(次要)+ 后端强制校验(核心)

示例

❌ 漏洞
php 复制代码
if (substr($_FILES['file']['name'], -4) === ".jpg") {
    move_uploaded_file($_FILES['file']['tmp_name'], "/uploads/" . $_FILES['file']['name']);
}

攻击者上传 evil.php.jpg

✅ 安全(Node.js)
js 复制代码
const upload = multer({
  storage,
  fileFilter: (req, file, cb) => {
    const allowed = ['image/jpeg', 'image/png'];
    if (!allowed.includes(file.mimetype)) return cb(new Error('Invalid type'));
    cb(null, true);
  },
  limits: { fileSize: 1024 * 1024 * 2 }
});

5. 其他前端常见安全问题

5.1 点击劫持(Clickjacking)

  • 定义:攻击者在透明 iframe 中嵌套目标站点,引导用户点击。
  • 防御:X-Frame-Options: DENYContent-Security-Policy: frame-ancestors 'none';

5.2 敏感信息泄露

  • 问题:前端暴露 API Key、JWT、调试接口。

  • 防御:

    • 不在前端存储敏感信息。
    • 使用环境变量 + 后端代理。

5.3 依赖安全漏洞

  • 问题:前端依赖(npm 包)可能被注入恶意代码。

  • 防御:

    • 使用 npm audit/yarn audit
    • 锁定依赖版本。
    • 关注供应链安全(supply chain attack)。

6. 面试常见问答

Q1: 什么是 XSS?怎么防御?

  • 跨站脚本攻击,注入恶意 JS。
  • 危害:窃取 Cookie、执行恶意操作。
  • 防御:输入过滤 + 输出转义 + CSP + HttpOnly Cookie。

Q2: 什么是 CSRF?怎么防御?

  • 跨站请求伪造,利用用户 Cookie 发起伪造请求。
  • 防御:CSRF Token、SameSite Cookie、验证码、Referer 校验。

Q3: 什么是 SQL 注入?怎么防御?

  • 在输入中拼接 SQL 语句篡改数据库。
  • 防御:预编译、参数化查询、最小权限、ORM 框架。

Q4: 文件上传漏洞如何防御?

  • 白名单校验文件类型(MIME + 文件头)。
  • 上传后重命名,存储到非 Web 目录。
  • 限制大小和数量,多层校验。

Q5: 点击劫持如何防御?

  • 使用 X-Frame-OptionsCSP frame-ancestors
相关推荐
用泥种荷花12 分钟前
Python环境安装
前端
Light6022 分钟前
性能提升 60%:前端性能优化终极指南
前端·性能优化·图片压缩·渲染优化·按需拆包·边缘缓存·ai 自动化
Jimmy26 分钟前
年终总结 - 2025 故事集
前端·后端·程序员
烛阴28 分钟前
C# 正则表达式(2):Regex 基础语法与常用 API 全解析
前端·正则表达式·c#
roman_日积跬步-终至千里34 分钟前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
GIS之路1 小时前
GIS 数据转换:使用 GDAL 将 TXT 转换为 Shp 数据
前端
多看书少吃饭1 小时前
从Vue到Nuxt.js
前端·javascript·vue.js
前端一小卒1 小时前
从 v5 到 v6:这次 Ant Design 升级真的香
前端·javascript
yaoh.wang1 小时前
力扣(LeetCode) 88: 合并两个有序数组 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
前端不太难2 小时前
《Vue 项目路由 + Layout 的最佳实践》
前端·javascript·vue.js