我在Windows下写了一个HTTP小型服务器。使用通常的 HTTP 身份验证机制(我使用 Windows HTTP API)保护对服务器的访问。但是我不想对本地主机进行身份验证,即本地用户应该能够在没有密码的情况下访问服务器。
问题是:这是保存吗?更准确地说,在没有进一步身份验证的情况下信任 TCP 连接的远程地址是否安全?
假设一个对手(Charly)正试图向我的服务器发送一个恶意 HTTP GET。此外,假设所有 Windows/路由器防火墙对 localhost 地址的入口检查都允许 127.0.0.1 和 [::1] 的源地址通过。
所以远程地址可能会被欺骗,但对于 TCP 连接,我们需要完整的三次握手。因此,在接收到 SYN 时,Windows 会发送 SYN-ACK。这个 SYN-ACK 无处可去,但 Charly 可能会在不久之后发送一个 ACK。如果SYN-ACK 的确认 SEQ 是正确的,则该 ACK将被接受。之后,Charly 可以发送恶意载荷,因为他知道正确的 TCP SEQ 和 ACK 号。
因此,所有安全性都取决于 Windows 的 TCP 传出初始序列号 (ISN) 的不可预测性。我不确定这有多安全,预测下一个会话的 ISN 有多难。
任何见解都值得赞赏。