跳到主要内容

题目 21 - 题目 25

21.webSocket 有哪些安全问题,应该如何应对?​

WebSocket 可能遇到的安全问题

  • 跨站脚本攻击(XSS): 攻击者可能通过 WebSocket 连接向用户发送恶意脚本,如果服务器没有适当过滤和验证用户输入,这些脚本可能会被浏览器执行。

  • 跨站请求伪造(CSRF): WebSocket 连接可能被用于执行未经授权的操作,尤其是当身份验证和授权机制存在缺陷时。

  • 中间人攻击(MitM): 攻击者可能截获和篡改 WebSocket 连接,窃取用户敏感信息或操纵通信内容。

  • 拒绝服务(DoS)攻击: 恶意用户可能通过大量的并发 WebSocket 连接或发送大量的消息来耗尽服务器资源。

  • 未加密的通信: 如果 WebSocket 连接未通过 TLS/SSL 加密,则传输的数据可能被截获和读取。

  • 身份验证和授权问题: WebSocket 协议本身不处理授权或身份验证,需要应用程序层来确保只有经过授权的用户才能建立连接。

应对策略

  1. 使用 TLS/SSL 加密: 使用 wss://协议代替 ws://协议,确保 WebSocket 通信过程中的数据加密,防止中间人攻击。

  2. 输入验证和过滤: 对从用户输入中获取的数据进行严格的验证和过滤,确保输入数据的安全性,防止 XSS 攻击。

  3. 身份验证和授权: 在 WebSocket 连接建立时,进行适当的身份验证和授权,确保只有经过授权的用户可以建立连接和发送消息。

  4. CSRF 防御: 使用 CSRF 令牌等机制来验证 WebSocket 请求的来源,确保请求来自合法用户。

  5. 资源限制: 实施适当的资源限制和控制,例如限制每个用户的并发连接数或消息发送频率,以防止资源耗尽攻击。

22.cookie 怎么设置只在 https 下生效​

设置 cookie 的 secure 属性确实是确保 cookie 只在 HTTPS 请求中携带的方法。这个属性可以防止 cookie 在非安全连接(如 HTTP)中被泄露,因为在不安全的连接上传输 cookie 可能会被中间人攻击者截获。

  • 设置 secure 属性:在设置 cookie 时,通过指定 secure 属性,可以确保 cookie 只在 HTTPS 请求中被发送。
  • 默认行为:如果不设置 secure 属性,cookie 会在 HTTP 和 HTTPS 请求中都被发送。
  • 安全性注意:即使设置了 secure 属性,cookie 本身的内容在客户端仍然可见,因此不应该在 cookie 中存储敏感信息。
  1. 客户端设置:在发起跨域请求时,将 withCredentials 属性设为 true。

    • XMLHttpRequest 示例:xhr.withCredentials = true;
    • Fetch API 示例:fetch(url, { credentials: 'include' });
  2. 服务端处理 CORS:服务器端需配置允许跨域请求携带 Cookie。

    • Express 框架使用 cors 中间件,并设置 credentials: true。
    • 其他后端或原生 Node.js 需设置响应头:
测试代码
response.setHeader('Access-Control-Allow-Origin', 'http://example.com')
response.setHeader('Access-Control-Allow-Credentials', 'true')

24.DNS 预解析是什么?怎么实现?​

DNS 预解析(DNS Prefetching)是一种浏览器行为,它会提前解析将来可能需要访问的域名,以加快页面的加载速度。

  1. 使用 link 标签:在 HTML 文档的<head>部分添加<link>标签,指定 rel="dns-prefetch"属性,指定要预解析的域名。
  2. 使用 meta 标签:在 HTML 文档的<head>部分添加<meta>标签,指定 http-equiv="x-dns-prefetch-control"属性为 on,开启 DNS 预解析。
  3. 使用 script 标签:在 HTML 文档的<head>部分添加<script>标签,指定 src 属性为 dns-prefetch 的 URL,指定要预解析的域名。 通过这些方法,浏览器会在 HTML 文档解析过程中提前解析指定的域名,当需要访问该域名时,可以直接使用解析好的 IP 地址,从而加快页面的加载速度。

25.说说 WebSocket 和 HTTP 的区别​

HTTP 协议​

  • 单向通信:客户端发送请求,服务器发送响应。
  • TCP 连接:每个 HTTP 请求都会建立一个 TCP 连接,并在响应后关闭连接。从 HTTP/1.1 开始,默认使用长连接,通过 Connection: keep-alive 头部字段保持连接。
  • 无状态:每个请求都是独立的,服务器不会记住之前的请求。
  • 应用层协议:在传输层使用 TCP,网络层使用 IP。
  • ASCII 编码:HTTP 消息使用 ASCII 编码。

WebSocket 协议​

  • 双向通信:客户端和服务器之间的连接保持活动状态,直到双方都关闭连接。
  • 有状态:连接一旦建立,客户端和服务器就可以相互发送消息。
  • 全双工:客户端和服务器可以同时发送和接收消息。
  • 状态代码 101:WebSocket 连接使用状态代码 101,表示从 HTTP 升级到 WebSocket。
Loading Comments...