天天看點

笨辦法學 Python · 續 練習 51:`lessweb`練習 51:lessweb

練習 51:

lessweb

原文: Exercise 51: lessweb 譯者: 飛龍 協定: CC BY-NC-SA 4.0 自豪地采用 谷歌翻譯

我們很接近這本書的末尾了,是以在最後兩個練習中我将給你一個項目。您将要建立一個 Web 伺服器。在本練習中,您隻需了解 Python

http.server

子產品以及如何建立簡單 Web 伺服器來使用它。我将給你訓示,然後讓你閱讀文檔來了解如何實作它。這裡沒有太多的指導,因為現在你應該可以自己做大部分的事情。

建立 Web 伺服器後,您将會編寫一組測試,來嘗試破壞您的 Web 伺服器。我将在“破壞它”部分中為您提供一些指導,但現在您應該非常樂意在您編寫的代碼中找到缺陷。

挑戰練習

您需要閱讀 Python 3 的

http.server

文檔來起步。您還應閱讀 Python 3 的

http.client

文檔以及

requests

的文檔。您将使用

requests

http.client

為您建立的

http.server

編寫測試。

接下來,您的工作是使用

http.server

建立一的 Web 伺服器,可以執行以下操作:

  • 從配置檔案中進行配置
  • 一直運作并處理收到的請求
  • 提供配置目錄中的檔案
  • 響應網站的請求并提供正确的内容
  • 記錄所有進入檔案的請求,以便之後讀取

如果您閱讀文檔中的示例,您大概可以以基本的方式,讓大部分東西都工作。這個練習的一部分是,如何 Hack 一個樸素的 Web 伺服器,是以你應該隻是讓它能夠工作,然後我們将轉到下一部分。

破壞它

您在本節中的工作是,以任何方式攻擊您的 Web 伺服器。您可以從

OWASP 十大漏洞清單

開始,然後繼續進行其他常見攻擊。您還将閱讀 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

文檔

中的

os.chroot

函數。

研究如何使用這個函數和其他

os

子產品的函數來建立“根目錄限制”。

使用

os

中的許多函數以及您可以找到的任何子產品,重寫您的伺服器,來正确地實作“根目錄限制”,并丢棄權限變成安全使用者(而不是 root)。在 Windows 上,這可能非常困難,是以要麼在 Linux 計算機上嘗試,要麼完全跳過它。