这是我参与「第四届青训营 」笔记创作活动的第2天
本节课主要讲解Web安全,分为两个部分。
作为一个hacker--攻击者
作为一个开发者--防御
那接下来我们先从攻击者的方面入手
攻击篇
Cross-Site Scripting XSS(跨站脚本攻击)
XSS主要利用盲目信任使用者提交的内容,将恶意脚本放进我们使用的页面,还有另外一种方式是我们直接将字符串读出来生成dom结构
XSS的一些特点
- 通常很难从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
Stored XSS(储存型XSS)
存储型XSS有以下几个特点
- 恶意脚本被存在数据库中
- 访问页面-> 读取数据 == 被攻击
- 危害最大,对全部用户可见
Reflected XSS(反射型XSS)
DOM-based XSS(基于DOM的XSS攻击方式)
-
不需要服务器的参与
-
恶意攻击的发起+执行,全在浏览器完成
mutation-based XSS(基于mutation的XSS攻击)
-
利用了浏览器渲染DOM的特性(独特优化)
-
不同浏览器,会有区别(按浏览器进行攻击)
Cross-site request forgery CSRF(跨站伪造请求)
在用户不知情的前提下
利用用户权限(cookie)
构造指定的HTTP请求,窃取和修改用户敏感信息
CSRF demo
CSFR--GET(构造get请求)
<a href = "https://blank.com/transfer?to=hacker&amount=100">点我抽奖</a>
<img style = "dispaly:none" src="https://blank.com/transfer?to=hacker&amount=100" />
CSRF-beyond GET(构造post请求)
攻击者可以伪造form表单发送post请求
<form action = "https://blank.com/transfer?to=hacker&amount=100" method="POST">
<input name="amount" value="10000000000" type="hidden">
<input name="to" value="hacker" type="hidden">
</form>
Injection(注入攻击)
注入攻击,尤其是SQL注入(SQLi攻击) 和跨站(xss),它们不仅危险并且普遍,特别是遗留在程序里面,还有许多种类的注入攻击,像代码注入、CRLF注入、Email头注入......
比如SQL注入攻击:攻击者注入sql语句来读取和修改数据 库数据,在高级sql注入案例中,攻击者能执行sql语句写服务器上的任意文件和甚至执行系统命令,这会导致系统沦丧
防御篇
XSS
xss的防御方法核心理念:
- 永远不信任用户提交的内容
- 永远不会把用户提交的东西直接转成DOM
如果用户硬要生成动态DOM树,以下方法可能会有所帮助 1.对用户上传的string进行过滤
2.用户上传svg,对svg进行过滤
3.用户自定义的链接,a标签一定要慎重,最好不要让用户可以自定义链接
4.自定义的样式要慎重,因为background中也可以嵌套URL
Content Security Police(CSP)
只允许加载同源的所有资源
default-src 'self';
支持*号匹配
default-src 'self' https://.ccc.com:;
只允许加载同源的脚本
script-src 'self';
只允许加载同源的和www.ccc.com的脚本
script-src 'self' www.ccc.com;
CSRF的防御
csrf是通过伪造请求,那么我们可以通过限制请求来进行防御
token
Token,就是令牌,最大的特点就是随机性,在访问网站时,登录账号密码时,网站会返回一个标志性令牌,token,让黑客和其他垃圾网站猜不出来,提高了安全性
总结
-
安全无小事
-
使用的依赖(npm package,甚至是NodeJS)可能成为最薄弱的环节
- left-pad事件
- eslint-scope事件
- event-stream事件
-
保持学习心态