PHP: Kürzer/verdeckt Codierung für eine URL eingebettet, die in einem anderen URL?
Ich Schreibe mir ein script, welches im Grunde genommen können Sie mich senden Sie eine URL-und zwei integer-Dimensionen in den querystring einer einzigen get-request. Ich bin mit base64 zu Kodieren, aber es ist verdammt lange und ich bin besorgt, die URL kann zu groß werden.
Kennt jemand eine alternative, kürzere Methode, dies zu tun? Es muss entschlüsseln können, wenn er in einem get-request, also die md5/sha1-sind nicht möglich.
Vielen Dank für Ihre Zeit.
Bearbeiten: Sorry - ich sollte besser erklärt: Ok, auf unserer Seite zeigen wir screenshots von Webseiten, die gepostet bekommen bis zur Prüfung. Wir haben unsere eigenen Vorschaubild/screenshot-server. Ich bin im Grunde mit dem image-tag enthalten eine codierte Zeichenfolge, speichert die URL, um einen screenshot, und die Breite/Höhe des Bildes zu zeigen. Ich nicht aber wollen es in "raw-text" für die Welt zu sehen. Offensichtlich base64 kann entschieden werden, von jedermann, aber wir wollen nicht Ihre Durchschnittliche joe hob den URL-Pfad. Wirklich ich brauche zu Holen: url, Breite, Höhe in einer einzigen GET-request.
- Gibt es irgendeinen bestimmten Grund, nicht zu verwenden, POST oder Sessions statt? Sie sind viel besser geeignet für die übergabe von fair große Stücke von Daten, die zwischen den Seiten
- Nicht wirklich möglich, verwenden Sie den post (glaube ich jedenfalls). Seine verwendet wird, um ein Bild und die Maße (die sind in einem serialisierten array innerhalb der codierten Zeichenfolge). Es hat eine standard-html <img> tag.
- Ich bin verwirrt. Schicken Sie das Bild vom server oder vom browser?
- können Sie beschreiben, was Sie versuchen zu tun, das erfordert, dass die langen query-string? vielleicht gibt es eine Alternative Lösung, die nicht bei allen lange-query-strings
- Sorry - ich sollte besser erklärt: Ok, auf unserer Seite zeigen wir screenshots von Webseiten, die gepostet bekommen bis zur Prüfung. Wir haben unsere eigenen Vorschaubild/screenshot-server. Ich bin im Grunde mit dem image-tag enthalten eine codierte Zeichenfolge, speichert die URL, um einen screenshot, und die Breite/Höhe des Bildes zu zeigen. Ich nicht aber wollen es in "raw-text" für die Welt zu sehen. Offensichtlich base64 kann entschieden werden, von jedermann, aber wir wollen nicht Ihre Durchschnittliche joe hob den URL-Pfad. Wirklich ich brauche zu Holen: url, Breite, Höhe in einer einzigen GET-request.
- Wenn ich das richtig verstehe, dann ist das, was du machst ist ungefähr vergleichbar mit der
<img src="screenshot.php?url=othersite.com&width=640&height=480"/>
? Es würde wirklich helfen wenn man ein Beispiel in deiner Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
URLs sind nicht dazu gedacht, das verschicken von langen Zeichenfolgen von Daten, codiert oder nicht codiert ist. Nach einem bestimmten Punkt, wenn Sie den Umgang mit solch großen Mengen von Daten, gesendet durch die URL, die Sie gerade anfangen sollten, mit Hilfe des POST-oder irgendeine form der lokalen Speicherung. FYI, IE hat einen URL-limit 2038 Zeichen.
EDIT:
Ich verstehe nicht, eine Sache. Warum bist du nicht Zwischenspeichern, die screenshots? Es scheint schrecklich ressourcenintensiv zu haben, um einen neuen screenshot, jedes mal, wenn jemand Ansichten eine Seite mit einem IMG-link zu dieser url.
Vielleicht ist Ihr Publikum klein ist, und die Ressourcen sind kein Problem. Wenn es jedoch das Gegenteil, und in der Tat, es ist eine öffentliche website, die nicht sehr gut skalieren. Ich weiß, ich bin über das hinausgeht, was Ihre ursprüngliche Frage, aber dies wird die Lösung für deine Frage und mehr.
Sobald die website veröffentlicht-up, speichern Sie die url in eine Art von lokalen Speicher, vorzugsweise in sql. Ich werde weiterhin in diesem Beispiel wird, wenn Sie SQL, aber natürlich Ihre Umsetzung ist Ihre Wahl. Hätte ich einen primary key, url-Feld, und last_updated Zeitstempel und Optional ein Bild Weg.
Durch die Verwendung von lokalen Speicher, Sie können nun ziehen Sie das Bild aus einer Cache-Kopie gespeichert, die lokal auf dem server jedes mal, wenn die Seite mit dem thumbnail ist beantragt. Eine erhebliche Menge von Ressourcen ist gesichert, und da die Chancen sind, dass diese websites werden nicht sehr Häufig aktualisiert, Sie können einen cron-job oder ein script, welches alle x-Zeit zum aktualisieren der screenshots in der gesamten Datenbank. Nun, alles, was Sie tun müssen ist, direkt link (wieder dies ist abhängig von Ihrer Implementierung), um die Bild-und keines dieser riesigen url-Zeichenfolge Sachen passieren wird.
ODER, nehmen Sie nur den einfachen Weg und tun es client-Seite mit http://www.snap.com/
Da Sie nur mit base64 zu verschleiern die Zeichenfolge, die Sie konnte, nur verschleiern Sie es mit etwas anderes, wie rot13 (oder Ihre eigenen einfachen Brief substitution-Funktion). Also
urlencode(str_rot13($str))
zu codieren und zustr_rot13(urldecode($str))
zu entschlüsseln.Oder nur eine kürzere base64-codierte Zeichenfolge, könnte man komprimiert die Zeichenfolge vor der base64-Codierung es:
base64_encode(gzencode($str, 9))
undgzdecode(base64_decode($str))
zu entschlüsseln.Oder, wenn dies ist in Erster Linie eine Frage der Sicherheit (Sie sind nicht dagegen, Menschen zu sehen, die URL, die Sie wollen einfach nur, um Menschen aus hacking es ist), könnten Sie diesen Parameter übergeben, mit normaler querystring-Variablen, aber mit einem hash angehängt, um Manipulationen zu verhindern. also:
(Off-topic: die Leute sagen, Sie verwenden sollten, POST anstelle von GET. Wenn alle diese URLs sind dabei, Holen screenshots aus Ihrer Datenbank anzuzeigen (D. H. eine Suche lookup), dann ist in Ordnung und korrekt. Aber wenn der Aufruf dieser URLs ist tatsächlich eine Aktion ausgeführt wird, wie das gehen zu einer anderen Website machen und speichern den screenshot, dann ist das ein POST. Wie Ihre Namen bereits andeuten, BEKOMMEN ist für den Abruf; POST ist für die übermittlung von Daten. Wenn man sich auf eine teure operation ist wie der screenshot, dann könnten Sie die Dosierung Ihrer eigenen Website bei Google etc. index diese URLs.)
Es klingt wie Ihre Ziele sind 1. zu optisch verdecken eine URL, und 2. generell die Daten zu codieren, kompakt für den Einsatz in einer URL.
Zuerst müssen wir verdecken die URL. Da URLs verwenden viel von der Base64-Wörterbuch, jede Codierung, die produziert binären (dass dann der Base64-ed), werden Sie wahrscheinlich erhöhen Sie einfach die Größe. Es ist am besten halten Sie das Wörterbuch in der URL-sicheren Palette mit den minimalen Bedarf für die Flucht, wenn
urlencode()
angewendet wird. I. e. Sie möchten dieses:Nun, für das speichern von bytes, wir codieren kann das URL-schema in ein char (sagen wir mal
h
für HTTP,H
für HTTPS), und konvertieren Sie die Abmessungen in die Grundplatte 32. Wickeln dies:Da wir es vermieden, die nicht URL-sicher chars, wenn diese in einen querystring (mit
urlencode
), es wächst nicht viel (in diesem Fall gar nicht).Zusätzlich möchten Sie vielleicht, um Zeichen in diesem string, damit die Leute, die wissen, die Codierung kann immer noch nicht legen Sie Ihre eigenen Parameter über die URL. Für diese, die Sie verwenden würden HMAC, und Base64URL Kodieren, hash. Sie können auch halten Sie einfach einen substring des hash (~6 bits pro Zeichen), um Platz zu sparen.
sign()
(unten) fügt einen 8-Zeichen-MAC (48 bit des hash auf 6 bits/char):Update: eine bessere RotURL Funktion.
Einfach nicht
base64_encode($whole_file)
. Senden Sie den Inhalt in Stücke schneiden und Kodieren die Abschnitte. Auch, wenn Sie müssen wissen, wie Sie größer wird der chunk kann, erhalten nach einem Aufruf vonbase64_encode()
ist, wird es mehr als doppelt so groß (aber weniger als2.1*strlen($chunk)
)Können Sie immer noch POST für das, was Sie beschreiben, vorausgesetzt, ich Verstand Ihre richtig, ich kann nicht.
Ich vermute, Sie tun so etwas wie dieses:
statt etwas wie das hier tun:
Ist das Skript, das generiert die URLs auf einem anderen server läuft von der Skript, der ihn interpretiert? Wenn Sie sind auf dem gleichen server, der naheliegender Ansatz wäre zum speichern der Ziel-URL, die Breite und Höhe in eine Datenbank, und übergeben Sie einfach eine nach dem Zufallsprinzip erzeugte Datensatz-id in der Abfragezeichenfolge.