安全
- server端攻击方式非常多,预防手段也非常多
- 这里只讲解常见的、能通过web server(nodejs)层面预防的
- sql注入:窃取数据库内容
- XSS攻击:窃取前端的cookie内容
- 密码加密:保障用户信息安全(重要!)
- 有些攻击需要硬件和服务来支持(需要OP(服务器的运维人员)支持),如DDOS
sql注入(mysql库的escape函数)
- 最原始、最简单的攻击,从有了web2.0就有了sql 注入攻击(十几年前)
- 攻击方式:(在应该输入正常内容的位置输入)输入一个sql片段,最终拼接成一段攻击代码
- 预防措施:使用mysql的escape函数处理输入内容即可
- 注意:所有设计sql语句拼接的地方都需要使用escape函数,放置sql注入
- 使用escape函数时,拼接变量不使用引号,escape函数会对引号进行转译
例子
- 运行redis、nginx、前端、后端项目,进入登录页:
- 在controller-user.js中可看到登录的逻辑:
- 到数据库中看查询语句:
- 测试:
- 此时,相当于整个数据库都暴露了,比如:可以通过这种方式删除整个users表内所有行:
DELETE FROM table_name
相当于DELETE * FROM table_name
,可在不删除表的情况下删除所有的行。(表的结构、属性和索引都是完整的)
解决方法
- 在db-mysql.js中,已经引入mysql,所以直接输出mysql的escape函数给controller-user.js使用即可:
- 在controller-user.js中,引入escape函数,将所有需要拼接进sql语句中的变量都使用escape包裹,拼接sql语句时变量不使用引号:
- 测试:
- 使用escape后生成的sql语句:
- 放到sqlyog中进行对比:可以发现我们输入的引号被escape使用了转译符
xss攻击(xss库(函数))
- 前端同学最熟悉的攻击方式,但server端更应该掌握
- 攻击方式:在页面展示内容中掺杂js代码,以获取网页信息
- 预防措施:转换生成js的特殊字符:
- 使用xss工具将
<
/>
都进行转换,使之无法形成js代码块
- 使用xss工具将
例子
- 进入新建博客页(http://localhost:8080/new.html),在标题中输入js代码试图获取cookie信息:
- 结果就是非常惨烈,回到管理中心渲染页面时读取该js代码,cookie被带出
安装xss工具
npm i xss --save --registry=https://registry.npm.taobao.org
解决方法(转换尖括号)
将<
/>
都进行转换,使之无法形成js代码块
- 在controller-blog.js中,
- 引入xss工具:
- xss实际上是一个函数,使用xss函数将title包裹,则特殊字符会被转译:
- 测试:
- 此时管理中心中题目可正常显示,因为数据库中存储的标题是转译后的:
- 根据打印出来的信息对比:
<script>alert(1)</script>
可以看到xss函数将尖括号都进行了转译,但是详情页需要前端在detail.html中进行反转译再转译回尖括号:- 由于浏览器 innerHTML 会自动反转译,所以如果是原生html,就可以使用innerHTML属性,**jquery中则使用html()**:
密码加密(crypto库 md5加密)
- 万一数据库被用户攻破,最不应该泄漏的就是用户信息
- 攻击方式:获取用户名和密码,再去尝试登录其他系统
- 预防措施:将密码加密,即便拿到密码也不知道明文(使用crypto库)
- 比如:密码是123,但数据库存储的不是123,这样即使攻破数据库拿到的也不是123
例子
- utils文件夹下新建cryp.js:
- 引入crypto库:
- 使用crypto库,进行md5加密:
- 输出genPassword以供使用
- 将数据库中存储的密码改为加密后的密码
- 原本数据库中密码长度有所限制,先测试加密后密码的长度:
- 然后修改数据库中密码长度为32,更新 张三的密码:注意:这里没有修改李四的密码
- 在controller-user.js中引入并使用genPassword加密密码:
- 测试:此时zhangsan可输入123登录,lisi输入123是登录失败的,因为lisi在数据库中存储的密码不是加密后的,但登录时查询语句查询的是加密后的密码,所以对不上
- 需要在注册用户时就保存加密后的密码到数据库中