nodejs安全
- sql注入:窃取数据库内容
- xss攻击: 窃取前端的cookie内容
- 密码加密:保障用户信息安全
- server端攻击方式非常多,预防手段也多
- 通过webserver(nodejs)层面预防的
- 有些攻击需要硬件和服务来支持(需要op支持)如 DDOS
sql注入
最原始最简单的攻击,从web2.0就有了sql注入攻击
可以攻破数据库,拿到信息以及可能会删除一些重要的表
攻击的方法:
输入一个sql片段,最终拼成一段攻击代码
执行delet from users 在查询zhangsan后直接将users表删除(后果不堪设想)
登陆用户名密码随便输入点击登陆后成功的进入了用户管理中心
预防的措施:
使用mysql的escape函数处理输入内容即可
本质提供特殊的字符,让你输入sql片段失效来预防
node提供了escape方法
xss攻击
攻击的方式:
在页面展示内容中掺杂js代码,以获取网页信息
点击创建后会将本地的cookie信息打印出来
预防措施
转换生成js的特殊符号
安装xss:npm install xss --save
引用xss
const xss = require('xss')
将传入的标题,内容及作者xss()
const title = xss(blogData.title)
const content = xss(blogData.content)
const author = xss(blogData.author)
密码加密
万一数据库被用户攻破,最不该泄露的就是用户信息(用户名,密码)
攻击方式:
获取用户名和密码,再去尝试登陆其他系统
预防措施
将密码加密,即便拿到密码也不知道明文
1、nodejs 有的加密的库 crypto
const crypto = require('crypto') //node 提供的加密库
// 密钥 相当于一把钥匙,密码要和这个要是一块做一个加密
const SECRET_KEY = 'WJiol_855#$*'
// md5 加密
function md5(content) {
let md5 = crypto.createHash('md5')
// digest('hex) 将输出变为16进制的方式
return md5.update(content).digest('hex')
}
// 加密函数
function genPassword(password) {
//将密码与密钥拼接一个完成的字符串
const str =`password= ${password}&key=${SECRET_KEY}`
return md5(str)
}
module.exports = {
genPassword
}
// 注册的时候通过这个加密算法生成密码保存到数据库 登陆de时候也通过相同的加密算法生成一个秘密,两个比对相同的话登陆成功
const result = genPassword('123')
console.log(result)
此时打印的 123 就显示为:
C:\practice\blog1>node src/utils/cryp.js
52895b9924aa234736dc9b42935e5b26
用法
const {exec,escape} = require('../db/mysql')
const {genPassword} = require('../utils/cryp')
const login = (username,password) => {
username = escape(username)
password = genPassword(password)
password = escape(password) //escape 防止sql注入
// 生成加密密码 匹配数据库的用户名和密码
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
}