Skip to content

Latest commit

 

History

History
115 lines (81 loc) · 3.86 KB

网络安全.md

File metadata and controls

115 lines (81 loc) · 3.86 KB

前端安全

你了解哪些前端安全相关的知识?或者说你了解哪些名词?

浏览器相关:

  1. XSS
  2. XSRF
  3. HTTPS
  4. CSP(Content-Security-Policy): 内容安全策略,可以禁止加载外域的代码,禁止外域的提交
  5. HSTS: 强制使用 https 与服务器建立连接
  6. X-Frame-Options: 控制当前页面是否允许被嵌入到 iframe 中
  7. SRI(Subresource Integrity): 检查获得的子资源(例如从CDN)是否被篡改。将使用 base64 编码后文件哈希值写入 script 或 link 标签的 integrity 属性
  8. Referer-Policy: 控制 referer 的携带策略

Node(服务端)相关:

  1. 本地文件操作相关:路径拼接导致的文件泄露(拼接后的路径读取到了不该读取的文件)
  2. ReDOS:正则表达式攻击(地狱式回溯)。当编写校验的正则表达式存在缺陷或者不严谨时, 攻击者可以构造特殊的字符串来大量消耗服务器的系统资源,造成服务器的服务中断或停止
  3. 时序攻击
  4. ip origin referrer 等 request headers 的校验

你可以稍微详细介绍一下XSS吗?

XSS(Cross-site scripting)跨站脚本攻击,攻击者利用这种漏洞在网站上注入恶意攻击的代码

从外在表现上,有哪些攻击场景呢?

  1. 评论区植入JS代码(即可输入的地方)
  2. url 上拼接JS代码

从技术角度上,有哪些类型的XSS攻击呢?

  • 存储型XSS

注入型脚本永久存储在目标服务器上,当浏览器请求数据时,脚本从服务器上传回并执行

攻击步骤:

  1. 攻击者将恶意代码提交到目标网站的数据库中。
  2. 用户打开目标网站的时候,服务器将恶意代码从数据库中取出,拼接到 html 返回给浏览器
  3. 用户浏览器接收到 html 后,混在其中的恶意代码就会被执行
  4. 窃取用户数据,发送到攻击者网站
  • 反射型XSS

攻击者结合各种手段,诱导用户点击恶意的url

攻击步骤:

  1. 攻击者构造出自己恶意的url
  2. 直接执行可执行的恶意代码
  • 基于DOM的XSS

DOM型的XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞

如何防范XSS攻击呢?

主旨:防止攻击者提交恶意代码,防止浏览器执行恶意代码

  1. 对数据进行严格的输入编码。比如 html 元素,js, css, url
  2. CSP(内容安全策略) default-src 'self'
  3. 输入验证
  4. 开启浏览器的XSS防御:http only,浏览器无法获取 cookie
  5. 验证码

能在详细介绍一下CSRF吗?

CSRF(Cross-site Request Forgery)跨站请求伪造,是一种冒充受信任的用户,向服务器发送非预期请求的攻击方式。

攻击步骤:

  1. 受害者登录了 a.com,并且保留了登录凭证 cookie
  2. 攻击者诱导受害者访问了 b.com
  3. b.com 向 a.com 发送请求,a.com/xxx,浏览器会直接带上 a.com 的 cookie
  4. a.com 收到请求了,忠实的执行了对应的操作
  5. 攻击者在受害者不知情的情况下,冒充受害者让 a.com 执行了攻击者定义的操作

如何防范CSRF攻击?

CSRF一般都是发生在第三方域名,攻击者无法获取到cookie信息

  • 阻止第三方域名的访问

    1. 同源检测
    2. Cookie SameSite
  • 提交请求的时候附加额外信息

    1. Token
    2. 双重Cookie(第二个cookie不是http only的,还是可能被攻击)
    3. 设置白名单,仅支持安全域名请求
    4. 验证码

时序攻击

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