4、网络安全

厨子大约 6 分钟计算机网络网络安全信息安全面试题原创程序员安全技术

网络安全篇

56. 什么是 XSS 攻击?

它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS 的攻击方式就是想办法“教唆”用户的浏览器去执行一些这个网页中原本不存在的前端代码。

相信以上的解释也不难理解,但为了再具体些,这里举一个简单的例子,就是留言板。

我们知道留言板通常的任务就是把用户留言的内容展示出来。

正常情况下,用户的留言都是正常的语言文字,留言板显示的内容也就没毛病。然而这个时候如果有人不按套路出牌,在留言内容中丢进去一行

<script>alert(“hey!you are attacked”)</script>

那么这个时候问题就来了,当浏览器解析到用户输入的代码那一行时会发生什么呢?答案很显然,浏览器并不知道这些代码改变了原本程序的意图,会照做弹出一个信息框。就像这样

<html>
    <head>
       <title>留言板</title>
    </head>
<body>
<div id=”board”
        <script>alert(“hey!you are attacked”)</script>
</div>

    </body>
</html>

57. 如何解决 xss 攻击?

  • 不相信用户输入:除了不相信用户输入,还应对所有输入进行严格的验证和清理。可以使用白名单原则,只允许符合特定格式的输入。
  • 限制输入长度:不同类型的输入设定合理的长度限制,以防止缓冲区溢出等攻击。
  • HTML 转义:在输出到网页之前,确保对所有用户输入进行 HTML 转义。可以使用现有的库(如 OWASP Java Encoder 或 JavaScript 的 DOM API)来处理转义,以减少出错的可能性。
  • 对跳转型链接进行特殊对待:对于跳转链接,建议使用相对路径而非绝对路径,并确保目标链接的域名在允许的白名单中。此外,可以考虑使用 rel="noopener noreferrer" 属性来防止潜在的安全风险。
  • 使用内容安全策略(CSP):实施 CSP 可以帮助限制哪些资源可以被加载,降低 XSS 攻击的风险。通过配置 CSP,可以阻止不受信任的脚本执行。
  • 使用安全库和框架:使用经过审计的安全库和框架来处理用户输入和输出。许多现代框架(如 React、Angular、Vue)内置了防护机制,可以减少 XSS 风险。

58. 🌟半连接队列和 SYN Flood 攻击的关系

TCP 进入三次握手前,服务端会从 CLOSED 状态变为 LISTEN 状态,同时在内部创建了两个队列:半连接队列(SYN 队列)和全连接队列(ACCEPT 队列)。

什么是半连接队列(SYN 队列) 呢? 什么是全连接队列(ACCEPT 队列) 呢?回忆下 TCP 三次握手的图:

  • TCP 三次握手时,客户端发送 SYN 到服务端,服务端收到之后,便回复 ACK 和 SYN,状态由 LISTEN 变为 SYN_RCVD,此时这个连接就被推入了 SYN 队列,即半连接队列。
  • 当客户端回复 ACK, 服务端接收后,三次握手就完成了。这时连接会等待被具体的应用取走,在被取走之前,它被推入 ACCEPT 队列,即全连接队列。

SYN Flood 是一种典型的 DoS (Denial of Service,拒绝服务) 攻击,它在短时间内,伪造不存在的 IP 地址,向服务器大量发起 SYN 报文。当服务器回复 SYN+ACK 报文后,不会收到 ACK 回应报文,导致服务器上建立大量的半连接半连接队列满了,这就无法处理正常的 TCP 请求啦。

主要有 syn cookie 和 SYN Proxy 防火墙 等方案应对:

  • syn cookie:在收到 SYN 包后,服务器根据一定的方法,以数据包的源地址、端口等信息为参数计算出一个 cookie 值作为自己的 SYNACK 包的序列号,回复 SYN+ACK 后,服务器并不立即分配资源进行处理,等收到发送方的 ACK 包后,重新根据数据包的源地址、端口计算该包中的确认序列号是否正确,如果正确则建立连接,否则丢弃该包。
  • SYN Proxy 防火墙:服务器防火墙会对收到的每一个 SYN 报文进行代理和回应,并保持半连接。等发送方将 ACK 包返回后,再重新构造 SYN 包发到服务器,建立真正的 TCP 连接。

59. socket 的执行过程

有几个关键点:

  • connect 位置进行三次握手
  • IO 多路复用发生在 accept 函数之后
  • 监听的是已经建立好连接准备发送数据的 socket
  • 说 TCP 的 socket 就是一个文件流,是非常准确的。因为,socket 在 Linux 中就是以文件的形式存在的。除此之外,还存在文件描述符,写入和读出,也是通过文件描述符。
  • socket 是一个文件,那么就有文件描述符,socket 对应的文件不是存在磁盘中的,是存在内存中的,方便快速传输。
  • 服务端一般是 listen 一个端口,然后理论上的最大连接数,则和客户端 ip 地址的数目和端口号的数目有关,则是 2^32 * 2^16次方。但是现实中不能够连接那么多,因为 socket 文件是存储在内存中的,有内存限制,而且文件描述符的个数也有所限制。