【Node.js实战】一文带你开发博客项目之安全(sql注入、xss攻击、md5加密算法)

本文涉及的产品
RDS AI 助手,专业版
RDSClaw,2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 【Node.js实战】一文带你开发博客项目之安全(sql注入、xss攻击、md5加密算法)

一、前言

前面,我们使用原生 nodejs 已经大体完成了 myblog 的项目,下面我们来学习一下如何为我们项目的安全保驾护航…


sql注入:窃取数据库内容

XSS攻击:窃取前端的 cookie 内容

密码加密:保障用户信息安全(重要!)

我们只关注通过 web server (nodejs)层面预防

二、安全

1、sql 注入攻击

  • 最原始、最简单的攻击,从有了 web2.0 就有了 sql 注入攻击
  • 攻击方式:输入一个 sql 片段,最终拼接成一段攻击代码
  • 预防措施:使用 mysql 的 escape 函数处理输入内容

4a0622f1c11046ceb7d8e94dfc2d1147.png

修改 ./db/mysql.js 文件的导出内容

mysql.js

module.exports = {
    exec,
    escape: mysql.escape
}

修改 ./controller/user.js 文件的内容

user.js

引入的模块加上 escape,用户名和密码前面也要加上 escape,然后就是 sql 语句中 ${} 的引号去掉

// 改变
const { exec, escape } = require('../db/mysql')
// 登录(通过用户名和密码)
const login = (username, password) => {
    // 改变
    username = escape(username)
    password = escape(password)
    // 改变
    const sql = `
    select username, realname from users where username=${username} and password=${password}
    `
    console.log('sql is', sql)
    return exec(sql).then(rows => {
        return rows[0] || {}
    })
}
// 导出共享
module.exports = {
    login
}

至此,即可解决 sql 注入的问题…


2、xss 攻击

攻击方式:在页面展示内容中掺杂 js 代码,以获取网页信息

预防措施:转换生成 js 的特殊字符

当我们不进行 xxs 攻击预防时,比如:在创建博客的输入框中输入 <script>alert(1)</script>,则会执行

4c15d9a53fbf40b8a459a69cd2194212.png

faf87764e4db4a6ea3ffef9726652d1c.png

6eb7d390da69451897d4784c0b51b820.png

那么我们怎么解决呢?首先,安装 xxs 工具

npm i xxs

之后修改 .controller/blog.js 文件的代码

blog.js

导入 xss,并且使用到 title 中

const xss = require('xss')
...
const newBlog = (blogData = {}) => {
    // blogData 是一个博客对象,包含 title content author 属性
    const title = xss(blogData.title)
    ...
}

55bf56fec59849aeb4dcd3e7e261178f.png

93ed927e8c8a4031826d572f6822e23e.png

3、加密算法

  • 万一数据库被用户攻破,最不应该泄露的就是用户信息
  • 攻击方式:获取用户名和密码,再去尝试登录其他系统(因为不少人的密码会重复使用到不同的地方)
  • 预防措施:将密码加密,即便拿到密码也不知道明文
  • 77bd50badd854db29cd60eadbe146b71.png
  • 那么我们怎么来解决呢?—— 使用 nodejs 提供的 crypto 库

在 utils.js 文件中新建 cryp.js 文件,进行加密算法

2bd7168272034ca1943b2fe6abecc293.png

crpy.js

我们使用 md5 加密(一种加密方式)

// 加密库
const crypto = require('crypto')
// 密匙(一把钥匙,密码和钥匙一块加密)
const SECRET_KEY = 'Zahuopu_2023#'
// md5 加密(一种加密方式)
function md5(content) {
    // 创建 md5 加密
    let md5 = crypto.createHash('md5')
    // 以 16进制的形式返回输入内容的加密结果
    return md5.update(content).digest('hex')
}
// 加密函数
function genPassword(password) {
    // 字符串要包含 password 和 SECRET_KEY
    const str = `password=${password}&key=${SECRET_KEY}`
    return md5(str)
}
const result = genPassword('123')
console.log(result)

84e93b91158c44519d00b3ef94351be4.png

d1b2fb9bae3f4b168446943ac5afdc76.png

c45f7d4f5faf4af1a5f5ba18e3e59be3.png

可以发现,我们加密后的密码是 32 位的

73a171f02fbf494d8e8265b0528276bf.png

那么我们就要修改数据库中 password 的长度为 32 位

e114cfe96bd54408b7cb47b4ae27d564.png

接下来,我们来更改一下数据库中用户 zahuopu 的密码

9bdda8b72fc14bc2847f937cc9f0dae7.png

4、使用加密算法

首先我们把加密算法给导出

cryp.js

...
module.exports = {
    genPassword
}

之后我们修改 ./controller/user.js 的内容

user.js

const { exec, escape } = require('../db/mysql')
const { genPassword } = require('../utils/cryp')
// 登录(通过用户名和密码)
const login = (username, password) => {
    username = escape(username)
    // 生成加密密码
    password = genPassword(password)
    // 更改了一下此代码的位置,sql 中立马要用到预防 sql 注入
    password = escape(password)
    const sql = `
    select username, realname from users where username=${username} and password=${password}
    `
    console.log('sql is', sql)
    return exec(sql).then(rows => {
        return rows[0] || {}
    })
}
// 导出共享
module.exports = {
    login
}

之后回到登录界面,即可以成功登录

4c1092b23ea8467da374d9618f164ca1.png

三、写在最后

至此,我们明白了 如何防止sql注入、如何预防xxs攻击、以及如何为密码加密 继续跟进学习吧!


后续会对该项目进行多次重构【多种框架(express,koa)和数据库(mysql,sequelize,mongodb)】


如果你需要该项目的 源码,请通过本篇文章最下面的方式 加入 进来~~

45fc82a82c6542bdb2ff4986377d8db3.png

相关文章
|
11月前
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
554 4
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
7月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
9月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
248 1
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
SQL 存储 算法
sql server加密算法加盐
通过在 SQL Server 中结合使用加盐和哈希,可以有效地增强密码的安全性。本文详细介绍了在 SQL Server 中如何实现密码加盐和哈希的步骤,以及相关的完整示例和注意事项。希望本文能帮助读者更好地理解和应用加密技术,提升数据库系统的安
473 7
|
监控 安全 中间件
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
这篇文章介绍了什么是Next.js中的中间件以及其应用场景。中间件可以用于处理每个传入请求,比如实现日志记录、身份验证、重定向、CORS配置等功能。文章还提供了一个身份验证中间件的示例代码,以及如何使用限流中间件来限制同一IP地址的请求次数。中间件相当于一个构建模块,能够简化HTTP请求的预处理和后处理,提高代码的可维护性,有助于创建快速、安全和用户友好的Web体验。
409 0
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
|
9月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
3005 11
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
1177 155