前端安全

XSS,CSRF

XSS

XSS(Cross-site script,跨站脚本攻击)是⼀种⽹站应⽤程式的安全漏洞攻击,是代码注⼊的⼀种。它允许恶意使⽤者将程式码注⼊到⽹⻚上,其他使⽤者在观看⽹⻚时就会受到影响。这类攻击通常包含了HTML以及使⽤者端脚本语⾔。

如何攻击

  • XSS 通过修改 HTML 节点或者执⾏ JS 代码来攻击⽹站。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
  • XSS 分为三种:反射型存储型DOM-based
    • 存储型:这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。存储型 XSS 的恶意代码存在数据库里。
    • 反射型:反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。反射型 XSS 的恶意代码存在 URL 里。
    • DOM型:DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
  • 不可信内容:
    • 来自用户的UGC信息
    • 来自第三方的链接
    • URL参数
    • POST参数
    • Referer(可能来自不可信的来源)
    • Cookie(可能来自其他子域注入)

如何防御

  • 最普遍的做法是转义html内容,转为html实体。
  • 使用白名单过滤,只保留需要的格式(js-xss)。
  • CSP(Content-Security-Policy,内容安全策略),使用HTTP Header中的 Content-Security-Policy来开启CSP,本质也是建立白名单,规定浏览器只能执行特定来源的代码。
  • 输入内容长度控制:对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。
  • 验证码、密码:防止脚本冒充用户提交危险操作。

CSRF

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

如何攻击

  • 受害者登录a.com,并保留了登录凭证(Cookie)。
  • 攻击者引诱受害者访问了b.com。
  • b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
  • a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
  • a.com以受害者的名义执行了act=xx。
  • 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。

如何防御

CSRF有两个特点:

  • CSRF(通常)发生在第三方域名。
  • CSRF攻击者不能获取到Cookie等信息,只能冒用。
    针对这两点来防御:
  • 阻止不明外域的访问
    • 同源检测:可以使用Origin HeaderReferer Header确认请求来源,无法确认建议直接进行阻止。
    • Samesite Cookie:Set-Cookie响应头新增Samesite属性,该属性设置 Cookie 不随着跨域请求发送,该属性可以很⼤程度减少 CSRF 的攻击。
  • 提交时附加本域才能获取到的信息
    • Token:服务器下发⼀个随机 Token,每次发起请求时将 Token 携带上,服务器验证 Token 是否有效。

参考