Bash 在特定传入请求后显示乱码

ada*_*czi 1 bash string http

我设置了一个新的基本 Linux 服务器(在本例中为 CentOS),仅用于测试目的。在那里,没有任何防火墙,我正在运行 Python Web 应用程序。基本上,我python run.py在前台输入并让应用程序运行,而应用程序本身在类似 的某个端口上运行8080,因此在 Web 浏览器中,我只需输入my_public_ip_addr:8080并使用它就好了。所有这一切都通过我的笔记本电脑上的 SSH 发生。

现在,我让我的笔记本电脑打开了一段时间,当我回来时,外壳显示如下内容:

83.20.238.86 - - [13/Mar/2019 08:54:43] "GET / HTTP/1.1" 200 -
87.122.83.97 - - [13/Mar/2019 11:55:30] "GET / HTTP/1.1" 200 -
176.32.33.145 - - [13/Mar/2019 12:08:36] "GET / HTTP/1.1" 200 -
176.32.33.145 - - [13/Mar/2019 12:08:36] code 400, message Bad request syntax ('\x16\x03\x01\x00\xfc\x01\x00\x00\xf8\x03\x03(\xd3FM\xf5\x0eLo\x17\xa3|\x1f8\xca~#\x07\xc1\x1f&&\x14\x19\x11\x10:\x824\xd23nA\x00\x00\x8c\xc00\xc0,\xc02\xc0.\xc0/\xc0+\xc01\xc0-\x00\xa5\x00\xa3\x00\xa1\x00\x9f\x00\xa4\x00\xa2\x00\xa0\x00\x9e\xc0(\xc0$\xc0\x14\xc0')
176.32.33.145 - - [13/Mar/2019 12:08:36] "??(M?L???8#?&&:?4?A??????2???/???1???????????(?$??" 4?? ?
176?32?33?145 ? ? [13/M??/2?19 14:55:55] "GET / HTTP/1?1" 2?? ?
176?32?33?145 ? ? [13/M??/2?19 14:55:55] c?de 4??? ?e???±e B?d ?e??e?? ?????? ('\?16\??3\??1\???\?°c\??1\???\???\?°8\??3\??3\?92\?8e\?°7\?9e\?1?\??2\?1e\?°8\?°bb^\?1b\?d1\??1\?1e\?d2\?d1^\?1e/?\?96_(\?beU\??4\?8d?\?d7?\?°e\???\???\?8c\?c??\?c??\?c?2\?c??\?c?/\?c??\?c?1\?c??\???\??5\???\??3\???\??1\???\?9°\???\??4\???\??2\???\???\???\?9e\?c?(\?c?$\?c?\?14\?c?')
176?32?33?145 ? ? [13/M??/2?19 14:55:55] "?????????b^[????±e@ce?????????±e ????±e_±c]$ ^C
[????±e@ce?????????±e ????±e_±c]$ ??±???
C???ec???? ?? 1?4?248?36?8 c???ed?
?d??@±?:·$ 
?d??@±?:·$ 
?d??@±?:·$ 
?d??@±?:·$ ec?? '?e??? ???c? ??e?°???'
?e??? ???c? ??e?°???
?d??@±?:·$ 
Run Code Online (Sandbox Code Playgroud)

您可以看到 3 个对 的最后“正常”GET 请求/,但随后它开始了。我知道它可以修复(link1或link2),这些是一些扫描机器人,但我的问题是:

它是如何工作的,传入的请求破坏了我的终端?

Jde*_*eBP 5

让这成为安全方面的一课。您的程序按原样将网络提供的输入直接转储到其日志中。您将日志输出直接转储到用户终端。你给了互联网上的攻击者控制终端输出的能力。

管你的日志通过cyclog和multilog或类似的,正如我在解释https://unix.stackexchange.com/a/505854/5132,让他们去一套严格的尺寸皑皑的,自动旋转,日志文件,而不是到终端。然后使用将清理控制字符的工具读取这些日志文件。

这里的“坏字符”是众所周知的,并且由 ECMA-35(又名 ISO/IEC 2022)与大量字符集注册表一起标准化。您的终端仿真器实现了 8 位字符集的两个可切换部分,称为“GL”和“GR”。各种标准控制字符和转义序列在四个指定字符集(称为“G0”、“G1”、“G2”和“G3”)之间切换这两个字符。这四个依次通过进一步的转义序列映射到实际字符集。

可能弄乱您的输出的一组字节序列相当大。不仅仅是␎and ␏,因为问题评论会让你相信。两个可移动区域有四种可能的移动,以及锁定和单向移动。用于移位的 C1 控制字符有两种表示形式。然后,四个移位中的每一个都有不到两百个可能的映射字符集,每个都有自己的转义序列。

这是一个相当复杂的系统,如果您此时在想“当然使用 Unicode 更好?” 你不会是第一个。发明者mosh将他们的终端仿真器不实现任何这种字符集切换作为卖点。我的也没有console-terminal-emulator。我们的终端模拟器根本不会遇到这些困难。自 1999 年以来,Markus Kuhn 一直鼓励放弃 ISO 2022 字符集切换。

进一步阅读