在现代网络中,安全相关的问题是非常繁杂的,种类颇多
这里只介绍Web开发中经常碰到的一些安全问题:
SQL注入
XSS
CSRF
点击劫持
中间人攻击
SQL注入
什么是SQL注入
后台人员使用用户输入的数据进行拼接组装SQL查询语句时,遇到恶意输入就会返回不应该返回的内容
简单示例
普通的查询语句
SELECT*FROMarticlesWHEREid=$id
1.客户端发送的正常请求
/api/articlres/article?id=12
拼接后的SQL
SELECT*FROMarticlesWHEREid=12
2.注入SQL发送的恶意请求
/api/articlres/article?id=1 or 1=1
这里的 是空格经过UrlEncode过后的内容
拼接后的sql
SELECT*FROMarticlesWHEREid=12or1=1
这样就扩大了查询数据的范围,导致查询异常或者返回原本不该返回的数据
如何防范
加入过滤和验证机制:
将参数的所有内容当做值,而不是当做字符串的一部分
使用正则表达式过滤传入的参数
检查传入内容是否包含非法的关键字
XSS
什么是XSS
XSS全称CrossSiteScripting,即跨站脚本攻击
攻击者可以将代码注入页面,然后可以进行一系列损害用户利益的事情
窃取Cookie
监听用户行为
修改DOM伪造登录表单
在页面中生成浮窗广告
恶意跳转
...
恶意代码未经过滤,与网站正常的代码混在一起,以至于浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行
XSS可以分为两类:持久型和非持久型
持久型
持久型也就是攻击的代码被服务端写入进数据库中,在页面加载的时候执行
常见于服务端渲染的时候出现
示例
Document
中间人攻击
什么是中间人攻击
中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的
攻击者不仅能获得双方的通信信息,还能修改通信信息
场景举例:使用非对称加密传输的数据
中间人已经同时与客户端与服务端建立了链接
服务端下发公钥a1,中间人截获,然后下发自己的公钥b1
客户端接收到公钥b1,对传输的数据“你好”加密成“xxx”,然后发送给服务端
中间人收到数据“xxx”,用自己的私钥B解密获得内容“你好”,然后用截获的a1公钥加密内容“滚滚滚”成“yyy”,发送给服务端
服务端收到内容“yyy”用自己的私钥A解密得到“滚滚滚”的内容
在这个过程中,中间人不仅获取了用户传输的真实数据,还给服务的发送了错误的信息
如何防范
使用https
不要在公共Wi-Fi上发送敏感数据
使用权威机构的CA证书
参考
简书-sql注入基础原理(超详细)
MDN:Content-Security-Policy
阮一峰:CSP
原文首发于个人博客,专题系列会整理多篇,与大家一起学习,共同进步,如有错误,还请斧正