1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-28 12:02:19 +00:00
lmpythw-zh/ex51.md
wizardforcel a4a6eed1a1 ex51
2017-08-16 17:39:23 +08:00

45 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 练习 51`lessweb`
> 原文:[Exercise 51: lessweb](https://learncodethehardway.org/more-python-book/ex51.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
我们很接近这本书的末尾了,所以在最后两个练习中我将给你一个项目。你将要创建一个 Web 服务器。在本练习中,你只需了解 Python `http.server`模块以及如何创建简单 Web 服务器来使用它。我将给你指示,然后让你阅读文档来了解如何实现它。这里没有太多的指导,因为现在你应该可以自己做大部分的事情。
创建 Web 服务器后,你将会编写一组测试,来尝试破坏你的 Web 服务器。我将在“破坏它”部分中为你提供一些指导,但现在你应该非常乐意在你编写的代码中找到缺陷。
## 挑战练习
你需要阅读 Python 3 的[`http.server`](https://docs.python.org/3/library/http.server.html)文档来起步。你还应阅读 Python 3 的[`http.client`](https://docs.python.org/3/library/http.client.html)文档以及[`requests`](http://docs.python-requests.org/en/master/)的文档。你将使用`requests``http.client`为你创建的`http.server`编写测试。
接下来,你的工作是使用`http.server`创建一的 Web 服务器,可以执行以下操作:
+ 从配置文件中进行配置
+ 一直运行并处理收到的请求
+ 提供配置目录中的文件
+ 响应网站的请求并提供正确的内容
+ 记录所有进入文件的请求,以便之后读取
如果你阅读文档中的示例,你大概可以以基本的方式,让大部分东西都工作。这个练习的一部分是,如何 Hack 一个朴素的 Web 服务器,所以你应该只是让它能够工作,然后我们将转到下一部分。
## 破坏它
你在本节中的工作是,以任何方式攻击你的 Web 服务器。你可以从 [OWASP 十大漏洞列表](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)开始,然后继续进行其他常见攻击。你还将阅读 Python 3 `os`模块文档来实现一些修复。这是一个额外的错误列表,我敢肯定你会犯这些错误:
+ 非预期的目录遍历。你可能从URL`/some/file/index.html`)中获取基本路径,仅仅按照请求打开它。也许你在操作系统上添加了文件的完整路径(`/Users/zed/web/some/file/index.html`),并认为你做得很好。尝试使用`..`路径说明符来访问此目录外的文件。如果你可以请求`/../../../../../../../../etc/passwd`,那么你赢了。尝试解释为什么会发生这种情况,以及你可以如何解决这个问题。
+ 没有处理非预期的请求。你最有可能寻找`GET``POST`,但如果有人执行`HEAD``OPTIONS`,会发生什么?
+ 发送一个巨大的 HTTP 协议头。看看你是否可以通过发送一个非常大的 HTTP 请求头,使 Python `http.server`崩溃或减慢速度。
+ 请求未知域时不会出现错误。有些人认为它是一个功能咳咳Nginx当服务器无法识别域时会提供“随机”网站。你的服务器应该只是白名单如果它不识别该域它应该给出 404 错误。
这些只是人们所犯的一些小错误。研究尽可能多的其他人,然后为你的服务器编写自动化测试,以便在你解决问题之前展示它们。如果你的服务器中找不到任何这些错误,那么故意创建它们。了解如何犯下这些错误也是有益的。
## 研究性学习
阅读 [Python 3 `os`文档](https://docs.python.org/3/library/os.html)中的`os.chroot`函数。
研究如何使用这个函数和其他`os`模块的函数来创建“根目录限制”。
使用`os`中的许多函数以及你可以找到的任何模块,重写你的服务器,来正确地实现“根目录限制”,并丢弃权限变成安全用户(而不是 root。在 Windows 上,这可能非常困难,所以要么在 Linux 计算机上尝试,要么完全跳过它。