2021-11-9
8-1 开始和sql注入
- sql 注入:窃取数据库内容
- XSS 攻击:窃取前端的 cookie内容
密码加密:保障用户信息安全(重要!)
server端攻击方式非常多,预防手段也非常多
- 本课只讲解最常见的,能通过 web server(nodejs)层来预防的
- 有些攻击需要硬件和服务来支持(需要OP-服务器运维人员支持),如 DDOS
sql 注入
- 最原始、最简单的攻击,从有了 web2.0 就有了 sql 注入攻击
- 攻击方式:输入一个 sql 语句片段,最终拼接成一段攻击代码
- 预防措施:使用 mysql 的 escape 函数处理输入内容即可
实操 SQL注入
打开我们之前操作的前后端联调过的内容,
然后来到http://localhost:8080/login
在这里,如果登录的话,就相当于拼接如下字符串到 mysql 中进行查询
如果把 username 改为 zhangsan’— ,就会跳过密码验证
这样输入任何密码都可以以zhangsan的身份登录
因此 sql 注入的核心就是注释
解决 SQL注入问题
找到 mysql.js 文件
返回 escape 方法。来自mysql 中
...
module.exports = {
exec,
escape:mysql.escape
}
然后来到 user.js 中,使用这个 escape 方法,将用户名和密码都包裹起来
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}`
...
})
打印一下
查询语句变为,
将注入的内容作为一个整体出现
select username,realname from users where username=’zhangsan\’ —‘ and password=’1’
8-2 xss攻击
- 前端同学最熟悉的攻击方式,但 server 端更应该掌握
- 攻击方式:在页面展示内容中掺杂 js 代码,以获取网页信息
- 预防措施:转换生成 js 的特殊字符
转换方式
攻击方式
比如在创建博客的时候,将标题设置为
这样就可以获取用户端的信息
转换手段
安装 xss
npm i xss —save
使用 xss 来保护这个 title
这样就可以保护了
他会按着上面那个转换方式,将特殊符号全部转义
8-3 密码加密和总结
密码加密
- 万一数据库被用户攻破,最不该泄露的就是用户信息
- 攻击方式:获取用户名和密码,再去尝试登录其他系统
- 预防措施:将密码加密,即便拿到密码也不知道明文
实操
新建 crypt.js 文件(/src/utils/crypt.js)
然后写入下列内容
const crypto = require('crypto')
// 一个密匙
const SECRET_KEY = 'WDfdd_322*'
// md5 加密
function md5(content) {
let md5 = crypto.createHash('md5')
// 把输出变为16进制的方式
return md5.update(content).digest('hex')
}
// 加密函数
function genPassword(password) {
const str = `password=${password}&key=${SECRET_KEY}`
return md5(str)
}
// 测试一下
// 明文是一样的,出来的加密密码就是一样的
console.log('genPassword', genPassword('123'));
// genPassword 1ef982d53e8dffa44f1c276dc65118e6
因为加密密码是32位的,所以把数据库表的最大值改一下(alter table)
然后 update 一下
update users set password='1ef982d53e8dffa44f1c276dc65118e6' where username='zhangsan';
ok了
然后来到 user.js 对密码校验进行加密
这里要先生成加密密码,然后使用 escape 加引号
const { genPassword } = require('../utils/crypt')
const login = (username, password) =>{
...
// 生成加密密码
password = genPassword(password)
password= escape(password)
...
}
如果此时使用明文登录的就不能成功,因为数据库需要更改
任何密码都会被解密,但是只要有加密都比没有加密要好
总结
- 如何预防 sql 注入
- 如何预防 XSS 攻击
- 如何加密密码
8-4 统一总结
不使用框架开发 server 的最后总结
- 开发了哪些功能模块,完整的流程
- 用到了哪些核心的知识点
- server端和前端的区别