浏览器相关:
- XSS
- XSRF
- HTTPS
- CSP(Content-Security-Policy): 内容安全策略,可以禁止加载外域的代码,禁止外域的提交
- HSTS: 强制使用 https 与服务器建立连接
- X-Frame-Options: 控制当前页面是否允许被嵌入到 iframe 中
- SRI(Subresource Integrity): 检查获得的子资源(例如从CDN)是否被篡改。将使用 base64 编码后文件哈希值写入 script 或 link 标签的 integrity 属性
- Referer-Policy: 控制 referer 的携带策略
Node(服务端)相关:
- 本地文件操作相关:路径拼接导致的文件泄露(拼接后的路径读取到了不该读取的文件)
- ReDOS:正则表达式攻击(地狱式回溯)。当编写校验的正则表达式存在缺陷或者不严谨时, 攻击者可以构造特殊的字符串来大量消耗服务器的系统资源,造成服务器的服务中断或停止
- 时序攻击
- ip origin referrer 等 request headers 的校验
XSS(Cross-site scripting)跨站脚本攻击,攻击者利用这种漏洞在网站上注入恶意攻击的代码
从外在表现上,有哪些攻击场景呢?
- 评论区植入JS代码(即可输入的地方)
- url 上拼接JS代码
从技术角度上,有哪些类型的XSS攻击呢?
- 存储型XSS
注入型脚本永久存储在目标服务器上,当浏览器请求数据时,脚本从服务器上传回并执行
攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站的时候,服务器将恶意代码从数据库中取出,拼接到 html 返回给浏览器
- 用户浏览器接收到 html 后,混在其中的恶意代码就会被执行
- 窃取用户数据,发送到攻击者网站
- 反射型XSS
攻击者结合各种手段,诱导用户点击恶意的url
攻击步骤:
- 攻击者构造出自己恶意的url
- 直接执行可执行的恶意代码
- 基于DOM的XSS
DOM型的XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞
主旨:防止攻击者提交恶意代码,防止浏览器执行恶意代码
- 对数据进行严格的输入编码。比如 html 元素,js, css, url
- CSP(内容安全策略) default-src 'self'
- 输入验证
- 开启浏览器的XSS防御:http only,浏览器无法获取 cookie
- 验证码
CSRF(Cross-site Request Forgery)跨站请求伪造,是一种冒充受信任的用户,向服务器发送非预期请求的攻击方式。
攻击步骤:
- 受害者登录了 a.com,并且保留了登录凭证 cookie
- 攻击者诱导受害者访问了 b.com
- b.com 向 a.com 发送请求,a.com/xxx,浏览器会直接带上 a.com 的 cookie
- a.com 收到请求了,忠实的执行了对应的操作
- 攻击者在受害者不知情的情况下,冒充受害者让 a.com 执行了攻击者定义的操作
CSRF一般都是发生在第三方域名,攻击者无法获取到cookie信息
-
阻止第三方域名的访问
- 同源检测
- Cookie SameSite
-
提交请求的时候附加额外信息
- Token
- 双重Cookie(第二个cookie不是http only的,还是可能被攻击)
- 设置白名单,仅支持安全域名请求
- 验证码
function compareArray(realArray, userInputArray) {
for (let i = 0; i < realArray.length; i++) {
if (realArray[i] !== userInputArray[i]) {
return false
}
}
return true
}
比如 realArray = [2, 3, 6, 1]
攻击者尝试 inputArray = [1, 2] inputArray = [1, 3]
发现响应时间几乎一致,则可以认为数组第一项不是1
然后尝试 inputArray = [2, 1] 发现响应时间明显加长了,则认定数组第一项是2