# XSS 攻击
# 概念
XSS 指的是跨站脚本攻击,是一种代码注入攻击,本质是网站没有对恶意脚本进行过滤,导致其和普通代码混在了一起,最终被浏览器执行。
# 可以进行的操作
- 获取页面的数据,比如 DOM,cookie,localStorage,sessionStorage
- DOS 攻击,向服务器发送大量的请求,占用服务器资源,导致用户无法访问服务器
- 破坏页面结构
- 流量劫持(将链接指向其他网站)
# XSS 攻击类型
- 存储型 XSS 攻击
指的是恶意脚本会存储在服务器上,等到浏览器请求数据的时候,恶意脚本会返回,并执行。 - 反射型 XSS 攻击
指的是诱导用户访问一个带有恶意代码的 url 后,服务器接收到数据后,把带有恶意代码的数据返回给浏览器,浏览器解析带有恶意脚本的数据,当作脚本执行,进行 XSS 攻击 - DOM 型 XSS 攻击
指的是直接通过操作 DOM 节点进行 XSS 攻击
# 如何防御 XSS 攻击
- 前端程序员永远不要相信用户提交的数据,在进行拼凑 HTML 的时候,应该对字符串进行必要的转义,要考虑到拿来拼串的字符串可能带有恶意脚本。
- 使用 CSP,CSP 的本质是建立一个白名单,这个白名单可以告诉浏览器哪些外部资源可以加载和执行,避免恶意代码的注入攻击。
- 对敏感信息进行保护,比如对 cookie 使用
http-only
,使得脚本无法获取,或者使用验证码,避免脚本伪装成用户。
# CSRF 攻击
# 概念
CSRF 攻击是一种跨站伪造请求攻击,攻击者诱导用户进入一个第三方网站,然后这个第三方网站就会向被攻击网站发送跨站请求,如果用户保持了登录状态,那么攻击者就会利用这个登录状态,冒充用户执行一些操作。
其本质是利用 cookie 会在同源请求中携带发送给服务器,以此来实现用户的冒充。
# 常见的攻击类型
- GET 类型的 CSRF 攻击,比如在 img 标签里面构造一个请求,当用户打开这个网站的时候,就会发送请求。
- POST 类型的 CSRF 攻击,比如构建一个表单,然后隐藏他,当用户进入页面的时候自动提交表单
- 链接类型的 CSRF 攻击,构造一个 a 标签,然后用户点击的时候触发攻击。
# 怎么防止 CSRF 攻击
- 同源检测
服务器更具请求头中的 origin 和 referer 来判断请求是否来自允许访问的站点,但是 referer 可以仿造,并且会把搜索引擎的链接也给屏蔽了 - 利用 token 进行验证
服务器向用户返回一个 token,然后用户每次请求的时候都要带 token,服务器再对这个 token 进行验证,缺点是给每个请求都加上 token 比较繁琐,并且如果请求经过负载均衡转移到了其他服务器,然后其他服务器的 session 中没有存储 token,就无法验证。 - 利用 cookie 进行双重验证
用户在访问页面的时候,服务器向其域名添加一个 cookie,然后用户再次向服务器发送请求的时候,将这个 cookie 添加到 url 的参数中,服务器根据 cookie 中的数据和参数中的数据进行对比来验证。 - 在设置 cookie 属性的时候设置 Samesite,限制 cookie 不能被第三方使用。
# 中间人攻击
# 概念
中间人攻击是指攻击者分别与通信的两端建立联系,交换其所收到的数据,让通信的两端认为他们正在通过一个私密的链接直接与对方对话,攻击者可以拦截双非的对话,并插入新的内容。
# 攻击过程
- 客户端发送请求到服务端,请求被中间人截获
- 服务端向客户端返回公钥
- 公钥被中间人截获,并生成一个伪造的公钥返回给客户端
- 客户端收到伪造的公钥后,用伪造的公钥生成加密 hash 值发给服务器。
- 中间人用自己的私钥解密获取真密钥,然后同时生成一个伪造的 hash 值发给服务器
- 服务器用私钥解密获取假密钥,然后加密数据返回给客户端。