2012-09-30 7 views
8

Meine App-Benutzer laden ihre Dateien in einen Bucket hoch. Wie kann ich sicherstellen, dass jedes Objekt in meinem S3-Bucket über einen eindeutigen Schlüssel verfügt, um das Überschreiben von Objekten zu verhindern?Amazon S3 erstellt eindeutige Schlüssel für jedes Objekt

Im Moment bin ich die Verschlüsselung von Dateinamen mit einem zufälligen Zeichenfolge in meinem PHP-Skript, bevor Sie die Datei auf S3 sendet.

Aus Gründen der Diskussion nehmen wir an, dass der Uploader einen Weg findet, den Dateinamen beim Upload zu manipulieren. Er möchte alle Bilder auf meiner Seite durch ein Bild von banana ersetzen. Was ist ein guter Weg, um das Überschreiben von Dateien in S3 zu verhindern, wenn die Verschlüsselung fehlschlägt?

Edit: Ich glaube nicht, funktioniert die Versionierung, weil ich keine Version-ID in einer Bild-URL, wenn die Anzeige der Bilder von meinem Eimer angeben.

Antwort

3

Sie verschlüsseln oder Hashing? Wenn Sie md5- oder sha1-Hashes verwenden, kann ein Angreifer leicht eine Hash-Kollision finden und Sie auf eine Bananenschale rutschen lassen. Wenn Sie ohne einen zufälligen Initialisierungsvektor verschlüsseln, kann ein Angreifer nach dem Hochladen einiger hundert Dateien möglicherweise Ihren Schlüssel ableiten, und die Verschlüsselung ist wahrscheinlich nicht der beste Ansatz. Es ist rechenintensiv, schwierig zu implementieren, und Sie können einen sichereren Mechanismus für diesen Job mit weniger Aufwand erhalten.

Wenn Sie eine zufällige Zeichenfolge zu jedem Dateinamen voranstellen, eine einigermaßen zuverlässige Quelle von Entropie verwenden, Sie Probleme nicht haben sollten, aber Sie sollten überprüfen, ob die Datei ohnehin bereits vorhanden ist. Obwohl das Codieren einer Schleife zum Prüfen mit S3::GetObject und das Generieren einer neuen Zufallszeichenfolge für eine Aufgabe, die fast nie ausgeführt werden muss, sehr mühsam erscheinen mag, bedeutet "fast nie", dass sie mit hoher Wahrscheinlichkeit eintritt.

+0

Vielen Dank für Ihre Antwort! Ich verschlüssele auf eine zufällige Zeichenfolge. Ich denke, es ist die beste Lösung zu prüfen, ob die Datei bereits existiert, auch wenn ich eine zusätzliche S3-Anfrage mache. Oder wenn ich alle Dateiinformationen in einer Datenbank ablege, kann ich die db-Tabelle mit mysql überprüfen. – CyberJunkie

+1

Wie bereits erwähnt, ist die Verschlüsselung des Dateinamens nicht die effektivste Lösung. Sie können den Namen durch eine zufällige Zeichenfolge ersetzen und die Zuordnungen in Ihrer Datenbank speichern. Schau dir 'openssl_random_pseudo_bytes()' an. –

+2

@TerenceJohnson, "fast nie" kann "willkürlich unwahrscheinlich" sein, indem einfach mehr zufällige Bits hinzugefügt werden. Eine extra Reise nach S3 zu machen wird Ihre Servicezeit beeinträchtigen. – Fantius

0

Überprüfung auf eine Datei mit diesem Namen vor dem Hochladen es funktionieren würde.

Wenn die Datei bereits vorhanden ist, Re-Randomisierung den Dateinamen, und versuchen Sie es erneut.

+11

Eine Datei mit diesem Namen kann erstellt werden, nachdem Sie Ihre Daten überprüft und bevor Sie sie gespeichert haben. Das heißt, die zwei Operationen sind nicht in einer Transaktion. – ivant