我想了解在wsgi應用程序中處理文件上傳安全的最佳方式。似乎很多解決方案都涉及使用cgi模塊中的FieldStorage來解析表單數據。根據我對FieldStorage的瞭解,它通過將數據流式傳輸到臨時文件中來執行一些「魔術」。如何限制wsgi中的大文件上傳?
我不是100%清楚的是如何限制包含大於指定數量(比如10MB)的文件的請求。如果有人上傳大小爲幾GB的文件,您顯然希望在請求通過服務器磁盤空間之前阻止該請求?
在wsgi應用程序中限制文件上傳的最佳方式是什麼?
我想了解在wsgi應用程序中處理文件上傳安全的最佳方式。似乎很多解決方案都涉及使用cgi模塊中的FieldStorage來解析表單數據。根據我對FieldStorage的瞭解,它通過將數據流式傳輸到臨時文件中來執行一些「魔術」。如何限制wsgi中的大文件上傳?
我不是100%清楚的是如何限制包含大於指定數量(比如10MB)的文件的請求。如果有人上傳大小爲幾GB的文件,您顯然希望在請求通過服務器磁盤空間之前阻止該請求?
在wsgi應用程序中限制文件上傳的最佳方式是什麼?
這取決於您的前端服務器。如果它有任何配置阻止大請求甚至在它進入你的應用程序之前,使用它。
如果你想與您的代碼來阻止這個我看到了兩個辦法:
信任HTTP標頭可能會導致您遇到一些問題。請求某個人發送Content-Length:1024的請求,但發送一個1GB請求主體。如果你的前端服務器信任這個頭部,它就會開始讀取這個請求,稍後會發現請求體實際上要大得多。這種情況仍然可能會填滿服務器磁盤,即使是「通過」「太大的檢查」的請求。
儘管可能發生這種情況,但我認爲相信Header會是一個很好的起點。
HTTP服務器不應該處理錯誤的「Content-Length」情況嗎?我認爲符合HTTP/1.1的實現必須拒絕額外的內容。此外,如果他們想要實現HTTP保持活動(否則無法知道下一個請求何時開始),他們必須這樣做。 –
你是對的!但無論如何,找出請求實際上比Content-Length頭部的值大的時候可能會非常棘手。 服務器必須讀取請求,直到它達到Content-Length + 1字節,但也許有更聰明的方法來做到這一點。 –
服務器已經讀取請求,因爲它需要提取標頭並將請求主體從套接字轉發到WSGI應用程序。另外,服務器不能聲稱是HTTP/1.1。如果不執行檢查,則符合要求。 –
您可以使用您在WSGI應用程序前可能具有的HTTP服務器的功能。例如lighttpd有many options for traffic shaping。
這個問題被標記爲'wsgi'。你直接使用WSGI接口嗎?如果是這樣,那麼控制從'environ ['wsgi.input']'讀取的數據量(並檢查'Content-Length'頭部)應該是一塊蛋糕。 –