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 文件是存储在内存中的,有内存限制,而且文件描述符的个数也有所限制。
