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 中进行查询
image.png如果把 username 改为 zhangsan’— ,就会跳过密码验证
image.png
这样输入任何密码都可以以zhangsan的身份登录
因此 sql 注入的核心就是注释

解决 SQL注入问题

找到 mysql.js 文件
返回 escape 方法。来自mysql 中

  1. ...
  2. module.exports = {
  3. exec,
  4. escape:mysql.escape
  5. }

然后来到 user.js 中,使用这个 escape 方法,将用户名和密码都包裹起来

  1. const { exec, escape } = require('../db/mysql')
  2. const login = (username, password) =>{
  3. username= escape(username)
  4. password= escape(password)
  5. const sql = `select username,realname from users where username=${username} and password=${password}`
  6. ...
  7. })

打印一下
查询语句变为,
将注入的内容作为一个整体出现
select username,realname from users where username=’zhangsan\’ —‘ and password=’1’

8-2 xss攻击

  • 前端同学最熟悉的攻击方式,但 server 端更应该掌握
  • 攻击方式:在页面展示内容中掺杂 js 代码,以获取网页信息
  • 预防措施:转换生成 js 的特殊字符

转换方式

image.png

攻击方式

比如在创建博客的时候,将标题设置为

这样就可以获取用户端的信息

转换手段

安装 xss
npm i xss —save
使用 xss 来保护这个 title
image.png
这样就可以保护了
他会按着上面那个转换方式,将特殊符号全部转义

8-3 密码加密和总结

密码加密

  • 万一数据库被用户攻破,最不该泄露的就是用户信息
  • 攻击方式:获取用户名和密码,再去尝试登录其他系统
  • 预防措施:将密码加密,即便拿到密码也不知道明文

现在需要使用一个加密算法,将数据库中的密码数据进行加密
image.png

实操

新建 crypt.js 文件(/src/utils/crypt.js)

然后写入下列内容

  1. const crypto = require('crypto')
  2. // 一个密匙
  3. const SECRET_KEY = 'WDfdd_322*'
  4. // md5 加密
  5. function md5(content) {
  6. let md5 = crypto.createHash('md5')
  7. // 把输出变为16进制的方式
  8. return md5.update(content).digest('hex')
  9. }
  10. // 加密函数
  11. function genPassword(password) {
  12. const str = `password=${password}&key=${SECRET_KEY}`
  13. return md5(str)
  14. }
  15. // 测试一下
  16. // 明文是一样的,出来的加密密码就是一样的
  17. console.log('genPassword', genPassword('123'));
  18. // genPassword 1ef982d53e8dffa44f1c276dc65118e6

因为加密密码是32位的,所以把数据库表的最大值改一下(alter table)
然后 update 一下

  1. update users set password='1ef982d53e8dffa44f1c276dc65118e6' where username='zhangsan';

ok了

然后来到 user.js 对密码校验进行加密
这里要先生成加密密码,然后使用 escape 加引号

  1. const { genPassword } = require('../utils/crypt')
  2. const login = (username, password) =>{
  3. ...
  4. // 生成加密密码
  5. password = genPassword(password)
  6. password= escape(password)
  7. ...
  8. }

如果此时使用明文登录的就不能成功,因为数据库需要更改

任何密码都会被解密,但是只要有加密都比没有加密要好

总结

  • 如何预防 sql 注入
  • 如何预防 XSS 攻击
  • 如何加密密码

8-4 统一总结

不使用框架开发 server 的最后总结

  • 开发了哪些功能模块,完整的流程
  • 用到了哪些核心的知识点
  • server端和前端的区别

image.png
image.png
image.png
image.png


  • 不使用框架开发,从0开始,关注底层 API
  • 很琐碎、复杂,没有标准可依,很容易将代码写乱
  • 适合学习,但不适合应用

    下一步

    接下来开始 express 和 koa2