这是我参与「第四届青训营」笔记创作活动的的第5天
从两个角度看Web安全
一、hacker——攻击
跨站脚本攻击Cross-Site Scripting(XSS)
在安全内容里注入
<script>alert("xss");</script>
作为开发者来看,XSS主要利用了两点:
- 盲目信任用户的提高的内容
- 将string->DOM
XSS的三个特点:
- 难以从ui上进行感知(暗地地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制ui(例如弹窗),诱骗用户点击/填写表格
对用户可能的造成后果:
- 隐私泄露
- 机器被利用
我们用一个小demo来认识XSS:
XSS分类:
Stored XSS:
- 恶意脚本被存在数据库中;
- 访问页面->读数据=被攻击;
- 危害最大,对全部用户可见
reflected XSS:
- 不涉及到数据库
- 从url上攻击
host/path/?param=<script>alert('123')</script>
DOM-based XSS:
- 不需要服务器的参与
- 恶意攻击发起+执行,全在浏览器完成 用的url相同:
host/path/?param=<script>alert('123')</script>
Mutation-based XSS:
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
可能有人会分不清Relected和DOM-based,让我们看看他们的不同
跨站轨道请求Cross-site request forgery(CSRF)
CSRF的特点:
- 在用户不知道请的前提下;
- 利用用户权限(cookie);
- 构造指定HTTP请求,窃取或修改用户敏感信息
看一个日常会看到的安全问题————银行卡里莫名就少了一大笔钱
-
CSRF--GET -
CSRF--beyond GET
Injection
SQL Injection:
当你读取请求字段,直接以字符串形式拼接SQL语句时,发现被动删库了!
还有CLI、OS command、Server-Side Request Forgery等,感兴趣可以去了解啦
服务拒绝Denial of Service(Dos)
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应
-
ReDos:基于正则表达式的DoS导致响应时间不断增加、接口吞吐量不断减少
-
DDoS(Distributed DoS)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求(量大)
攻击特点: 直接访问IP;任意API;消耗大量带宽(耗尽)
传输层:
中间人攻击:利用明文传输;信息篡改不可知;对方身份未验证
对于开发者——防御
对于XSS:
- 永远不要不信任用户提交的信息!
- 不要将用户提交的内容直接转换成DOM!
在前端怎么解决?
- 主流框架(vue、react):默认防御XSS,google-closure-library
- 服务端(Node):DOMPurify,完成字符串的转译
如果一定要转为DOM,注意
- 如果是string->DOM,并调用DOMParser API,
一定要将string进行转译;- 上传
svg时,对svg进行扫描检查- 不要让用户
自定义跳转链接,要的话进行检查- 对于
自定义样式:![]()
SOP(Same-origin Policy):协议、域名、端口相同,进行HTTP请求时同源可以,跨域得看服务器的设置啦
CSP:
- 可以定义哪些源(域名)被认为时安全的
- 来自安全源的脚本可以执行,否则直接抛错
- 对 eval+inline srcipt直接说no
防御模式:
对iframe攻击:
ani-pattern:要知道GET!=GET+POST
避免用户信息被携带:SmaeSite Cookie 限制的是Cookie domain和页面域名
问题来了--依赖Cookie的第三分服务怎么办?(内嵌一个x站播放器,识别不了用户登录态,发不了弹幕)
Set-Cookie: SameSite=Node;Secure;
让我们对比一下SameSite和Cors:
Injection :
-
Injection SQL:找到项目中使用SQL的地方,并使用prepared statement -
Injection beyond SQL
RegexDoS
DDos
传输层(防御中间人):
HTTPS主要包括HTTP和TLS
其中TLS:
HTTP有三个特性:
- 可靠性:加密
- 完整性:mac验证
- 不可抵赖性:数字签名
HTTP->HTTPS
静态资源被劫持纂改?对比hash!
用SRI,即判断标签hash(原始内容hash)与实际hash是否一样
写在最后
- 安全无小事
- 使用的依赖成为最薄弱的一环(npm install也有可能有危险)
- 保持学习的心态
有兴趣可以还可以去了解left-pad、eslint-scope、event-stream事件