NodeJS全栈开发口试题解说——P6安全与鉴权

[复制链接]
发表于 2025-7-1 20:04:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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):
  1. const hash = await bcrypt.hash(password, 10);
  2. const isMatch = await bcrypt.compare(inputPassword, hash);
复制代码


  • bcrypt 是基于 Blowfish 的算法,具备慢哈希特性,抗暴力破解。

🚨 防止暴力破解:


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

    • 可结合 Redis 实现计数

  • 登录接口接入验证码(如图形验证码、滑动验证)
  • 接入举动分析 / 登录地判定(如风控中台

6.4 怎样对文件上传做安全校验?

   文件上传是黑客最容易钻空子的地方,须要严酷限定上传内容和举动。
  
🛡️ 安全措施:

风险类型对策恶意脚本文件限定 MIME 类型(白名单)、校验扩展名和真实类型木马图片利用 file-type 或 mime 判定内容头部大文件拖垮服务器限定上传巨细(如 5MB)路径穿越攻击不允许用户自定义文件路径;同一保存在 sandbox文件名注入生成唯一名(如 UUID),制止原始文件名冲突

✅ 示例(NestJS 文件上传验证):

  1. @UseInterceptors(FileInterceptor('file', {
  2.   fileFilter(req, file, cb) {
  3.     const isImage = file.mimetype.startsWith('image/');
  4.     cb(null, isImage);
  5.   },
  6.   limits: { fileSize: 5 * 1024 * 1024 }, // 限 5MB
  7. }))
复制代码

6.5 怎样加密用户密码?用什么算法?

   用户密码必须做 不可逆加密(单向散列)并加盐。
  
推荐算法:bcrypt(或 argon2)



  • bcrypt 是加盐 + 慢哈希算法(抗彩虹表 + 抗暴力破解)
  • NestJS 和 Express 项目中推荐利用 bcryptjs 或 bcrypt 模块

加密流程:

  1. const saltRounds = 10;
  2. 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 + SameSite6.2JWT 签发与校验署名加密、有效期、对称/非对称加密、制止袒露密钥6.3登录暴破防护bcrypt 加密、IP 限定、验证码、举动识别6.4文件上传安全检查 MIME 类型、文件巨细、存储路径唯一、过滤木马6.5密码加密算法选择推荐 bcrypt / argon2,利用盐值,严禁存储明文密码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

快速回复 返回顶部 返回列表