这是我参与「第四届青训营 」笔记创作活动的的第3天
前言
web 开发的安全问题一直都是重中之重的一环,当然安全问题在其他领域同样如此,在web 开发领域安全问题一旦出现问题,对用户可能是个人财产或隐私的造成损失、对公司可能造成巨额财产及客户的流失、同时也 关系到开发者工作的去留等一系列问题,以下;是对本节课所做出的记录。从连个方面作为切入点:攻击和防御.
一、攻击篇
加入你是一个hacker
1、跨站脚本攻击(Cross Site Script Attack)--- XSS
常见攻击方式
- 开发者盲目信任用户的提交内容,将用户填写的字符串直接转换为DOM操作
XSS的一些特点
- 通常难以从以
UI上感知(XSS攻击一般在暗地执行脚本) - 窃取用户信息(cookie/token)
- 绘制
UI(例如弹窗),诱骗用户点击/填写表单
XSS 分类(性质)
- 恶意脚本被存在数据库中
- 访问页面 => 读数据 === 被攻击
- 危害最大,对全部用户可见
2、跨站请求伪造(Cross-site request forgery)---CSRF
特点:
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或者修改用户敏感性息
3、注入攻击(Injection)
(1)、SQL Injection(最常见的注入攻击方式)
方式:
- HTTP请求
SQL参数被恶意注入 - 求其发送至服务端将
SQL参数解析构建SQL语句并运行SQL代码 - 获取数据、修改数据、删除数据等一系列操作
(2)、其他注入方式
CLI:命令行- OS command :系统命令
- Server-Side Request forgery(
SSRF) 服务端伪造请求(虽然不属于注入但是原理类似)
4、拒绝服务(Denial of Service) --- Dos
描述:通过某种方式(构造特定请求),导致服务器资源被显著小号,来不及相应更多请求,导致请求挤压,进而雪崩效应。
(1)、ReDos:基于正则表达式的DOS
方式: 通过正则表达式的贪婪匹配,如果服务端在利用正则去匹配的时候,攻击者通过提交特定的信息,时服务待在进行正则匹配的时候需要通过不断回溯进行匹配。
结果: 响应时间增加、接口吞吐量下降。
(2)、DDoS(Distributed)
描述: 短时间按内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法相应新请求。
特征: 简单粗暴、以量大达成目的
攻击特点:
- 直接访问
IP - 任意
API - 消耗大量带宽
5、中间人
描述:处于服务端与浏览器之间,接收来自浏览器或者服务器传过来的信息,可以对信息进行窃取、修改请求并返回等操作,处理后发送个服务器或者浏览器
原因:
- 明文传输
- 信息篡改不可知
- 对方身份为未验证
中间人身份可以是:恶意的webview、路由器、ISP等
二、防御篇
1、防御XSS
措施
-
永远不信任用户的提交内容
- 不要将用户提交内容直接转换为DOM
XSS --- 现成工具
-
前端
- 主流框架默认防御
XSS google-closure-library
- 主流框架默认防御
-
服务端(Node)
DOMPurify
需要注意的几种需求
- String--->DOM:渲染前进行扫描
- 需要添加
svg图片时进行扫描,因为svg里是可以添加script标签的 - 避免用户自定义跳转行为,如无法避免应进行校验
- 允许用户自定义样式需额外注意
内容安全策略(Content Security Policy)--- CSP
功能
- 判断那些源(域名)被认为是安全的
- 来自安全源的脚本可以执行,否则直接抛错
- 对内联script标签直接报错
2、CSRF的防御
请求头部
-
if 伪造请求 === 异常来源
-
then 限制请求来源 ----- > 限制伪造请求
-
Origin
- 同源请求中,GET+HEAD 不发送
-
Referer
token
先有页面,后有请求
- if (请求来自合法页面)
- then (服务求接收过页面请求)
- then (服务器可以表示)
anti-pattern
GET !== GET + POST
get请求和post请求按照其使用场景严格区分,避免因使用逻辑问题所造成的用户信息泄露
SameSite Cookie(避免用户信息被携带)
场景:CSRF攻击利用用户权限进行攻击,然而请求访问并不携带Cookie ,是用户的页面只能由用户本人所使用,避免了跨站伪造请求的行为
限制内容:
-
Cookie domain
domain表示的是cookie所在的域,默认为请求的地址
-
页面域名
3、Injection的防御
方法:
- 找到项目中查询
SQL的地方 - 使用prepared statement
注意事项:
- 最小权限原则
- 简历允许名单 + 过滤
- 对URL类型参数尽心协议、域名、ip等限制
4、DOS的防御
(1)、Redex Dos
方法:
- Code Review(避免使用贪婪匹配的方式)
- 代码扫描 + 正则性能测试
- 禁止使用用户提供的正则
(2)、DDOS
方法:
-
流量治理
- 负载均衡
API网关CDN
-
快速自动扩容
-
非核心服务降级
5、中间人的防御(传输层)
对于利用中间人进行防御从HTTPS出发
HTTPS部分特性
-
可靠性:使用加密避免铭文传输
TLS的四次握手
-
完整性:使用MAC验证,防止篡改
- 传输: 加密信息 + 加密信息的hash值
- 接收:重新计算并比对依次为校验信息是否被篡改
-
不可抵赖性: 数字签名