2012-01-23 27 views
4

我想了解在wsgi應用程序中處理文件上傳安全的最佳方式。似乎很多解決方案都涉及使用cgi模塊中的FieldStorage來解析表單數據。根據我對FieldStorage的瞭解,它通過將數據流式傳輸到臨時文件中來執行一些「魔術」。如何限制wsgi中的大文件上傳?

我不是100%清楚的是如何限制包含大於指定數量(比如10MB)的文件的請求。如果有人上傳大小爲幾GB的文件,您顯然希望在請求通過服務器磁盤空間之前阻止該請求?

在wsgi應用程序中限制文件上傳的最佳方式是什麼?

+0

這個問題被標記爲'wsgi'。你直接使用WSGI接口嗎?如果是這樣,那麼控制從'environ ['wsgi.input']'讀取的數據量(並檢查'Content-Length'頭部)應該是一塊蛋糕。 –

回答

3

這取決於您的前端服務器。如果它有任何配置阻止大請求甚至在它進入你的應用程序之前,使用它。

如果你想與您的代碼來阻止這個我看到了兩個辦法:

  • 看吃的Content-Length HTTP頭。如果它比您能處理的大,請立即拒絕該請求。
  • 不要相信標題並開始閱讀請求正文,直到達到限制。請注意,這不是一個非常聰明的方法,但可以工作。 =)

信任HTTP標頭可能會導致您遇到一些問題。請求某個人發送Content-Length:1024的請求,但發送一個1GB請求主體。如果你的前端服務器信任這個頭部,它就會開始讀取這個請求,稍後會發現請求體實際上要大得多。這種情況仍然可能會填滿服務器磁盤,即使是「通過」「太大的檢查」的請求。

儘管可能發生這種情況,但我認爲相信Header會是一個很好的起點。

+1

HTTP服務器不應該處理錯誤的「Content-Length」情況嗎?我認爲符合HTTP/1.1的實現必須拒絕額外的內容。此外,如果他們想要實現HTTP保持活動(否則無法知道下一個請求何時開始),他們必須這樣做。 –

+0

你是對的!但無論如何,找出請求實際上比Content-Length頭部的值大的時候可能會非常棘手。 服務器必須讀取請求,直到它達到Content-Length + 1字節,但也許有更聰明的方法來做到這一點。 –

+0

服務器已經讀取請求,因爲它需要提取標頭並將請求主體從套接字轉發到WSGI應用程序。另外,服務器不能聲稱是HTTP/1.1。如果不執行檢查,則符合要求。 –

相關問題