2016-03-21 23 views
12

Wenn Sie sich ansehen, wie Websites wie Facebook Profilbilder speichern, scheinen die URLs zufällig generierte Werte zu verwenden. Zum Beispiel Profilbild Seite Facebook-Seite von Google hat die folgende URL:Speicherung von Benutzerdaten

https://scontent-lhr3-1.xx.fbcdn.net/hprofile-xft1/v/t1.0-1/p160x160/11990418_442606765926870_215300303224956260_n.png?oh=28cb5dd4717b7174eed44ca5279a2e37&oe=579938A8 

warum aber nicht nur organisieren es etwa so:

https://scontent-lhr3-1.xx.fbcdn.net/{{ profile_id }}/50x50.png 

Offensichtlich würde dies viel einfacher in Bezug auf die Lagerung und Einfachheit sein. Fehle ich etwas? Vielen Dank.

+0

Das von Interesse sein können, ist es nicht beantwortet Ihre Frage, aber es gibt einen Einblick, wie CDN Urls verwendet Facebook-gebaut werden, und zeigt einige der Probleme mit nicht verdunkeln/Hashing-Parameter in URLs. https://www.lightbluetouchpaper.org/2009/02/11/new-facebook-photo-hacks/ –

+0

Ich stieß vor kurzem auf dieses Video auf Youtube, das genau das (unter anderem) abdeckt: [Wird YouTube jemals auslaufen Video-IDs?] (Https://www.youtube.com/watch?v = gocwRvLhDf8) (Ich bin weder der Typ in diesem Video noch bin ich in irgendeiner Weise mit ihm verbunden, ich denke nur, dass dies interessant zu beobachten ist) – mmgross

Antwort

6

einfach setzen, ich denke, es zwei Hauptgründe einkochen kann: Sicherheit und Cache:

Sicherheit - Hinzufügen dieser langen unberechenbar Hashes andere aus erraten Foto URLs verhindert und macht es ziemlich schwer, Fotos zum Download Sie sind nicht sollst.

Überlegen Sie, was passieren würde, wenn ich Ihre Profilfoto-URL leicht erraten und herunterladen könnte, auch wenn Sie diese explizit nur mit Freunden teilen möchten.

Cache - Indem Sie jedem Foto "zufällige" Abfrageparameter hinzufügen, stellen Sie sicher, dass jede Fotoinstanz eine eigene URL erhält. So können Sie das Foto lange im Cache des Browsers speichern, denn wenn Sie es durch ein neues ersetzen, erhält das neue Foto eine neue URL und der Browser zeigt Ihnen das alte Foto nicht mehr an.

Wenn Sie für jeden Benutzer-Profile Foto, um die gleiche URL zu halten sind (zB https://scontent-lhr3-1.xx.fbcdn.net/{{ profile_id }}/50x50.png) und dann ein neues Foto hochgeladen werden, entweder eine von ihnen kann passieren:

  • Wenn Sie das Foto in dem Browser-Cache gespeichert Der Browser zeigt Ihnen lange Zeit die zwischengespeicherte Version an (solange die URL gleich ist und der Cache nicht abgelaufen ist, muss das Bild nicht erneut heruntergeladen werden).
  • Wenn Sie das Bild stattdessen nur für kurze Zeit im Cache behalten, wird Ihr Server viel mehr als tatsächlich benötigt, was die Auslastung erhöht und die Leistung beeinträchtigt.


Ich hoffe, das es verdeutlicht.

+0

+1 für Cache-Busting. Sicherheit nicht so sehr ... Sicherheit durch Dunkelheit ist schwach, tut aber auch nicht weh. – swestner

+2

10x :) In Bezug auf Sicherheit - es geht nicht um Dunkelheit, es geht darum, ein Geheimnis zu kennen, um auf die Ressource zuzugreifen (was ein solides Sicherheitskonzept ist und wie JSession oder OAUTH-Token funktioniert). Verglichen mit der konstanten URL pro Benutzer, wie es @Psidhu vorgeschlagen hat, ist es viel schwieriger, Zugang zu einem Profilfoto zu erhalten, es sei denn, ich kenne die vollständige URL mit dem "zufälligen" Token. –

3

Wie können Sie mit Ihrem Routenschema verhindern, dass Fremde auf die Bilder eines privaten Kontos zugreifen? Der Hash verhindert auch, dass Bots alle Bilder herunterladen.

7

Unternehmen wie Facebook haben ziemlich intensive CDNs. Sie können wie zufällig generierte URLs aussehen, aber sie sind es nicht, jede einzelne Route ist absichtlich und programmiert, um auf diese Weise behandelt zu werden.

Sie sind nicht nach der Einfachheit der Speicherung wie Sie würden, wenn Sie nur mit einem FTP-Verbindung zu einem grundlegenden Marketing-Website-Server wäre. Während Sie alle Ihre Bilder in einen Ordner/images legen können, ist Facebook dafür viel zu komplex. Dutzende verschiedener Arten von Anwendungen greifen auf Hunderte, wenn nicht Tausende von CDNs und Servern weltweit zu.

Wenn Sie jemals eine Webanwendung erstellen, z. B. eine Ruby on Rails-App, und Sie mit Diensten wie AWS (Amazon Web Services) arbeiten, werden Sie auch auf unsinnige URLs stoßen. Aber das ist alles Teil des schnellen Liefer-Netzwerkes innerhalb der Architektur. Jedes Mal, wenn Sie Ihre App auf den Server "pushen", werden automatisch neue URLs für jede einzelne Ressource generiert, CSS-Dateien, JavaScript-Dateien, Bilddateien usw. werden alle dynamisch erstellt. Sie müssen nicht jede dieser eindeutigen URLs jedes Mal einzeln eingeben, wenn Sie die App veröffentlichen. Der Code weiß einfach, wo Sie nach diesen als Teil des Publishing-Prozesses suchen müssen.

Beispiel: sagen Sie die Web-App für

//= require jquery 

und es kehrt http://example.com/assets/jquery-eb3e278249152b5b5d5170b73d9dbf52.js?body=1 in Ihrem Header zu suchen.

Es spielt keine Rolle, dass die URL komplexer ist, als sie sein sollte, die Anwendung erkennt sie, und darauf kommt es an.

2

Ich bekomme deinen Schmerz :-) Ich bleibe vielleicht nicht bei der Beschreibung, wie dieses Problem mehr auftreten könnte, sondern lass mich eher von einer Lösung sprechen. Nun, es ist normal, dass Code im Allgemeinen mit hashed value oder gar base64ed-Wert vergleichbar ist, aber es scheint, als würde es mit Chaos zu tun haben, aber mit einem Identifier, der erklärt, bleibt es nicht viel!

Ich benutze, um in einer Firma zu arbeiten, die wir verwenden, um Facebook Post zu sammeln, mit Graph API erhalten seine Insights-Objekt und extrahieren Informationen daraus für die einfache Weitergabe innerhalb UI und zurück zu unserem Redis Cache-Speicher senden; und sobald wir eine Datenstruktur in TaffyDB definiert, wie ein Objekt Organisation wird aussehen, alles nur sinnvoll mit seiner Fähigkeit, die nützlich endlich aus langen Junk suchte Strom von minimierte Javascript Strom Siehe abfragen: http://www.taffydb.com/

0

Die zusätzlichen Werte in der URL sind nützlich:

  • Schienenzugang. Dies ist wie wenn eine Zeitung "& Homepage" vs. "& E-Mail" an eine Artikel-URL anfügt, so dass ihr System weiß, wie ein Leser die Seite gefunden hat.

  • Missbrauch vermeiden und Zugriff kontrollieren. Stellen Sie sich vor, dass ein Benutzer ein kleines, populäres pornografisches Bild in ein Profilbild geladen hat. Sie könnten dann das CDN entführen, um ein kostenloser Webhost für ihre Pornoseite zu werden. Dieser Code wird jedoch intern vom CDN verwendet, um die Anzahl der Ansichten zu begrenzen.