NodeJS全栈开发面试题讲解——P6安全与鉴权

6.1 如何防止 SQL 注入 / XSS / CSRF?

面试官您好,Web 安全三大经典问题分别从不同层面入手:


🔸 SQL 注入(Server端)

原理:恶意用户将 SQL 注入查询语句拼接,导致数据泄露或破坏。

防御手段

  1. 使用 ORM / 预编译语句(PreparedStatement)

    • 如 Sequelize / Prisma / TypeORM 都默认使用参数化查询

  2. 不拼接 SQL 字符串

    • 坚决杜绝字符串拼接构造查询

  3. 对用户输入做严格校验(如白名单、正则)

✅ 示例(Sequelize ORM):

User.findOne({ where: { username: req.body.username } }); // 安全


🔸 XSS(跨站脚本攻击)

原理:用户输入恶意脚本插入页面,在其他用户浏览时触发执行。

防御手段

  1. 前端输出内容必须做转义(如 DOMPurify、Vue/React 默认做)

  2. 后端返回的数据也可二次 HTML encode

  3. 设置 CSP(内容安全策略)响应头

    Content-Security-Policy: default-src 'self'


🔸 CSRF(跨站请求伪造)

原理:攻击者诱导用户点击链接,悄悄向另一个站点发起请求。

防御手段

  1. 使用 SameSite Cookie 策略(推荐 SameSite=Strict)

  2. 使用 CSRF Token 校验(如 csurf 中间件)

  3. 对敏感操作用 POST,并验证 Referer 头来源


6.2 JWT 如何签发与验证?如何防止伪造?

JWT 是一种轻量的无状态认证方案,我在 NestJS 项目中用得很多。


🧩 JWT 签发过程:

  1. 用户登录成功后,服务端使用 私钥(或对称密钥) 生成 token:

    const token = jwt.sign({ uid: user.id }, SECRET_KEY, { expiresIn: '2h' });

  2. 客户端将 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 的算法,具备慢哈希特性,抗暴力破解。


🚨 防止暴力破解:

  1. IP / 用户名 尝试次数限制:如 5 分钟内登录失败 5 次封号

    • 可结合 Redis 实现计数

  2. 登录接口接入验证码(如图形验证码、滑动验证)

  3. 接入行为分析 / 登录地判断(如风控中台)


6.4 如何对文件上传做安全校验?

文件上传是黑客最容易钻空子的地方,需要严格限制上传内容和行为。


🛡️ 安全措施:

风险类型对策
恶意脚本文件限制 MIME 类型(白名单)、校验扩展名和真实类型
木马图片使用 file-typemime 判断内容头部
大文件拖垮服务器限制上传大小(如 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 项目中推荐使用 bcryptjsbcrypt 模块


加密流程:

const saltRounds = 10;
const hashedPwd = await bcrypt.hash(password, saltRounds);
  • 登录时使用 compare 方法比对:

const isMatch = await bcrypt.compare(inputPassword, storedHash);


其他备选算法(了解即可):

算法特点
SHA256不加盐容易被反查,已不推荐
Argon2更安全但较新,适合新系统使用
PBKDF2可以加盐、加轮次,银行业常用


✅ 总结回顾

编号问题要点简述
6.1SQL/XSS/CSRF 防护ORM 防注入、DOM转义防 XSS、CSRF Token + SameSite
6.2JWT 签发与校验签名加密、有效期、对称/非对称加密、避免暴露密钥
6.3登录暴破防护bcrypt 加密、IP 限制、验证码、行为识别
6.4文件上传安全检查 MIME 类型、文件大小、存储路径唯一、过滤木马
6.5密码加密算法选择推荐 bcrypt / argon2,使用盐值,严禁存储明文密码


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm error Cannot find module ‘negotiator‘ 的处理

本想运行npm create vuelatest,但提示: npm error code MODULE_NOT_FOUND npm error Cannot find module negotiator npm error Require stack: npm error - C:\Users\Administrator\AppData\Roaming\nvm\v18.16.1\node_modules\npm\node_modules\tuf-j…

Python爬虫:AutoScraper 库详细使用大全(一个智能、自动、轻量级的网络爬虫)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、AutoScraper概述1.1 AutoScraper介绍1.2 安装1.3 注意事项二、基本使用方法2.1 创建 AutoScraper 实例2.2 训练模型2.3 保存和加载模型2.4 数据提取方法2.5 自定义规则三、高级功能3.1 多规则抓取3.2 分页抓取3.3 代…

【Netty系列】解决TCP粘包和拆包:LengthFieldBasedFrameDecoder

目录 如何使用? 1. 示例代码(基于Netty) 2. 关键参数解释 3. 协议格式示例 4. 常见配置场景 场景1:长度字段包含自身 场景2:长度字段在消息中间 5. 注意事项 举个例子 完整示例:客户端与服务端交互…

哈尔滨工业大学提出ADSUNet—红外暗弱小目标邻帧检测新框架

ADSUNet: Accumulation-Difference-Based Siamese U-Net for inter-frame Infrared Dim and Small Target Detection 作者单位:哈尔滨工业大学空间光学工程研究中心 引用: Liuwei Zhang, Yuyang Xi, Zhipeng Wang, Wang Zhang, Fanjiao Tan, Qingyu Hou, ADSUNet: A…

Linux开发追踪(IMX6ULL篇_第一部分)

前言 参数:cortex-A7 698Mhz flash 8GB RAM 512M DDR3 2个100M网口 单核 初期: 一、安装完虚拟机之后,第一步先设置文件之间可以相互拷贝复制,以及通过CRT连接到虚拟机等 折磨死人了啊啊啊啊啊啊 1、关于SSH怎么安装…

【萌笔趣棋】网页五子棋项目测试报告

目录 一.项目介绍 (一)项目简介 (二)功能介绍 (三)页面展示 1.注册页面 2.登录页面 3.游戏大厅页面 4.游戏房间页面(对战) 二.功能测试 (一)出现的…

知识图谱增强的大型语言模型编辑

https://arxiv.org/pdf/2402.13593 摘要 大型语言模型(LLM)是推进自然语言处理(NLP)任务的关键,但其效率受到不准确和过时知识的阻碍。模型编辑是解决这些挑战的一个有前途的解决方案。然而,现有的编辑方法…

数据库,Spring Boot,数据源

您是对的,我之前的回答解释了Spring Boot在操作MySQL时不一定需要显式配置指定的数据源类型,因为它有自动配置机制,但没有直接点明在自动配置情况下“数据源是什么”。 在Spring Boot自动配置机制下,这个“数据源”指的是一个连接…

数据结构测试模拟题(3)

1、两个有序链表序列的合并 #include<bits/stdc.h> using namespace std;struct node{int num;node* next; };// 创建链表 node* CreatList(){int x;node *head new node(); // 创建头节点head->next NULL;node *tail head; // 尾指针初始指向头节点while…

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中&#xff0c;Val (Sgnl) 属性&#xff08;Value (Signaling)&#xff09;是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同&#xff0c;Val (Sgnl) 在修改控件值的同时强制生成值改变事件&#xff0c;确保程序逻辑与 UI 交互保持…

04.MySQL数据类型详解

MySQL数据类型详解 文章目录 MySQL数据类型数据类型分类数值类型 tinyint类型bit类型float类型decimal类型 字符串类型 char类型varchar类型char和varchar比较 时间日期类型enum和set类型数据类型选择的进阶技巧常见误区与解决方案性能优化与最佳实践 MySQL数据类型 数据类型…

Spring AI 之对话记忆(Chat Memory)

大型语言模型&#xff08;LLMs&#xff09;是无状态的&#xff0c;这意味着它们不会保留关于之前交互的信息。当想在多次交互中保持上下文或状态时&#xff0c;这可能会成为一个限制。为了解决这一问题&#xff0c;Spring AI 提供了对话记忆功能&#xff0c;允许你在与大型语言…

Hölder Statistical Pseudo Divergence Proper Hölder Divergence

目录 Hlder Statistical Pseudo DivergenceProper Hlder Divergence Hlder Statistical Pseudo Divergence Hlder Statistical Pseudo Divergence是一种度量两个概率分布 p p p 和 q q q差异的方法&#xff0c;它基于Hlder不等式。定义如下&#xff1a; D α H ( p : q ) 1 …

时序数据库IoTDB基于云原生的创新与实践

概述 Apache IoTDB 是一款独立自研的物联网时序数据库&#xff0c;作为 Apache 基金会的顶级项目&#xff0c;它融合了产学研的优势&#xff0c;拥有深厚的科研基底。IoTDB 采用了端边云协同的架构&#xff0c;专为物联网设计&#xff0c;致力于提供极致的性能。 数据模型 I…

git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)

1、定义&#xff1a;两个分支修改了同一文件的同一行代码&#xff0c;无法自动决定如何合并代码&#xff0c;需要人工干预的情况。&#xff08;假设A提交了文件a,此时B在未拉取代码的情况下&#xff0c;直接提交是会报错的&#xff0c;此时需要拉取之后再提交才会成功&#xff…

系统架构设计师(一):计算机系统基础知识

系统架构设计师&#xff08;一&#xff09;&#xff1a;计算机系统基础知识 引言计算机系统概述计算机硬件处理器处理器指令集常见处理器 存储器总线总线性能指标总线分类按照总线在计算机中所处的位置划分按照连接方式分类按照功能分类 接口接口分类 计算机软件文件系统文件类…

聊一聊接口测试中缓存处理策略

目录 一、强制绕过缓存 添加时间戳参数 修改请求头 二、主动清除缓存 清除本地缓存 清除服务端缓存&#xff08;需权限&#xff09; 清除CDN缓存 三、测试缓存逻辑 首次请求获取数据 记录响应头中的缓存标识​​​​​ 验证缓存生效 测试缓存过期​​​​​​​ 四…

机器学习算法-逻辑回归

今天我们用 「预测考试是否及格」 的例子来讲解逻辑回归&#xff0c;从原理到实现一步步拆解&#xff0c;保证零基础也能懂&#xff01; &#x1f3af; 例子背景 假设你是班主任&#xff0c;要根据学生的「学习时间」预测「是否及格」&#xff0c;手上有以下数据&#xff1a;…

【论文解读】CVPR2023 PoseFormerV2:3D人体姿态估计(附论文地址)

论文链接&#xff1a;https://arxiv.org/pdf/2303.17472 源码链接&#xff1a;https://github.com/QitaoZhao/PoseFormerV2 Abstract 本文提出了 PoseFormerV2&#xff0c;通过探索频率域来提高 3D 人体姿态估计的效率和鲁棒性。PoseFormerV2 利用离散余弦变换&#xff08;DC…

DRW - 加密市场预测

1.数据集描述 在本次比赛中&#xff0c;数据集包含加密市场的分钟级历史数据。您的挑战是预测未来的加密货币市场价格走势。这是一项kaggle社区预测竞赛&#xff0c;您可以以 CSV 文件的形式或通过 Kaggle Notebooks 提交您的预测。有关使用 Kaggle Notebooks 的更多详细信息&a…