练习 52:moreweb
原文:Exercise 52: moreweb 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译
现在,你已经使用 Python http.server
库创建了一个 Web 服务器。你已经进行到最后一个项目了。你将使用你至今为止所学到的所有东西,从无到有创建你自己的 Web 服务器。在练习 51 中,你创建了大部分操作,它在http.server
模块“上面”。你没有进行任何网络连接处理或 HTTP 协议解析。在最后的练习中,你将为你的lessweb
服务器复制http.server
(所做的一切),并实现所有必要的零件。
挑战练习
为了完成此练习,你将需要阅读 Python 3 asyncio
模块的文档。这个库为你提供了工具,用于处理套接字请求,创建服务器,等待信号,以及大部分所需的其它东西。如果你想要一个额外的挑战,那么你可以使用 Python 3 select
模块,它提供了更低的级别的 API 来处理套接字。你应该使用此文档,来创建一系列小型套接字服务器和客户端。
一旦你了解如何创建通过 TCP/IP 套接字通话的服务器和客户端,则需要转而处理 HTTP 请求。该项目的这一部分将十分艰巨,因为 HTTP 标准丧心病狂,并且比其需要更复杂。我将从你可以设计的,最简单的 HTTP 解析库开始,然后用越来越多的样本进行扩展。第一个起始位置是 RFC 7230,但准备好体验一些人类搞出来的,最糟糕的写作。
研究 RFC 7230 的最佳方式是,首先提取“ABNF 汇总”附录中列出的所有语法。一眼看去,这似乎是疯狂的,因为这只是一个巨大的语法规范。你实际上在这本书的第五部分中,学到了如何阅读它,但是规模较小。你知道正则表达式,扫描器和解析器的工作原理,以及如何阅读这样的语法。所有你需要做的是研究这种语法,并一次实现一点。在实现它的时候,我将完全忽略任何“块”语法。
一旦你研究了这个语法,你应该开始为 HTTP 编写解析器,使用你已经创建的东西。使用你的数据结构,解析工具以及任何东西,来为 HTTP 的小型子集创建解析器。覆盖尽可能多的这种语法。为了帮助你,有一组测试文件,其中具有有效的 HTTP 请求,请访问 https://learncodethehardway.org/more-python-book/http_tests.zip。你可以下载这组测试用例,并通过你的解析器运行它们,来确保它有用。我从杰出的 And-HTTP 服务器中提取了许多这些测试用例,然后用更基本的例子来扩展它们。你的目标是使它们尽可能多地通过。
最后,一旦你有了一种方式,来编写一个良好的asyncio
或者select
套接字服务器,和一种解析 HTTP 的方式,你可以把它们放在一起,制作你的第一个带有功能的 Web 服务器。
破坏它
你一定要试图破坏这个 Web 服务器,但你也应该在这里尝试不同的东西。你已经编写了一个 HTTP 解析器,尝试使用 RDP 风格的解析器,以最合理的方式处理有效的 HTTP。你的解析器有很好的机会,来阻止许多不好的 HTTP 请求,所以找到一些以前的攻击,并在你的 Web 服务器上尝试它们。有几个网站上有自动化黑客工具,所以获取一个并将其对准你的服务器。但是要小心,并确保你只运行著名的测试工具,并且只在你自己的服务器上。
深入学习
如果你想完全了解 Web 服务器和技术,请使用你的moreweb
服务器来创建 Web 框架。我建议先创建一个网站,然后从 Web 框架中提取出所需的模式。这种框架的目标是,封装你使用的模式,以便你可以简化后续的 Web 应用程序。与lessweb
和moreweb
的练习一样,你的目标也应该是研究,实现和利用 Web 框架的常见攻击。
如果你想深入 TCP/IP,我推荐 Jon C. Snader 的《Effective TCP/IP Programming》一书。这本书是用 C 语言写的,但它实际上是“笨办法学 TCP/IP》,涵盖 44 个主题,为你准备了简单的代码来了解基本的 TCP/IP 的工作原理。C 语言是 TCP/IP 的出生地,其他语言处理套接字连接的方式似乎很奇怪,直到你知道 C 语言是如何实现它的。通过研究它,你将会深入了解套接字服务器的工作原理。唯一的警告是这本书有点过时,所以代码应该工作,但它可能不是最新的代码。