6

read()メモリを使うので、その操作は本当に怖いです。たとえば、1 GB のファイルをアップロードすることで、誰かが私のサーバーに DDoS 攻撃を仕掛けることができますよね?

name = request.forms.get('name')
data = request.files.get('data')
if name and data.file:
    raw = data.file.read() # This is dangerous for big files
    filename = data.filename
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))

アップロードされたファイルのサイズを取得するための安全な解決策はありますか? 1 つの推測として、ファイル システムからファイル サイズを取得することが考えられます。request.files.get('data')おそらく一時ファイルのどこかに保存されていますよね?

4

2 に答える 2

2

一度に 1 つずつ、データのチャンクを読み取ることができるかどうかを確認できますか。

これが可能な場合:

name = request.forms.get('name')
data = request.files.get('data')
raw = ""
if name and data.file:
    while True:
        datachunk = data.file.read(1024)
        if not datachunk:
            break
        raw = raw + datachunk

    filename = data.filename
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))

これが可能であれば、読み取るファイルのサイズに関する追跡メカニズムを追加し、それを超えた場合はこの操作を中止することもできるはずです。

これは、DDOS の可能な方法の 1 つだけを解決します。

于 2012-06-27T02:29:20.237 に答える
-3

これは興味深い質問です。通常、ファイルオブジェクトの統計を取得するか、os.pathを使用してサイズを取得します。この質問は以前に取り上げられました。

ただし、アップロードに時間を費やす前に、サーバーからクライアント側のファイルサイズを通知する方法について質問しています。これを行う最良の方法はJavaScriptを使用することだと思います。この質問は、JavaScriptコードをBottlePyアプリケーションに取り込む方法を始めるのに役立ちます。

JavaScriptを使用して入力を検証し、サーバーコードでファイルが制限内にあると想定できるようにします。これを理解したら、BottlePyの人々にこれのサポートをBaseRequest.filesサポートに直接追加するように依頼することをお勧めします。

于 2012-06-27T02:55:23.607 に答える