Kürzeste mögliche kodierte Zeichenkette mit Dekodierungsmöglichkeit (URL verkürzen) nur mit PHP

8

Ich suche nach einer Methode, die eine Zeichenkette auf kürzeste mögliche Länge codiert und sie decodierbar machen (reines PHP, kein SQL). Ich habe ein funktionierendes Skript, aber ich bin nicht zufrieden mit der Länge der codierten Zeichenfolge.

SZENARIO:

Verknüpfen mit einem Bild (hängt von der Dateiauflösung ab, die ich dem Benutzer zeigen möchte):

  • www.mysite.com/share/index.php?img=/dir/dir/hi-res-img.jpg&w=700&h=500

Kodierter Link (damit der Benutzer nicht erraten kann, wie er das größere Bild erhält):

  • www.mysite.com/share/encodedQUERYstring

Also, grundsätzlich möchte ich nur den Suchabfrageteil der URL verschlüsseln:

  • img = / von / dir / hi-res-img.jpg & amp; w = 700 & amp; h = 500

Die Methode, die ich gerade benutze, codiert die obige Abfrage-Zeichenfolge wie folgt:

  • y8xNt9VPySwC44xM3aLUYt3M3HS9rIJ0tXJbcwMDtQxbUwMDAA

Die Methode, die ich verwende, ist:

%Vor%

Wie kann ich das kodierte Ergebnis verkürzen und trotzdem die Möglichkeit haben es mit only PHP zu entschlüsseln?

    
Artur Filipiak 13.01.2015, 20:33
quelle

13 Antworten

8

Ich vermute, dass Sie mehr über Ihre Hash-Methode nachdenken müssen, wenn Sie nicht möchten, dass sie vom Benutzer dekodierbar ist. Das Problem mit base64 ist, dass eine Base64-Zeichenfolge wie eine Base64-Zeichenfolge aussieht. Es besteht eine gute Chance, dass jemand, der schlau genug ist, Ihre Seitenquelle anzuschauen, dies wahrscheinlich ebenfalls erkennt.

Teil eins:

  

eine Methode, die eine Zeichenfolge auf die kürzest mögliche Länge codiert

Wenn Sie bei Ihren URL-Vokabeln / -Zeichen flexibel sind, ist dies ein guter Ausgangspunkt. Da gzip eine Menge seiner Vorteile durch Rückverweise erzielt, hat es wenig Sinn, da die Zeichenfolge so kurz ist.

Betrachten Sie Ihr Beispiel - Sie haben nur 2 Bytes in der Komprimierung gespeichert, die in base64 padding wieder verloren gehen:

Nicht-gezippt: string(52) "aW1nPS9kaXIvZGlyL2hpLXJlcy1pbWcuanBnJnc9NzAwJmg9NTAw"

Gzipped: string(52) "y8xNt9VPySwC44xM3aLUYt3M3HS9rIJ0tXJbcwMDtQxbUwMDAA=="

Wenn Sie Ihre Vocab-Größe reduzieren, können Sie natürlich besser komprimieren. Nehmen wir an, wir entfernen einige redundante Informationen

Sehen Sie sich die Funktionen an:

%Vor%

Und

%Vor%

Was dort vor sich geht, ist im Grunde eine Entfernung von redundanter Information, gefolgt von der Komprimierung von 4 Bytes in 3. Dies wird erreicht, indem effektiv eine 6-Bit-Teilmenge der ASCII-Tabelle verwendet wird. Dieses Fenster wird so verschoben, dass der Versatz bei nützlichen Zeichen beginnt und alle Zeichen enthält, die Sie gerade verwenden.

Mit dem Offset, den ich verwendet habe, können Sie alles von ASCII 38 bis 102 verwenden. Dies ergibt eine resultierende Zeichenfolge von 30 Bytes , das ist eine 9-Byte (24%) Komprimierung! Leider müssen Sie es URL-sicher machen (wahrscheinlich mit base64), was es wieder auf 40 Bytes bringt.

Ich denke, dass Sie zu diesem Zeitpunkt ziemlich sicher davon ausgehen können, dass Sie die Stufe "Sicherheit durch Dunkelheit" erreicht haben, die erforderlich ist, um 99,9% der Menschen zu stoppen. Lass uns weitermachen, zum zweiten Teil deiner Frage

  

damit der Benutzer nicht erraten kann, wie er das größere Bild erhält

Es kann argumentiert werden, dass dies bereits mit dem oben genannten gelöst ist, aber was Sie tun müssen, ist dies durch ein Geheimnis auf dem Server zu übermitteln, vorzugsweise mit php openssl . Der folgende Code zeigt den vollständigen Nutzungsablauf der oben genannten Funktionen und die Verschlüsselung:

%Vor%

Die Ausgabe dieses Skripts lautet wie folgt:

%Vor%

Sie sehen den ganzen Zyklus: Komprimierung & gt; Verschlüsselung & gt; base64 kodieren / decodieren & gt; Entschlüsselung & gt; Dekompression. Die Ausgabe von diesem wäre so nah wie möglich, wie Sie wirklich bekommen könnten, in der Nähe der kürzesten Länge, die Sie bekommen konnten.

Alles andere beiseite, ich fühle mich verpflichtet, dies mit der Tatsache zu beenden, dass es nur theoretisch ist, und das war eine nette Herausforderung zum Nachdenken. Es gibt definitiv bessere Möglichkeiten, um Ihr gewünschtes Ergebnis zu erreichen - ich werde als Erster zugeben, dass meine Lösung ein bisschen absurd ist!

    
calcinai 10.10.2016, 15:24
quelle
4

Wie wäre es mit der Ausgabe einer Miniaturansicht des Originalbildes, anstatt die URL zu kodieren? Hier ist, was ich denke:

1) Erstellen Sie eine "Karte" für PHP, indem Sie Ihre Bilder (die tatsächlichen Dateinamen) mit zufälligen Zeichen benennen. Random_bytes ist ein großartiger Ausgangspunkt.

2) Betten Sie die gewünschte Auflösung innerhalb der randomisierten URL-Zeichenfolge von # 1 ein.

3) Verwenden Sie die Funktion imagecopyresampled , um das Originalbild in die Auflösung zu kopieren, die Sie ausgeben möchten bevor es auf dem Client-Gerät ausgegeben wird.

Also zum Beispiel:

1 - Dateiname Beispiel (aus bin2hex(random_bytes(6)) ): a1492fdbdcf2.jpg

2 - Auflösung gewünscht: 800x600. Mein neuer Link könnte folgendermaßen aussehen:       http://myserver.com/?800a1492fdbdcf2600 oder vielleicht http://myserfer.com/?a1492800fdbdc600f2 oder vielleicht auch http://myserver.com/?800a1492fdbdcf2=600 , je nachdem, wo ich die Auflösung in den Link einbetten möchte

3 - PHP würde wissen, dass der Dateiname a1492fdbdcf2.jpg lautet, greifen Sie ihn, verwenden Sie imagecopyresampled, um die gewünschte Auflösung zu kopieren und geben Sie sie aus.

    
JDW 10.10.2016 11:06
quelle
3

BEARBEITEN

Wenn Sie von den obigen und den folgenden Kommentaren lesen, benötigen Sie eine Lösung, um den realen Pfad Ihres Bildparsers zu verbergen und ihm eine feste Bildbreite zu geben.

Schritt 1: http://www.example.com/tn/full/animals/images/lion.jpg

Sie können einen grundlegenden "Thumbnailer" erreichen, indem Sie .htaccess

verwenden %Vor%

Ihre PHP-Datei:

%Vor%

Damit können Sie die URL www.example.com/tn/full/animals/images/lion.jpg verwenden, um Ihr verkleinertes Bild anzuzeigen.

Dies hat den Vorteil, dass SEO den ursprünglichen Dateinamen erhält.

Schritt 2: http://www.example.com/tn/full/lion.jpg

Wenn Sie eine kürzere URL wünschen, wenn die Anzahl der Bilder, die Sie haben, nicht zu groß ist, können Sie den Basisnamen der Datei (zB "lion.jpg") verwenden und rekursiv suchen. Verwenden Sie bei einer Kollision einen Index, um den gewünschten zu identifizieren (z. B. "1 - lion.jpg")

%Vor%

Originaler Beitrag:

Wenn Sie in Ihrem Beispiel eine Formatierung hinzufügen, ist Ihre verkürzte URL tatsächlich länger:

%Vor%

Die Verwendung von base64_encode führt immer zu längeren Strings. Und gzcompress benötigt weniger, um ein Vorkommen der verschiedenen Zeichen zu speichern; Dies ist keine gute Lösung für kleine Strings.

Wenn Sie also nichts tun (oder ein einfaches str_rot13 ), ist dies eindeutig die erste Option, die Sie in Erwägung ziehen, wenn Sie das Ergebnis, das Sie zuvor hatten, verkürzen möchten.

Sie können auch eine einfache Zeichenersetzungsmethode Ihrer Wahl verwenden:

%Vor%

Wenn Sie von Ihrem Kommentar lesen, möchten Sie wirklich verhindern, dass jemand ein hochauflösendes Bild erhält.

Das erreichen Sie am besten, indem Sie eine Prüfsumme mit einem privaten Schlüssel erzeugen.

Kodierung:

%Vor%

Ergebnis: img=/dir/dir/hi-res-img.jpg&w=700&h=500&k=2ae31804

Dekodieren:

%Vor%

Dies versteckt nicht den ursprünglichen Pfad, aber dieser Pfad hat keinen Grund öffentlich zu sein. Ihre "index.php" kann Ihr Bild aus dem lokalen Verzeichnis ausgeben, sobald der Schlüssel überprüft wurde.

Wenn Sie Ihre ursprüngliche URL wirklich verkürzen möchten, müssen Sie die zulässigen Zeichen in der ursprünglichen URL einschränken. Viele Komprimierungsmethoden basieren auf der Tatsache, dass Sie ein vollständiges Byte verwenden können, um mehr als ein Zeichen zu speichern.

    
Adam 09.10.2016 20:07
quelle
2

Es gibt viele Möglichkeiten, URLs zu verkürzen. Sie können nachsehen, wie andere Dienste, wie TinyUrl, ihre URLs verkürzen. Hier ist ein guter Artikel über Hashes und Verkürzungen: Ссылка

Sie können die PHP-Funktion mhash () verwenden, um Hashes auf Strings anzuwenden: Ссылка

Und wenn Sie auf der mhash-Website zu "Available Hashes" blättern, können Sie sehen, welche Hashes Sie in der Funktion verwenden können (obwohl ich prüfen würde, welche php-Versionen welche Funktionen haben): Ссылка

    
GreeKatrina 15.01.2015 18:18
quelle
2

Ich denke, das wäre besser, wenn wir überhaupt nicht verdunkeln. Sie können zurückgegebene Bilder einfach zwischenspeichern und einen Handler verwenden, um sie bereitzustellen. Dies erfordert, dass die Bildgrößen in das PHP-Skript fest codiert werden. Wenn Sie neue Größen erhalten, können Sie einfach alles im Cache löschen, da es 'lazy loaded' ist.

1. Holen Sie sich das Bild von der Anfrage
Dies könnte sein: /thumbnail.php?image=img.jpg&album=myalbum . Es könnte sogar so gemacht werden, dass alles neu geschrieben wird und eine URL wie folgt hat: /gallery/images/myalbum/img.jpg .

2. Überprüfen Sie, ob eine temporäre Version nicht existiert.
Sie können dies mit is_file() tun.

3. Erstellen Sie es, wenn es nicht existiert
Verwenden Sie Ihre aktuelle Größenänderungslogik, aber geben Sie das Bild nicht aus. Speichern Sie es in den temporären Speicherort.

4. Lesen Sie den Inhalt der temporären Datei im Stream
Ziemlich viel nur ausgeben.

Hier ist ein ungetestet Codebeispiel ...

%Vor%     
Michael Coxon 10.10.2016 10:44
quelle
2

Kurze Worte über "Sicherheit"

Sie können Ihren Link einfach nicht sichern, wenn kein "geheimes Passwort" irgendwo gespeichert ist: Solange der URI alle Informationen zum Zugriff auf Ihre Ressource enthält, ist er dekodierbar und Ihre "benutzerdefinierte Sicherheit" ( sie sind gegensätzliche Wörter, btw) wird leicht gebrochen werden.

Sie können immer noch ein Salz in Ihren PHP-Code setzen (wie $mysalt="....long random string..." ), da ich bezweifle, dass Sie eine ewige Sicherheit wollen (ein solcher Ansatz ist schwach, weil Sie den $mysalt -Wert nicht erneuern können, aber in Ihrem Fall nur wenige Jahre Sicherheit) Klingt ausreichend, da ein Benutzer sowieso ein Bild kaufen und es an anderer Stelle teilen kann, was jeden Sicherheitsmechanismus zerstört.)

Wenn Sie einen sicheren Mechanismus haben möchten, verwenden Sie einen bekannten Mechanismus (zusammen mit einem Framework), zusammen mit Authentifizierungs- und Benutzerrechten-Managementmechanismus (damit Sie wissen, wer nach Ihrem Bild sucht und ob es erlaubt ist) zu).

Sicherheit hat einen Preis, wenn Sie sich die Rechenleistung nicht leisten wollen &; Anforderungen speichern, dann vergessen Sie es.

Sicher durch Signieren der URL

Wenn Sie vermeiden möchten, dass die Benutzer einfach umbuchen und ein vollständiges Res-Bild erhalten, dann können Sie einfach den URI unterschreiben (aber verwenden Sie aus Sicherheitsgründen etwas, das bereits vorhanden ist, anstatt dieses kurze Beispiel unten):

%Vor%

Decodierung:

%Vor%

Siehe Ссылка

Kürzen Sie

"Verkürzen" mit einem generischen Komprimierungsalgorithmus ist hier nutzlos, da die Header länger sind als der URI, also wird er sie fast nie kürzen.

Wenn Sie es verkürzen wollen, seien Sie klug: Geben Sie nicht den relativen Pfad ( /dir/dir ) ein, wenn es immer derselbe ist (oder geben Sie es nur, wenn es nicht der wichtigste ist). Geben Sie die Erweiterung nicht an, wenn sie immer gleich ist (oder geben Sie sie an, wenn sie nicht png ist, wenn fast alles in png ist). Geben Sie nicht die height ein, da das Bild die aspect ratio enthält: Sie benötigen nur die width . Geben Sie es in x100px ein, wenn Sie keine pixelgenaue Breite benötigen.

    
Xenos 11.10.2016 09:28
quelle
1

In Ihrer Frage geben Sie an, dass es reines PHP sein soll und keine Datenbank verwenden soll, und es sollte eine Möglichkeit geben, die Strings zu dekodieren. Also die Regeln etwas verbiegen:

  • Die Art, wie ich diese Frage interpretiere, ist, dass uns Sicherheit nicht so wichtig ist, aber wir wollen die kürzesten Hashes, die zu Bildern führen.
  • Wir können auch "decodemöglichkeit" mit einer Prise Salz nehmen, indem wir einen Einweg-Hashalgorithmus verwenden.
  • Wir können die Hashes in einem JSON-Objekt speichern und dann die Daten in einer Datei speichern, so dass wir am Ende des Tages nur den String
  • benötigen

'' '

%Vor%

'' '

Anwendungsbeispiel:

%Vor%

Das Endergebnis ist also eine Zeichenfolge, die nur 32 Zeichen lang ist, was viel kürzer ist als die 52 , die wir vorher hatten.

    
Aron 08.10.2016 23:44
quelle
0

Ich fürchte, Sie können die Abfragestrings nicht besser kürzen als alle bekannten Komprimierungsalgorithmus. Wie bereits erwähnt, ein komprimierter Version wird um ein paar (etwa 4-6) Zeichen kürzer sein als das Original. Außerdem kann die ursprüngliche Zeichenkette relativ einfach decodiert werden (im Gegensatz zur Dekodierung von zB sha1 oder md5).

Ich schlage vor, URLs mittels Web-Server-Konfiguration zu verkürzen. Du könntest kürzen Sie es weiter, indem Sie den Image-Pfad durch eine ID ersetzen (speichern Sie ID-filename ) Paare in einer Datenbank).

Zum Beispiel akzeptiert die folgende Nginx Konfiguration URLs wie /t/123456/700/500/4fc286f1a6a9ac4862bdd39a94a80858 , wo

  • die erste Zahl ( 123456 ) soll eine Bild-ID aus der Datenbank sein;
  • 700 und 500 sind Bilddimensionen;
  • Der letzte Teil ist ein MD5-Hash, der vor Anfragen mit anderen schützt Dimensionen .
%Vor%

Der Server akzeptiert nur URLs des angegebenen Musters, leitet die Anfrage an /public/t/resize.php script mit der modifizierten Abfrage-Zeichenkette weiter und ändert dann die Größe des von PHP generierten Bildes mit image_filter Modul. Bei einem Fehler wird ein leeres GIF-Bild zurückgegeben.

Das image_filter ist optional, es ist nur als Beispiel enthalten. Die Größenänderung kann vollständig auf PHP-Seite durchgeführt werden. Mit Nginx ist es übrigens möglich, den PHP-Teil loszuwerden.

Das PHP-Skript soll den Hash wie folgt validieren:

%Vor%     
Ruslan Osmanov 10.10.2016 17:46
quelle
0

Aus der Diskussion im Kommentarbereich sieht es so aus, als ob Sie wirklich Ihre ursprünglichen hochauflösenden Bilder schützen möchten.

Wenn ich das im Hinterkopf habe, würde ich vorschlagen, das zuerst mit Ihrer Webserverkonfiguration zu tun (zB Apache mod_authz_core oder Nginx ngx_http_access_module ), um den Zugriff vom Web auf das Verzeichnis zu verweigern wo Ihre Originalbilder gespeichert sind.

Beachten Sie, dass wir Server den Zugriff auf Ihre Bilder nur aus dem Internet verweigern, Sie aber trotzdem direkt von Ihren PHP-Skripten darauf zugreifen können. Da Sie bereits Bilder mit einem "resizer" -Skript anzeigen, würde ich vorschlagen, dass Sie dort ein paar harte Grenzen setzen und es ablehnen, Bilder auf etwas Größeres zu skalieren (z. B. so etwas wie $width = min(1000, $_GET['w']) ).

Ich weiß, dass dies Ihre ursprüngliche Frage nicht beantwortet, aber ich denke, das wäre die richtige Lösung, um Ihre Bilder zu schützen. Und wenn Sie den ursprünglichen Namen und die Größenänderungsparameter immer noch verschleiern möchten, können Sie das tun, wie Sie es für richtig halten, ohne sich darum zu kümmern, dass jemand herausfinden könnte, was dahinter steckt.

    
Giedrius D 11.10.2016 21:44
quelle
0

Ich glaube nicht, dass die resultierende URL viel mehr verkürzt werden kann als auf Ihrem eigenen Beispiel. Aber ich schlage ein paar Schritte vor, um Ihre Bilder besser zu verschleiern.

Zuerst würde ich alles entfernen, was Sie von der Basis-URL, die Sie zippen und base64encoding, also statt

  

img = / Verzeichnis / hir-res-img.jpg & amp; w = 700 & amp; h = 500

Ich würde

verwenden
  

s = hi-res-img.jpg, 700, 500, 062c02153d653119

Waren die letzten 16 Zeichen ein Hash, um zu bestätigen, dass die URL, die geöffnet wird, dieselbe ist, die Sie in Ihrem Code angeboten haben - und der Benutzer nicht versucht, das Bild mit hoher Auflösung aus dem System auszutricksen.

Ihre index.php, die die Bilder liefert, würde so starten:

%Vor%

Nach diesem Punkt können Sie das Bild senden, während der Benutzer Zugang zu einem gültigen Link hatte.

Beachten Sie, dass session_id als Teil der Raw-Zeichenfolge verwendet wird, die den Hash-Wert optional macht, es aber den Benutzern unmöglich macht, eine gültige URL zu teilen - so wie es die Session-Bindung wäre. Wenn Sie möchten, dass die URLs gemeinsam genutzt werden können, entfernen Sie einfach session_id von diesem Aufruf.

Ich würde die resultierende URL auf die gleiche Art und Weise umschließen, wie Sie es bereits tun, zip + base64. Das Ergebnis wäre sogar größer als Ihre Version, aber schwieriger durch die Verschleierung zu sehen und schützt Ihre Bilder vor nicht autorisierten Downloads.

Wenn Sie es nur kürzer machen möchten, sehe ich keine Möglichkeit, dies zu tun, ohne die Dateien (oder ihre Ordner) umzubenennen oder ohne eine Datenbank zu verwenden.

Die vorgeschlagene Lösung für die Datei-Datenbank wird sicherlich Nebenläufigkeitsprobleme verursachen - es sei denn, Sie haben immer keine oder nur sehr wenige Leute, die das System gleichzeitig benutzen.

    
Edelmar Ziegler 12.10.2016 04:56
quelle
0

Sie sagen, dass Sie die Größe dort wollen, so dass, wenn Sie eines Tages entscheiden, dass die Vorschaubilder zu klein sind, Sie die Größe vergrößern möchten - die Lösung hier ist, die Bildgröße in das PHP-Skript fest zu kodieren und es zu beseitigen von der URL. Wenn Sie die Größe in der Zukunft ändern möchten, ändern Sie die hardcoded Werte im PHP-Skript (oder in einer config.php, die Sie in das Skript aufnehmen).

Sie haben auch gesagt, dass Sie bereits Dateien zum Speichern von Bilddaten als JSON-Objekt verwenden, wie zum Beispiel: name , title , description . Aus diesem Grund benötigen Sie keine Datenbank und können den JSON-Dateinamen als Schlüssel zum Nachschlagen der Bilddaten verwenden.

Wenn der Benutzer eine URL wie folgt aufruft:

%Vor%

Sie laden ax9v.json von dem Ort, an dem Sie bereits die json-Dateien gespeichert haben, und in dieser json-Datei wird der reale Pfad des Bildes gespeichert. Laden Sie dann das Bild, ändern Sie die Größe entsprechend der fest codierten Größe in Ihrem Skript und senden Sie es an den Benutzer.

Ziehen Sie aus den Schlussfolgerungen in Ссылка nach, um den kleinsten Teil der Suchzeichenkette zu erhalten url müssen Sie gültige Zeichenkombinationen wiederholen, wenn neue Dateien hochgeladen werden (z. B. die erste ist "AAA", dann "AAB", "AAC", etc.) anstatt einen Hash-Algorithmus zu verwenden. Ihre Lösung würde dann nur 3 Zeichen in der Zeichenfolge für die ersten 238.328 Fotos enthalten, die Sie hochladen.

Ich hatte begonnen, eine php-Lösung auf phpfidle zu entwickeln, aber der Code verschwand (benutze phpfidle nicht).

    
Luke 12.10.2016 18:38
quelle
0

Es wurde viel darüber gesagt, dass Kodierung nicht zur Sicherheit beiträgt, also konzentriere ich mich nur auf die Verkürzung und die Ästhetik.

Anstatt es als String zu betrachten, könnten Sie es als 3 einzelne Komponenten betrachten. Wenn Sie dann den Coderaum für jede Komponente begrenzen, können Sie die Dinge viel kleiner zusammenpacken.

z. B.

  • Pfad - Nur bestehend aus den 26 Zeichen (a-z) und / -. (Variable Länge)
  • width - Ganzzahl (0 - 65k) (Feste Länge, 16 Bit)
  • height - Ganzzahl (0 - 65k) (Feste Länge, 16 Bit)

Ich beschränke den Pfad so, dass er nur aus maximal 31 Zeichen besteht, also können wir 5-Bit-Gruppierungen verwenden.

Packen Sie zuerst die Dimensionen mit fester Länge und hängen Sie jedes Pfadzeichen als 5 Bits an. Es kann auch erforderlich sein, ein spezielles Nullzeichen hinzuzufügen, um das Endbyte aufzufüllen. Offensichtlich müssen Sie die gleiche Wörterbuchkette für das Kodieren und Dekodieren verwenden.

Siehe Code unten.

Dies zeigt, dass Sie eine kürzere Zeichenfolge erhalten können, indem Sie das, was Sie codieren und wie viel Sie codieren können, einschränken. Sie können es sogar noch kürzer machen, indem Sie nur 12-Bit-Dimensions-Integer (max. 2048) verwenden oder Teile des Pfades entfernen, wenn diese bekannt sind, wie Basispfad oder Dateierweiterung (siehe letztes Beispiel).

%Vor%     
Phil 12.10.2016 23:28
quelle
0

Theorie

Theoretisch benötigen wir einen kurzen Eingabezeichensatz und einen großen Ausgabezeichensatz. Ich werde es anhand des folgenden Beispiels demonstrieren. Wir haben die Nummer 2468 als Integer mit 10 Zeichen (0-9) als Zeichensatz. Wir können es in die gleiche Nummer mit der Basis 2 (Binärzahlsystem) umwandeln. Dann haben wir einen kürzeren Zeichensatz (0 und 1) und das Ergebnis ist länger: 100110100100

Aber wenn wir auf Hexadezimalzahl (Basis 16) mit einem Zeichensatz von 16 (0-9 und A-F) konvertieren. Dann bekommen wir ein kürzeres Ergebnis: 9A4

Praxis

Also haben wir in Ihrem Fall den folgenden Zeichensatz für die Eingabe:

%Vor%

Insgesamt 41 Zeichen: Zahlen, Kleinbuchstaben und Sonderzeichen = / -. & amp;

Der Zeichensatz für die Ausgabe ist etwas knifflig. Wir möchten nur URL-Speicherzeichen verwenden. Ich habe sie von hier gepackt: Zeichen erlaubt in GET Parameter

Also ist unser Ausgabezeichensatz (73 Zeichen):

%Vor%

Zahlen, untere UND obere Fälle und einige spezielle Zeichen.

Wir haben mehr Zeichen für die Ausgabe als für die Eingabe. Die Theorie besagt, dass wir unsere Eingabezeichenfolge kurz machen können. ÜBERPRÜFEN SIE!

Codierung

Jetzt brauchen wir eine Codierfunktion von Base 41 bis Base 73. Für diesen Fall kenne ich keine PHP-Funktion. Glücklicherweise können wir die Funktion 'convBase' von hier aus abrufen: Ссылка (wenn jemand eine intelligentere Funktion lassen Sie mich wissen)

%Vor%

Jetzt können wir die URL kurz machen. Der letzte Code ist:

%Vor%

Die codierte Zeichenfolge hat nur 34 Zeichen.

Optimierungen

Sie können die Anzahl der Zeichen mit

optimieren
  • Reduziert die Länge der Eingabezeichenfolge. Brauchen Sie wirklich den Overhead der URL-Parametersyntax? Vielleicht können Sie Ihre Zeichenfolge wie folgt formatieren:

    $input = '/dir/dir/hi-res-img.jpg,700,500';

    Dies reduziert den Eingang selbst und den eingegebenen Zeichensatz. Ihr reduzierter Eingabezeichensatz ist dann:

    $inputCharacterSet = "0123456789abcdefghijklmnopqrstuvwxyz/-.,";

    Endgültige Ausgabe:

    string(27) "E$AO.Y_JVIWMQ9BB_Xb3!Th*-Ut"

    string(31) "/dir/dir/hi-res-img.jpg,700,500"

  • reduziert den Eingabe-Zeichensatz ;-). Vielleicht kannst du noch mehr Charaktere ausschließen? Sie können die Zahlen zuerst in Zeichen codieren. Dann kann der eingegebene Zeichensatz um 10 reduziert werden!

  • erhöhen Sie Ihren Ausgabezeichensatz. So wird der von mir eingestellte Satz innerhalb von 2 Minuten gegoogelt. Vielleicht können Sie mehr URL-Zeichen verwenden. Keine Ahnung ... Vielleicht hat jemand eine Liste

Sicherheit

Vorsicht: Es gibt keine kryptographische Logik im Code. Wenn also jemand die Zeichensätze erraten kann, kann er die Zeichenkette leicht entschlüsseln. Aber Sie können die Zeichensätze (einmal) mischen. Dann ist es etwas schwieriger für den Angreifer, aber nicht wirklich sicher. Vielleicht ist es sowieso genug für Ihren Anwendungsfall.

    
Timo 13.10.2016 15:22
quelle

Tags und Links