cwninja hat Ihnen leider eine Antwort gegeben, die nur bei zufälligen Angriffen funktioniert. Ein intelligenter Angreifer wird keine Mühe haben, diese Prüfung zu umgehen. Es gibt zwei Hauptgründe, warum seine Methode nicht verwendet werden sollte. Erstens garantiert nichts, dass die Informationen in einer HEAD-Antwort mit der entsprechenden GET-Antwort übereinstimmen. Ein korrekt arbeitender Server wird dies sicherlich tun, aber ein böswilliger Akteur muss sich nicht an die Spezifikation halten. Der Angreifer könnte einfach eine HEAD-Antwort senden, die eine Content-Length angibt, die unter dem von Ihnen festgelegten Schwellenwert liegt, und Ihnen dann in der GET-Antwort eine riesige Datei übermitteln. Aber das deckt nicht einmal die Möglichkeit ab, dass ein Server eine Antwort mit dem Header Transfer-Encoding: chunked zurückschickt. Eine Chunked-Antwort könnte unter Umständen niemals enden. Ein paar Leute, die Ihren Server auf nie endende Antworten hinweisen, könnten einen trivialen Angriff auf die Ressourcenerschöpfung durchführen, selbst wenn Ihr HTTP-Client eine Zeitüberschreitung erzwingt.
Um dies korrekt zu tun, müssen Sie eine HTTP-Bibliothek verwenden, die es Ihnen ermöglicht, die Bytes zu zählen, während sie empfangen werden, und abzubrechen, wenn die Schwelle überschritten wird. Ich würde wahrscheinlich empfehlen Kandare und nicht Net::HTTP. (Kann man das überhaupt mit Net::HTTP machen?) Wenn Sie die on_body und/oder on_progress Callbacks verwenden, können Sie die eingehenden Bytes zählen und mitten in der Antwort abbrechen, wenn Sie eine zu große Datei erhalten. Offensichtlich, da cwninja Wie bereits erwähnt, sollten Sie den Vorgang auch abbrechen, wenn Sie einen Content-Length-Header erhalten, der größer ist als Ihr Schwellenwert. Curb ist auch deutlich schneller als Net::HTTP .