NodeJS全栈开发面试题讲解——P6安全与鉴权
✅ 6.1 如何防止 SQL 注入 / XSS / CSRF?
面试官您好,Web 安全三大经典问题分别从不同层面入手:
🔸 SQL 注入(Server端)
原理:恶意用户将 SQL 注入查询语句拼接,导致数据泄露或破坏。
防御手段:
-
使用 ORM / 预编译语句(PreparedStatement)
-
如 Sequelize / Prisma / TypeORM 都默认使用参数化查询
-
-
不拼接 SQL 字符串
-
坚决杜绝字符串拼接构造查询
-
-
对用户输入做严格校验(如白名单、正则)
✅ 示例(Sequelize ORM):
User.findOne({ where: { username: req.body.username } }); // 安全
🔸 XSS(跨站脚本攻击)
原理:用户输入恶意脚本插入页面,在其他用户浏览时触发执行。
防御手段:
-
前端输出内容必须做转义(如 DOMPurify、Vue/React 默认做)
-
后端返回的数据也可二次 HTML encode
-
设置 CSP(内容安全策略)响应头:
Content-Security-Policy: default-src 'self'
🔸 CSRF(跨站请求伪造)
原理:攻击者诱导用户点击链接,悄悄向另一个站点发起请求。
防御手段:
-
使用 SameSite Cookie 策略(推荐 SameSite=Strict)
-
使用 CSRF Token 校验(如
csurf
中间件) -
对敏感操作用 POST,并验证 Referer 头来源
✅ 6.2 JWT 如何签发与验证?如何防止伪造?
JWT 是一种轻量的无状态认证方案,我在 NestJS 项目中用得很多。
🧩 JWT 签发过程:
-
用户登录成功后,服务端使用 私钥(或对称密钥) 生成 token:
const token = jwt.sign({ uid: user.id }, SECRET_KEY, { expiresIn: '2h' });
-
客户端将 token 存储于:
-
安全性优先:HttpOnly Cookie
-
灵活性优先:localStorage(要防 XSS)
-
🧩 验证 token:
后端中间件提取请求头中的 token 并使用相同密钥解码:
jwt.verify(token, SECRET_KEY);
❗防止伪造方法:
-
密钥不能泄露,必须使用 非对称加密(如 RS256) 或强对称密钥
-
建议使用 JWT 的 签发者(iss)和用途(aud) 字段限制滥用
-
设置合理的过期时间(短 token + 刷新机制)
✅ 6.3 登录接口如何防止暴力破解?加密算法用什么?
登录接口是攻击高发点,我从「加密、频率限制、验证码」三方面防护:
🔒 密码加密:
-
使用 bcrypt 加密(推荐 10 ~ 12 轮 salt):
const hash = await bcrypt.hash(password, 10);
const isMatch = await bcrypt.compare(inputPassword, hash);
-
bcrypt 是基于 Blowfish 的算法,具备慢哈希特性,抗暴力破解。
🚨 防止暴力破解:
-
IP / 用户名 尝试次数限制:如 5 分钟内登录失败 5 次封号
-
可结合 Redis 实现计数
-
-
登录接口接入验证码(如图形验证码、滑动验证)
-
接入行为分析 / 登录地判断(如风控中台)
✅ 6.4 如何对文件上传做安全校验?
文件上传是黑客最容易钻空子的地方,需要严格限制上传内容和行为。
🛡️ 安全措施:
风险类型 | 对策 |
---|---|
恶意脚本文件 | 限制 MIME 类型(白名单)、校验扩展名和真实类型 |
木马图片 | 使用 file-type 或 mime 判断内容头部 |
大文件拖垮服务器 | 限制上传大小(如 5MB) |
路径穿越攻击 | 不允许用户自定义文件路径;统一保存在 sandbox |
文件名注入 | 生成唯一名(如 UUID),避免原始文件名冲突 |
✅ 示例(NestJS 文件上传验证):
@UseInterceptors(FileInterceptor('file', {fileFilter(req, file, cb) {const isImage = file.mimetype.startsWith('image/');cb(null, isImage);},limits: { fileSize: 5 * 1024 * 1024 }, // 限 5MB
}))
✅ 6.5 如何加密用户密码?用什么算法?
用户密码必须做 不可逆加密(单向散列)并加盐。
推荐算法:bcrypt(或 argon2)
-
bcrypt 是加盐 + 慢哈希算法(抗彩虹表 + 抗暴力破解)
-
NestJS 和 Express 项目中推荐使用
bcryptjs
或bcrypt
模块
加密流程:
const saltRounds = 10;
const hashedPwd = await bcrypt.hash(password, saltRounds);
-
登录时使用
compare
方法比对:
const isMatch = await bcrypt.compare(inputPassword, storedHash);
其他备选算法(了解即可):
算法 | 特点 |
---|---|
SHA256 | 不加盐容易被反查,已不推荐 |
Argon2 | 更安全但较新,适合新系统使用 |
PBKDF2 | 可以加盐、加轮次,银行业常用 |
✅ 总结回顾
编号 | 问题 | 要点简述 |
---|---|---|
6.1 | SQL/XSS/CSRF 防护 | ORM 防注入、DOM转义防 XSS、CSRF Token + SameSite |
6.2 | JWT 签发与校验 | 签名加密、有效期、对称/非对称加密、避免暴露密钥 |
6.3 | 登录暴破防护 | bcrypt 加密、IP 限制、验证码、行为识别 |
6.4 | 文件上传安全 | 检查 MIME 类型、文件大小、存储路径唯一、过滤木马 |
6.5 | 密码加密算法选择 | 推荐 bcrypt / argon2,使用盐值,严禁存储明文密码 |
相关文章:
NodeJS全栈开发面试题讲解——P6安全与鉴权
✅ 6.1 如何防止 SQL 注入 / XSS / CSRF? 面试官您好,Web 安全三大经典问题分别从不同层面入手: 🔸 SQL 注入(Server端) 原理:恶意用户将 SQL 注入查询语句拼接,导致数据泄露或破坏…...
C# 密封类和密封方法
密封(sealed)是C#中用于限制继承和多态行为的关键字,它可以应用于类和方法,提供了一种控制继承层次的方式。 密封类 特点 使用 sealed 关键字修饰的类密封类不能被其他类继承,但可以继承其他类或接口主要用于防止派生所有结构(struct)都是…...
为什么badmin reconfig以后始终不能提交任务
最近遇到的怪事:修改了openlava配置以后运行badmin reconfig激活配置变更,但是长时间始终不能提交任务。 首先查看进程,发现openlava管理节点上的所有服务进程都在运行状态;查看mbd日志没有发现错误信息;再看mbd进程的…...

解决Window10上IP映射重启失效的问题
问题 在实际网络搭建过程中,大家有可能会遇到在局域网范围内,在自己本机上搭建一个网站或者应用时,其他设备通过本机的IP地址无法访问的问题,这个问题可以通过设置IP映射来解决,但是通过netsh interface命令设置的IP映射…...
力扣刷题(第四十四天)
灵感来源 - 保持更新,努力学习 - python脚本学习 删除重复的电子邮箱 解题思路 这个问题要求我们删除表中所有重复的电子邮箱,只保留每个唯一电子邮箱对应的最小id记录。解决这个问题的关键在于识别出哪些记录是重复的,并确定需要删除的…...
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 是 MyBatis 的增强工具,旨在简化开发、提高效率并保持 MyBatis 的灵活性。本文将详细介绍 MyBatis-Plus 的高级用法,帮助开发者最优化持久层开发。 一、MyBatis-Plus 简介 MyBatis-Plus 是一个 ORM 框架,提供了 CRUD 接口、条…...
c++之循环
目录 C循环结构完全解析:从基础到实战应用 一、for循环结构 二、while循环结构 三、do-while循环结构 四、范围for循环(C11) 五、循环控制语句 C循环结构完全解析:从基础到实战应用 循环结构是编程语言的核心控制结构之一&a…...

python h5py 读取mat文件的<HDF5 object reference> 问题
我用python加载matlab的mat文件 mat文件: 加载方式: mat_file h5py.File(base_dir str(N) _nodes_dataset_snr- str(snr) _M_ str(M) .mat, r) Signals mat_file["Signals"][()] Tp mat_file["Tp"][()] Tp_list mat_fil…...

linux命令 systemctl 和 supervisord 区别及用法解读
目录 基础与背景服务管理范围配置文件和管理方式监控与日志依赖管理适用场景常用命令对照表实际应用场景举例优缺点对比小结参考链接 1. 基础与背景 systemctl 和 supervisord 都是用于管理和控制服务(进程)的工具,但它们在设计、使用场景和…...

Spring Boot + MyBatis 实现的简单用户管理项目的完整目录结构示例
📁 示例项目结构(基于 Maven) user-management/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/usermanagement/ │ │ │ ├── controller/ │ │ │ │ └── UserC…...
NodeJS全栈开发面试题讲解——P5前端能力(React/Vue + API调用)
✅ 5.1 如何使用 React/Vue 发起后端请求?用什么库? 面试官您好,在实际项目中我们通常使用 axios、fetch 或框架提供的封装库发起后端请求。 🔧 常用库对比: 库框架适配优点axios通用默认支持拦截器、取消请求、请求体…...
[001]从操作系统层面看锁的逻辑
从操作系统层面,锁 (Lock) 是一种同步机制,用于控制多个线程或线程对共享资源的访问,防止竞态条件(race condition).常见的锁包括互斥锁(mutex)、读写锁(read-write lock)、自旋锁(spinlock)等。…...
初识 Pytest:测试世界的智能助手
概述 在编写程序的过程中,我们常常需要确认代码是否按照预期工作。为了提高效率并减少人为错误,我们可以借助工具来帮助我们完成这一过程。Pytest 就是这样一个用于编写和运行测试的 Python 工具。 什么是 Pytest? Pytest 是一个用于 Pyth…...

stm32 + ads1292心率检测报警设置上下限
这个项目是在做心率检测的时候一个小伙伴提出来的,今年五一的时候提出来的想法,五一假期的时候没时间,也没心情做这个,就把这个事情搁置了,在月中做工作计划的时候,就把这个小项目排进来了,五一…...

项目练习:element ui 的icon放在button的右侧
文章目录 一、需求描述二、左侧实现三、右侧实现 一、需求描述 我们知道,element ui的button一般都会配置一个icon 这个icon默认是放在左侧的。 如何让它放在右侧了? 二、左侧实现 <el-buttontype"primary"plainicon"el-icon-d-arr…...

性能诊断工具AWR配置策略与报告内容解析
AWR(Automatic Workload Repository)是 Oracle 数据库中的一个重要性能诊断工具。AWR 会按照固定的时间间隔自动收集数据库系统的性能统计信息。这些信息涵盖了数据库运行状态的方方面面,像SQL 执行情况、系统资源利用率、等待事件等。AWR抓取…...

Tailwind CSS 实战,基于 Kooboo 构建 AI 对话框页面(三):实现暗黑模式主题切换
基于前两篇的内容,为页面添加主题切换功能,实现网站页面的暗黑模式: Tailwind css实战,基于Kooboo构建AI对话框页面(一)-CSDN博客 Tailwind css实战,基于Kooboo构建AI对话框页面(…...
OleDbParameter.Value 与 DataTable.Rows.Item.Value 的性能对比
OleDbParameter.Value 与 DataTable.Rows.Item.Value 的性能对比 您提到的两种赋值操作属于不同场景,它们的性能和稳定性取决于具体使用方式。下面从几个维度进行分析: 1. 操作本质对比 (1)OleDbParameter.Value 用途…...
Unity3D ET框架游戏脚本系统解析
前言 ET框架在Unity3D中实现的GamePlay脚本系统是一种革命性的、基于ECS(实体-组件-系统)架构的设计,它彻底改变了传统的基于MonoBehaviour的游戏逻辑编写方式。其核心思想是追求高性能、高解耦、易热更新,特别适合大型复杂的网络…...
函数的定义、调用、值传递、声明、非安全函数
函数 函数(英文“function”)把一些经常用到的代码封装起来,这样可以减少一些冗余代码、重复的代码。一个大的程序,它是由很多很多程序块组成的,每个模块实现一个特定的功能。 函数的定义 格式 英文版 return_typ…...

MySQL 8.0 OCP 英文题库解析(十一)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题91~100 试题91…...
机器学习算法-k-means
今天我们用 「超市顾客分组」 的例子来讲解K-means算法,从原理到实现一步步拆解,保证零基础也能懂! 🛒 例子背景 假设你是超市经理,手上有顾客的以下数据: 顾客ID每月消费金额(元)…...

ADQ36-2通道2.5G,4通道5G采样PXIE
ADQ36是一款高端12位四通道灵活数据采集板,针对高通道数科学应用进行了优化。ADQ36具有以下特性: 4 / 2模拟输入通道每通道2.5 / 5 GSPS7gb/秒的持续数据传输速率两个外部触发器通用输入/输出(GPIO)ADQ36数字化仪包括固件FWDAQ ADQ36简介 特…...
LLM:decoder-only 思考
文章目录 前言一、KV-cache1、为什么使用KV-cache2、KV-cache的运作原理 二、Decoder-only VS Encoder-Decoder1、Decoder-only2、Encoder-Decoder 三、Causal LM VS PrefixLM总结 前言 decoder-only模型是目前大模型的主流架构,由于OpenAI勇于挖坑踩坑,…...

数字创新智慧园区建设及运维方案
该文档是 “数字创新智慧园区” 建设及运维方案,指出传统产业园区存在管理粗放等问题,“数字创新园区” 通过大数据、AI、物联网、云计算等数字化技术,旨在提升园区产业服务、运营管理水平,增强竞争力,实现绿色节能、高效管理等目标。建设内容包括智能设施、核心支撑平台、…...

【科研绘图系列】R语言绘制森林图(forest plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息介绍 本文介绍使用R语言绘制森林图(forest plot)的方法。首先加载必要的R包(grid、forestploter、openxlsx、stringr),导入并预处…...
Springcloud Alibaba自定义负载均衡详解
主要说一下springcloud alibaba 在使用nacos注册中心过程中,请求服务负载均衡的配置方法 引入依赖包 这个依赖包是springcloud在新版本的负载均衡实现,2020版本以上 <dependency><groupId>org.springframework.cloud</groupId><ar…...
深度学习---负样本训练
一、负样本的本质与核心作用 1. 定义与范畴 负样本(Negative Sample)是与目标样本(正样本)在语义、特征或任务目标上存在显著差异的样本。其核心价值在于通过对比学习引导模型学习样本间的判别性特征,而非仅记忆正样本…...

SpringAI+DeepSeek大模型应用开发实战
内容来自黑马程序员 这里写目录标题 认识AI和大模型大模型应用开发模型部署方案对比模型部署-云服务模型部署-本地部署调用大模型什么是大模型应用传统应用和大模型应用大模型应用 大模型应用开发技术架构 SpringAI对话机器人快速入门会话日志会话记忆 认识AI和大模型 AI的发…...
【Python Cookbook】文件与 IO(一)
文件与 IO(一) 1.读写文本数据2.打印输出至文件中3.使用其他分隔符或行终止符打印4.读写字节数据5.文件不存在才能写入 1.读写文本数据 你需要读写各种不同编码的文本数据,比如 ASCII,UTF-8 或 UTF-16 编码等。 使用带有 rt 模式…...