# 前端网络安全
# 1、浏览器
XSS、CSRF、HTTPS
csp:内容安全策略,可以禁止加载外域代码,禁止外域的提交,Content-Security-Policy|X-XSS-Protection
HSTS:强制客户端使用HTTPS与服务端建立连接
X-Frame-Options:控制当前页面是否可以别嵌入到iframe中
- DENY:表示该页面不允许在frame中展示,即便是在相同域名的页面中嵌套也不允许
- SAMEORIGIN:表示该页面可以在相同域名页面的frame中展示
- ALLOW-FROM uri:表示该页面可以在指定来源的frame中展示
SRI(subresource intergrity 子资源的完整性):请求cdn子资源的完整性
- jian-xdfs-da-daaa.js:注入到index.html,并且上传至cdn
- 用户在请求的时候,根据jian-xdfs-da-daaa.js去请求,而这个文件可能被篡改
- 打包的时候根据js文件内容生成一个hash值,并且把hash值作为intergrity属性注入到script上,前端可以⽤webpack-subresource-integrity插件实现。
Referer-Policy:控制referer的携带策略
# 1、XSS
聊一下xss?思路:概念、攻击类型、如何防范、自己工作中是否遇到?如何解决?
# 1、概念
Cross Site Script,xss垮站脚本攻击,攻击者想尽一切办法把可执行代码注入到网页中
# 2、攻击类型
外在表现上,都有哪些攻击场景:
- 评论区植入js代码(即可输入的地方)
- url上拼接js代码
技术角度上,有哪些类型的xss攻击:
存储型Server:服务端存在数据库
论坛发帖,商品评价,用户私信等这些用户保存数据的网站
攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中
- 用户打开目标网站的时候,服务端将评论(恶意代码)从数据库中取出,拼接到html返回给浏览器
- 用户浏览器收到html后,混在其中的恶意代码就会执行
- 窃取用户数据,发放到攻击者网站
反射型Server:拼接在url上
攻击者结合各种手段,诱导用户点击恶意url,通过url传参数的功能,比如网站的搜索或跳转等。
攻击步骤:
- 攻击者构造出自己的恶意url
- 直接执行可执行的恶意代码
Dom型 Browser
取出和执行恶意代码的操作,由浏览器完成,属于前端 JavaScript ⾃身的安全漏洞,⽽其他两种 XSS 都属于服务端的安全漏洞。
攻击步骤:
攻击者构造出特殊的 URL,其中包含恶意代码。
⽤户打开带有恶意代码的 URL。
⽤户浏览器接收到响应后解析执⾏,前端 JavaScript 取出 URL 中的恶意代码并执⾏。
恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站的接⼝执⾏攻击者指定的操作。
# 3、防范攻击
主旨:防止攻击者提交恶意代码,防止浏览器执行恶意代码
对数据进行严格的输入编码:
- html元素的编码、js编码、css编码、url编码等;
- 避免拼接html,eg:Vue/React技术栈,避免使用v-html/dangerouslyHtml
CSP:http header,即Content-Security-Policy,旧浏览器可以设置X-XSS-Protection
- default-src 'self':所有内容均来⾃站点的同⼀个源(不包括其⼦域名)
- default-src ‘self’ *.trusted.com:允许内容来⾃信任的域名及其⼦域名 (域名不必须与CSP设置所在的域名相同)
- default-src https://baidu.com:该服务器仅允许通过HTTPS⽅式并仅从lubai.com域名来访问⽂档
输入验证:phone,url,电话号码,邮箱做校验判断
开启浏览器的XSS防御:http only Cookie,禁止js读取cookie值,完成xss注入也无法窃取cookie,eg:set-cookie,httponly
验证码
# 2、CSRF
# 1、概念
Cross-Site request forgery,跨站请求伪造:攻击者诱导受害者进⼊恶意⽹站,在第三⽅⽹站中,向被攻击⽹站发送跨站请求。利⽤受害者在被攻击⽹站已经获取的注册凭证,绕过后台的⽤户验证,达到冒充⽤户对被攻击的⽹站执⾏某项操作的⽬的。
攻击步骤:
- 受害者登录a.com,并且保留了登录凭证cookie
- 攻击者诱导受害者访问b.com
- b.com向a.com发送请求,a.com/xxxx,浏览器就会直接带上a.com的cookie
- a.com收到了请求,验证通过后,执行相应操作
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作
# 2、攻击类型
GET型:如在⻚⾯的某个 img 中发起⼀个 get 请求
POST型:通过⾃动提交表单到恶意⽹站
# 3、如何防范
CSRF一般发生在第三方域名,攻击者无法获取到cookie信息,只是利用浏览器机制使用cookie
- 同源策略
- 通过检查request header中的origin、referer、host等,判断请求站点是否是自己允许的站点。
- host:任何请求携带,域名和端口号
- origin:一般存在于跨域请求中,协议和域名,和Access-Control-Allow-Origin一起存在
- referer:告知服务器原始url,其用于所有类型的请求,并且包括:协议+域名+查询参数
- Referrer-Policy:可设置携带referer头,eg:Referrer-Policy: no-referrer|same-origin等。
- 通过检查request header中的origin、referer、host等,判断请求站点是否是自己允许的站点。
- Cookie SameSite
- Strict:完全禁止第三方cookie,⽐如a.com的⻚⾯中访问 b.com 的资源,那么a.com中的cookie不会被发送到 b.com服务器,只有从b.com的站点去请求b.com的资源,才会带上这些Cookie
- Lax:在跨站点的情况下,从第三⽅站点链接打开和从第三⽅站点提交 Get⽅式的表单这两种⽅式都会携带Cookie。但如果在第三⽅站点中使⽤POST⽅法或者通过 img、Iframe等标签加载的URL,这些场景都不会携带Cookie
- None:任何情况下都会发送 Cookie数据
- CSRF Token:提交请求时携带额外信息
- 用户打开页面的时候,服务器生成一个token
- 每次页面加载的时候,加到所有的能发请求的html元素上, ⽐如form, a
- 每次前端发起请求, 都携带Token参数
- 服务端每次接收请求, 都校验Token的有效性
# 2、node相关
- 本地文件操作相关,路径拼接导致的文件泄露
- ReDos
- 时序攻击
- ip origin referrer等request headers的校验
# 1、文件泄露
问题描述:静态文件服务,用户可通过输入路径获取私密文件
解决方法:
- express:static
- koa:中间件koa-static
- npm包:resolve-path
# 2、ReDos
问题描述:正则表达式攻击,服务器经常会有正则去匹配⼀些传⼊的参数, 所以攻击者就可以利⽤正在表达式的这个特性, 来⼀直占⽤服务器运算资源, 造成服务器宕机。
正则表达式⼀般情况下会去匹配第⼀种可能性,直接匹配到最后发现成功了, 耗时就很短;每当⼀次匹配不成功, 就会尝试回溯到上⼀个字符, 看看能不能有其他的组合来匹配到这个字符串.
# 3、时序攻击
根据服务器的响应时间来碰撞出realArray的值。