这是我参与「第四届青训营 」笔记创作活动的第7天
web开发的安全及其防御
XSS攻击
定义:
攻击者通过插入恶意脚本,当用户访问页面时,这些恶意脚本会执行。导致用户的电脑被攻击
原因:
- 盲目信任用户提交的内容
- 直接把用户提交的字符串当成DOM元元素
特点:
- 通常难以从UI上感知(暗地执行)
- 窃取用户信息
- 绘制UI,诱骗用户点击/填写表单
分类:
- 存储型XSS攻击(Stored XSS):脚本会被存到数据库中,当用户访问页面时,回去服务端读取数据到浏览器,进而存储的脚本就会被执行。
- 反射型XSS攻击(Reflected XSS):不涉及数据库,从攻击者将脚本代码插入到url中,当用户访问该页面时,就会被攻击。脚本在服务端被注入
- 基于DOM的XSS攻击(DOM-based XSS):类似于反射型XSS攻击,不同的是诸如脚本的地方就是在浏览器页面,不涉及服务端。
- 基于浏览器的XSS攻击(Mutation-based XSS):利用不同浏览器的渲染机制进行攻击。
防御措施:
- 永远不要信任用户提交的内容
- 永远不要将用户提交内容直接转换成DOM
同源策略:
- 设置响应头部:
- 服务器响应头部:
Content-Security-Policy:script-sre 'self' Content-Security-Policy:script-sre 'self' https://domain.com- 浏览器响应头部:
<meta http-equiv="Content-Security-Policy" content="script-sre 'self'">
跨站伪造请求(CSRF)
攻击者构造一个链接或者图片又或者表单,当点击链接或者图片加载以及变淡被提交就会触发跨站伪造请求。
特点:
- 在用户不知情的前提下
- 利用用户权限
- 构造指定HTTP请求,窃取或修改用户敏感信息
防御措施:
- 通过判断请求头部判断是否是跨站伪造请求
- 通过token校验,token必须和具体用户绑定
- 针对iframe攻击在服务器设置X-Frame-Options:DENY/SAMEORIGIN
- 避免用户信息被携带
注入(Injection)
SQL Injection
攻击者恶意注入SQL参数,发送到服务端,服务端读取参数构造出一个SQL语句并执行。
防御措施:
- 找到项目中查询SQL的地方,正确使用prepared statement
- 针对其他注入攻击:
- 避免使用sudo命令,
- 建立白名单,拒绝高危操作
- 对url类型参数进行协议、域名、ip等限制
服务拒绝(DoS)
攻击者通过某种方式,导致服务器资源被显著消耗,来不及响应更多的请求,导致请求挤压,进而无法响应更多的请求。
基于正则表达式的DoS
若服务端写了一个贪婪的正则表达式,攻击者传入一个容易发生回溯的字符串,导致服务器响应时间极大延长、吞吐量减少、响应用户的请求次数极大下降
DDos
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而造成雪崩,无法响应新请求。
防御措施:
- 针对基于正则表达式的DoS:
- 完善代码review工作,避免写出贪婪匹配的正则表达式
- 使用代码扫描工具对代码进行规整
- 拒绝用户使用正则
- 针对DDoS
- 流量治理,在负载均衡这一层,或API网关层进行流量识别,把会进行攻击进行过滤。
- 快速扩容,以承载更多的流量
- 降级非核心服务,腾出更多计算资源去应对集中的流量
中间人攻击
在浏览器与服务器之间插入一个主机,服务器与浏览器交互时,该主机能够获取并篡改双方发出来的数据。
发生原因:
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御措施
- 使用https,https的特征:
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖性:数字签名 内容大致就是这些,如有错误望指正