1.安全
- sql注入:窃取数据库内容
- xss攻击: 窃取前端的cookie 内容
- 密码加密: 保障用户信息安全(重要)
- server 端攻击方式非常多,预防手段非常多
sql 注入
- 最原始、最简单的攻击,从有了web2.0 就有了sql注入攻击
- 攻击方式:输入了一个sql片段,最终拼接成一段攻击代码
- 预防措施: 使用 mysql 的 escape 函数处理输入内容即可
slelct username, realname from users where username='zhangsan' -- and password='123'
由于 – 是 sql的注释,就可以直接登陆了。
mysql.js
...
module.exports = {
exec,
escape: mysql.escape
}
escape是mysql的函数,可直接导出。
router/user.js
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
}
1.通过esacpe()处理变量
2.拼接sql语句的时候要’${username}’ => ${username},去掉引号
xss 攻击
- 攻击方式: 在页面展示内容中掺杂 js 代码,以获取网页信息
- 预防措施:转换生成js 的特殊字符
就能获取到我们的cookie了。
解决措施
npm i xss --save
controller/blog.js
const xss = require('xss')
...
const newBlog = (blogData = {}) => {
const title = xss(blogData.title)
const content = blogData.content
const author = blogData.author
const createTime = Date.now()
xss是一个函数,用xss()包裹变量即可。
密码加密
- 万一数据库被用户攻破,最不应该泄露的就是用户信息
- 攻击方式:获取用户名和密码,再去尝试登陆其他系统
- 预防措施:将密码加密,即使拿到密码也不知道明文
cryp.js
const crypto = require('crypto') //nodejs提供的加密库
// 密匙
const SECRET_KEY = 'wJiol_8776#' // 随机取即可
// md5加密
function md5 (content) {
let md5 = crypto.createHash('md5')
return md5.update(content).digest('hex')
}
// 加密函数
function genPassword(password) {
const str = `password=${password}&key=${SECRET_KEY}`
return md5(str)
}
module.exports = {
genPassword
}
使用
controller/user.js
const { genPassword} = require('../utils/cryp')
...
// 生成加密密码
password = genPassword(password)