参考文档:
一些安全相关名词
-
XSS
-
CSRF
-
HTTPS
-
CSP(内容安全策略,禁止加载外域代码,禁止外域的提交)
-
HSTS(强制使用HTTPS)
-
X-Frame-options 控制当前页面是否可以被嵌入到iframe
-
SRI subresource intergrity 子资源完整性
打包文件后,根据文件内容生成hash值,并且注入到script标签上. 防止黑客篡改cdn上的资源内容
浏览器加载script时,会根据内容生成hash值 并和script标签上的hash进行对比,如果相同,则认为内容是安全的
-
Referer-Policy 控制referer的携带策略
Node(服务器)攻击
1. 本地文件操作安全问题,由字符串拼接路径
一般框架都可以规定静态资源文件,这个很容易理解,如果不做资源的访问限制,那用户访问服务器后,直接改变URL地址,就可以获取到服务器上的所有文件.
express.static
koa-static 中间件
resolve-path 第三方库
const app = express()
app.static("html")
http.createServer(app).listen(3000)
2. ReDos
2-1. 什么是dos攻击
dos攻击就是攻击者通过大量访问服务器,造成服务器负载过大,使正常的访问受到影响. 比如个人开发者购买了流量付费的某☁️服务器,如果不做安全措施,攻击者通过脚本或其他方式大量访问该服务器,就会造成额外的费用
2-2. ReDos
ReDos就是使用正则进行dos攻击,正则表达式嵌套关系深的时候,计算量增上速度很快 可能造成服务器宕机
前端攻击
XSS
1. 概念
Cross-site Script 跨站脚本攻击.
攻击者想尽一切办法把代码注入到网页中.
2. 攻击类型
外在表现
-
评论区、可输入位置植入js代码
-
url上拼接js代码,诱使用户打开
技术实现
-
存储型 Server
论坛发帖、商品评价、用户私信等储存到服务器攻击
恶意代码上传到服务器,其他用户加载页面时从服务器拉取到恶意代码在浏览器解析执行,导致攻击漏洞
-
反射型 Server
攻击者构造出自己的恶意url
攻击者结合各种手段,诱导用户点击URL
通过URL传参的功能,比如网站的搜索框,搜索时向后台发送请求,可以写一些奇奇怪怪的搜索内容
-
DOM型 Browser
也是URL传参的功能,传入可执行文本,举例:
const a = document.queryElementsByTagName("a")[0] const queryObj = [] const search = window.location.search search.replace(//, (m, $1, $2) => { queryObj[$1] = decodeURIComponent($2) }) // 通过浏览器url传参来决定a标签的跳转,可能有xss注入漏洞 // 攻击者可以传入 javascript:xxx 参数,用户点击链接时会执行恶意代码 a.href = queryObject.redirectUrl;
3. 如何防范
XSS 可以攻击成功,一定是因为被攻击网站的服务端或客户端出现的代码漏洞。
-
对数据进行严格的编码,比如 html元素、js、css、url
使用框架时要注意一些危险的API:
-
vue : v-html
-
react : dangerousHtml
-
-
CSP (Content Security Policy) 内容安全策略
浏览器提供的一种安全策略
服务端可以设置响应头
Content-Security-Policy,本质上是设立白名单,规定浏览器只能执行指定域名的代码,可防止 XSS 攻击也可以使用meta标签进行设置
<meta http-equiv="Content-Security-Policy" content="default-src https://example.net; child-src 'none'; object-src 'none'" /> -
防止Cookie盗用,配置HttpOnly
- 配置HttpOnly后可以禁止JS获取Cookie
-
验证码
-
控制输入长度,增加XSS攻击难度
CSRF Cross-site Request Forgery 跨站请求伪造
1. 概念
用户登录了某网站后,浏览器会储存该用户的登录信息,当用户访问了攻击者的网站时,攻击者可以通过在网站内部向被攻击网站发送请求,该请求会默认携带Cookie信息
CSRF 攻击已经不常见了,因为现代浏览器的安全策略已经比较严格。
2. 如何攻击
- 某人登陆了邮箱,浏览器储存了用户的cookie
- 该人访问了第三方网站,第三方网站发起修改邮箱配置的请求,比如设置邮箱自动转发到其他邮箱,由于Cookie还没过期,就可以顺利发起请求达到黑入邮箱的目的.
3. 攻击类型
-
Get 请求
使用Img标签
<img src="xxx" /> -
Post 请求
2-1. 使用form表单
<form method="POST"> <input type="hidden" name="account" value="xxx"/> </form> <!-- 发起请求 --> <script>document.forms[0].submit()</script>2-2. 诱导客户点击链接
<a href="xxxx"/>
CSRF 攻击不需要确切的获取用户的Cookie,由用户自己在不知情的情况下发起请求,所以设置HttpOnly无法防范 CSRF 攻击.
XSS 攻击是执行攻击者的代码,获取用户的登录信息,再使用用户的登录信息发起请求.
XSS 和 CSRF 是有区别的
XSS 是攻击者侵入到当前网站内部,在当前网站注入恶意代码造成的攻击(当前网站)
CSRF 是用户访问或者点击第三方网站链接时,向服务器发送请求造成的攻击(第三方网站)
XSS 是利用了用户对网站的信任;
CSRF 是利用了网站对用户的信任;
3. 防范
3-1. 阻止不明外域的访问
-
同源检测
-
Origin Header
如果存在Origin Header 直接通过它来判断就可以
但是IE 11 不会在跨站CORS请求上添加Origin标头,Referer头将仍然是唯一的标识
302重定向也会丢失Origin
-
referer header
Referer 简介 (制定规范的时候有拼写错误,正确的单词是referrer)
这个单词有拼写错误,它翻译过来是推荐人的意思
当你使用google搜索访问A网站时,就会携带Referer信息,表明你是通过google来访问的A网站
以下情况会发送Referer信息 🔥🔥 (刚好这三种情况都可能造成CSRF攻击)
- 用户点击网页上的链接
- 用户发送表单
- 网页加载静态资源,比如加载图片、脚本、样式
可以通过
document.referrer来获取。Referrer Policy 策略
如何设置:
- 在CSP设置
- 页面头部增加meta标签
- a标签增加referrerpolicy属性
当客户访问第三方网站,并且发送了恶意的请求到服务器时,服务器就可以比对 referer 字段,来判断这个请求是否是信任的网站发送的.
不过要注意一点:Referer在一些情况下也会丢失,可参考MDN
-
无法确认 origin 和 referer的情况下,建议直接进行阻止
3-2. Cookie SameSite
默认禁止跨域携带Cookie
3-3. 提交时要求附加本域才能获取的信息
- 某些安全性较高的请求需要输入手机验证码,比如支付请求等
- 由于攻击者拿不到Cookie,提交请求的时候可以增加附加校验,比如 Token
-
用户登录后,服务器会生成一个加密的token作为该用户的标示返回给客户端,客户端会储存这个token
-
用户在浏览网站发送请求时,为每个请求携带token
-
服务器收到token后对其验证其有效性,对其解密来获取到用户信息(一般可以存到redis中)
-
CSRF Token虽然可以防止CSRF攻击,但是可能遭到XSS攻击泄漏token
-
双重Cookie验证
- 在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如
csrfcookie=v8g9e4ksfhw)。 - 在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例
POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。 - 后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。
优点:
- 比token简单
缺点:
- 这样的模式注定不能使用HttpOnly,意味着可能遭到XSS攻击
- 在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如
-