博客项目安全

安全

  • server端攻击方式非常多,预防手段也非常多
  • 这里只讲解常见的、能通过web server(nodejs)层面预防的
    • sql注入:窃取数据库内容
    • XSS攻击:窃取前端的cookie内容
    • 密码加密:保障用户信息安全(重要!)
  • 有些攻击需要硬件和服务来支持(需要OP(服务器的运维人员)支持),如DDOS

sql注入(mysql库的escape函数)

  • 最原始、最简单的攻击,从有了web2.0就有了sql 注入攻击(十几年前)
  • 攻击方式:(在应该输入正常内容的位置输入)输入一个sql片段,最终拼接成一段攻击代码
  • 预防措施:使用mysql的escape函数处理输入内容即可
    • 注意:所有设计sql语句拼接的地方都需要使用escape函数,放置sql注入
    • 使用escape函数时,拼接变量不使用引号,escape函数会对引号进行转译

例子

  1. 运行redis、nginx、前端、后端项目,进入登录页登录页
  2. controller-user.js中可看到登录的逻辑登录的逻辑
    • 数据库中看查询语句数据库
  3. 测试测试
  4. 此时,相当于整个数据库都暴露了,比如:可以通过这种方式删除整个users表内所有行删除整个users表
    • DELETE FROM table_name相当于DELETE * FROM table_name,可在不删除表的情况下删除所有的行。(表的结构、属性和索引都是完整的)

解决方法

  1. db-mysql.js中,已经引入mysql,所以直接输出mysql的escape函数给controller-user.js使用即可:db-mysql.js
  2. controller-user.js中引入escape函数,将所有需要拼接进sql语句中的变量都使用escape包裹,拼接sql语句时变量不使用引号controller-user.js
  3. 测试:测试
  4. 使用escape后生成的sql语句:使用escape后生成的sql语句
    • 放到sqlyog中进行对比:可以发现我们输入的引号被escape使用了转译符sqlyog中进行对比

xss攻击(xss库(函数))

  • 前端同学最熟悉的攻击方式,但server端更应该掌握
  • 攻击方式:在页面展示内容中掺杂js代码,以获取网页信息
  • 预防措施转换生成js的特殊字符:转换特殊字符
    • 使用xss工具</>都进行转换,使之无法形成js代码块

例子

  1. 进入新建博客页(http://localhost:8080/new.html),在标题中输入js代码试图获取cookie信息: 例子
  2. 结果就是非常惨烈,回到管理中心渲染页面时读取该js代码,cookie被带出

安装xss工具

npm i xss --save --registry=https://registry.npm.taobao.org

解决方法(转换尖括号)

</>都进行转换,使之无法形成js代码块

  1. controller-blog.js中
    1. 引入xss工具controller-blog.js
    2. xss实际上是一个函数,使用xss函数将title包裹,则特殊字符会被转译controller-blog.js
  2. 测试
    1. 测试
    2. 此时管理中心中题目可正常显示,因为数据库中存储的标题是转译后的数据库中存储的标题是转译后的
    3. 根据打印出来的信息对比:&lt;script&gt;alert(1)&lt;/script&gt;可以看到xss函数将尖括号都进行了转译,但是详情页需要前端在detail.html中进行反转译再转译回尖括号:
      • 需要自己再转译回尖括号
      • 由于浏览器 innerHTML 会自动反转译,所以如果是原生html,就可以使用innerHTML属性,**jquery中则使用html()**:前端detail.html
      • 结果

密码加密(crypto库 md5加密)

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

例子

  1. utils文件夹下新建cryp.js
    1. 引入crypto库cryp.js
    2. 使用crypto库,进行md5加密cryp.js
    3. 输出genPassword以供使用
  2. 数据库中存储的密码改为加密后的密码
    1. 原本数据库中密码长度有所限制,先测试加密后密码的长度加密后密码的长度
    2. 然后修改数据库中密码长度为32更新 张三的密码更新密码注意:这里没有修改李四的密码
  3. controller-user.js引入并使用genPassword加密密码controller-user.js
  4. 测试:此时zhangsan可输入123登录,lisi输入123是登录失败的,因为lisi在数据库中存储的密码不是加密后的,但登录时查询语句查询的是加密后的密码,所以对不上
    • 需要在注册用户时就保存加密后的密码到数据库