Meine PHP-Anwendung verwendet URLs wie diese:
%Vor%Die Schlüssel und das Ende der URL sind im Grunde genommen der Primärschlüssel der MySQL-Datenbanktabelle.
Ich möchte nicht, dass diese steigende Zahl öffentlich ist, und ich möchte auch nicht, dass jemand die Benutzerprofile durch einfaches Interagieren der ID crawlen kann.
Also möchte ich diese ID für die Anzeige so verschlüsseln, dass ich sie wieder leicht entschlüsseln kann. Die Saite sollte nicht viel länger werden.
Was ist die beste Verschlüsselungsmethode dafür?
Einfache Obskurierung: Base64 codiert sie mit base64_encode
.
Nun wird Ihre Sammlung zu Ссылка
Willst du mehr, mach es noch einmal, füge ein paar Buchstaben hinzu.
Tough Obscuring: Verwenden Sie eine beliebige Verschlüsselungsmethode mit MCrypt library.
Ein besserer Ansatz (aus einer Usability- und SEO-Perspektive) wäre die Verwendung einer eindeutigen Phrase anstelle einer verdeckten ID. In diesem Fall scheint der Benutzername des Benutzers eine ideale Lösung zu sein und wäre auch nicht zu erraten.
Das heißt, wenn Sie diesen Ansatz nicht verwenden möchten, könnten Sie einfach einen Hash (vielleicht md5 ) des Benutzername des Benutzers, den Sie zusammen mit anderen Details in der Datenbank speichern würden. Daher können Sie einfach direkt nach diesem Feld suchen. (Das heißt, dass das Verschlüsseln und Entschlüsseln eines Teils der URL wahrscheinlich übertrieben ist.)
Sie haben hier eine Auswahl:
Generiert und speichert einen Bezeichner in der Datenbank. Es ist gut, weil Sie dann lesbare Schlüssel haben können, die garantiert einzigartig sind. Es ist schlecht, weil es eine Änderung des Datenbankschemas verursacht, und Sie müssen diese Tabelle jedes Mal abfragen, wenn Sie eine Verknüpfung erstellen möchten.
Führen Sie eine tatsächliche schlüsselbasierte Verschlüsselung aus, z. B. basierend auf PHPs MCrypt. Sie haben Zugriff auf leistungsfähige kryptografische Algorithmen, aber die meisten sicheren Algorithmen geben Strings aus, die viel länger sind als erwartet. XOR tut, was Sie wollen, aber es verhindert nicht den Zugriff auf sequentielle Werte (und der Schlüssel ist ziemlich einfach zu bestimmen, angesichts der a-priori-Kenntnisse über die Zahlen).
Führen Sie eine Hash-basierte Überprüfung durch: Verwenden Sie 121
als Ihren Bezeichner und verwenden Sie 121-a34df6
, wobei a34df6
die ersten sechs Zeichen von md5
(oder anderen HMAC
) von% sind. co_de% und ein geheimer Schlüssel. Anstatt zu dekodieren, extrahierst du 121
und berechne die sechs Zeichen neu, um zu sehen, ob sie mit dem übereinstimmen, was der Benutzer gesendet hat. Dies verdeckt nicht 121
(es ist immer noch genau dort vor dem Bindestrich), aber ohne den geheimen Schlüssel zu kennen, wird der Besucher nicht in der Lage sein, die sechs Zeichen zu erzeugen, um das Dokument mit 121
zu sehen.
Verwenden Sie XOR mit Shuffling: Mischen Sie die Bits in der 30-Bit-Kennung und wenden Sie dann das XOR an. Dies erschwert die Identifizierung des XOR, da das Shuffle-Muster ebenfalls ausgeblendet ist.
Verwenden Sie XOR mit On-Demand-Schlüsseln: Verwenden Sie 121
als Schlüssel, wobei der erste Teil das XOR von fb37cde4-37b3
und 121
ist (oder eine andere Möglichkeit zum Erzeugen eines XOR-Schlüssels basierend auf% co_de) % und ein Geheimnis).
Verwenden Sie nicht base64, es ist einfach, Reverse Engineering: Wenn md5('37b3'.SECRET)
ist 37b3
, dann MTIx
ist 121
...
Letztendlich müssen Sie akzeptieren, dass Ihre Lösung nicht sicher ist: Benutzer können nicht nur gültige URLs (durch ihren Browserverlauf, HTTP-Referer oder das Posten auf Twitter) verlieren, sondern Ihre Anforderung, dass die Bezeichner passen in eine kleine Anzahl von Zeichen, was bedeutet, dass ein Brute-Force-Angriff möglich ist (und einfacher wird, wenn Sie mehr Dokumente haben).
Wenn Sie die URL nicht anzeigen, wird sie niemals gesichert. Es macht es schwerer zu lesen, aber nicht viel schwieriger zu manipulieren. Sie können eine hexadezimale Zahlendarstellung oder etwas ähnliches verwenden, um es zu verdecken. Diejenigen, die Hex lesen können, können Ihre URL in ein paar Sekunden ändern:
%Vor%Ich würde wahrscheinlich sagen, dass es in der Tat besser ist, für jeden Benutzer eine zufällige Zeichenfolge zu erstellen und diese in Ihrer Datenbank zu speichern, als eine mit Hash zu erhalten. Wenn Sie einen gemeinsamen Hash verwenden, ist es immer noch sehr einfach, über alle Seiten zu iterieren; -)
Ich würde dies in Kommentaren schreiben, aber habe nicht den Namen dafür (noch?).
Wenn der Benutzer auf einen Link klickt, sollten Sie keinen Primärschlüssel verwenden. Sie können den Schlüssel p in einer Sitzung verwenden und von dieser Sitzung abrufen. Bitte verwenden Sie keine Abfragezeichenfolge ....
generieren Sie eine eindeutige Zeichenfolge für jeden Benutzer und verwenden Sie sie in Ihren URLs
http://domain.com/user/ofisdoifsdlfkjsdlfkj
anstelle von http://domain.com/userid/121
Tags und Links php encryption