2009-03-01 17 views
12

Ich möchte einen sicheren URL-Typ mit einem Klick erstellen, der den folgenden Beispielen ähnelt. Ich werde PHP verwenden, aber das ist irrelevant, da ich nur das zugrundeliegende Konzept verstehen will. Einige Antworten schlagen vor, eine GUID zu verwenden, aber ich denke nicht, dass dies eine absolut eindeutige, sichere URL wie unten geben wird.Generieren von privaten, eindeutigen, sicheren URLs

# Google Calendar 
3qq6jlu04ptlhmb9fencsu5t2k 
# Private 
3qq6jlu04ptlhmb9fencsu5t2k 
# Private 'token' 
163a0afe7fkb1ba2acd04c11ef0eefe8 
# LogMeIn 
# 1024 bit - 128 Character URL 
72oxuj0fzefqo3fu04xjtvmd0adj2948rfh7g5by4forkwcy7t651z7hcb6kjjgqkxmvmfqpyrcfy15z1fto8ewcxstjc6avicag7d5qnoimsm19kb9kgi9i7v6z01d5 

Ich lehne mich zu diesem 128 Zeichen, 1024 Bit Stil, wie es scheint sehr sicher. Ich denke, ich könnte vier MD5-Hashes erstellen und sie zusammenführen, aber ist das wirklich effektiv?

Ich habe zwei konkrete Absichten für eine URL wie diese, aber ich bin sicher, es gibt andere, die dies nützlich sein können.

1) Sofortanmeldung Abkürzung/Symbol für Benutzer

2) Einmal-URL (Passwort-Recovery-Links)

+0

... warum? Nein, ernsthaft, warum willst du solche URLs? Es klingt wie Sie versuchen, einen Sitzungsschlüssel neu zu erfinden; ohne mehr Kontext ist es schwer, Ihnen zu helfen, die richtige Lösung zu finden. – kquinn

+0

Warum ist diese Sicherheit markiert? – jmucchiello

+0

Ich stelle mir vor, dass dies mit Sicherheit getaggt wurde, da diese Art von URLs im Allgemeinen verwendet werden, um einen Benutzer sofort einzuloggen oder sein Passwort zurückzusetzen. Sie unterscheiden sich von Sitzungsschlüsseln, da sie im Allgemeinen nur einmal für eine einzelne Operation verwendet werden können und nicht wochenlang wie eine Sitzungs-ID herumhängen. – Ben

Antwort

9

Update:

Für so etwas wie eine einzige Anwendung URL, würde ich mit dem GUID-esque appoach gehen, die vorgeschlagen wurde. Stellen Sie sicher, dass die Verbindung eine kurze Lebensdauer hat.

Für eine sofortige Anmeldung gibt es keine wirklich sichere Möglichkeit, eine einzelne URL zu haben.

Ja, Sie können eine URL erzeugen, die verdammt nahe unmöglich sein wird, zu erraten, aber das macht man nicht super Sicherheit. Wenn Sie sich an Benutzer erinnern möchten, warum verwenden Sie keinen verschlüsselten Authentifizierungscookie?

Das Beispiel Sie geben, ist Google Kalender melden Sie sich nicht allein über die URL in, müssen Sie zunächst authentifiziert werden müssen, bevor die URL etwas bedeutet.

z. auf Google Kalender aus meinem gmail Klick gibt mir:

https://www.google.com/calendar/render?tab=mc&gsessionid=-LTeHrnKoeAbDcVaN68NHA

, dass Sie mein Konto nicht hilft zugreifen, wenn Sie zum ersten Mal als ich authentifiziert haben.

Alte Post:

Sie können eine GUID in PHP generieren com_create _guid verwenden und diese verwenden.

Unter Linux ich glaube, Sie uuid_create, oder dieser Code von here verwenden:

<?php 
function guid(){ 
if (function_exists('com_create_guid')){ 
     return com_create_guid(); 
    }else{ 
     mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. 
     $charid = strtoupper(md5(uniqid(rand(), true))); 
     $hyphen = chr(45);// "-" 
     $uuid = chr(123)// "{" 
       .substr($charid, 0, 8).$hyphen 
       .substr($charid, 8, 4).$hyphen 
       .substr($charid,12, 4).$hyphen 
       .substr($charid,16, 4).$hyphen 
       .substr($charid,20,12) 
       .chr(125);// "}" 
     return $uuid; 
    } 
} 
echo guid(); 
?> 
+1

com_create_guid scheint eine Windows-PHP-Funktion zu sein. – andynormancx

+0

Wahr, ich bin im Moment hauptsächlich auf ASP.NET, so dass mein Testserver Windows ausführt, sieht aus wie ich mit dem gleichen Code wie Sie aktualisiert. –

+0

Ich schätze die Verwendung meiner Beispiele in Ihrem Beitrag. Upvoted. – Blaine

4

einfach eine GUID generieren. Es ist jedoch wichtig, dass dies keine sequenzielle GUID im alten Stil ist.

Es scheint jedoch, dass PHP keine eigene GUID-Funktion hat. Die in einer anderen Antwort vorgeschlagene Funktion com_create_guid scheint nur in PHP verfügbar zu sein, wenn sie unter Windows läuft.

Es gibt ein Benutzer eine mögliche Alternative für com_create_guid für Nicht-Windows auf der Hilfeseite für sie:

function guid(){ 
    if (function_exists('com_create_guid')){ 
     return com_create_guid(); 
    }else{ 
     mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. 
     $charid = strtoupper(md5(uniqid(rand(), true))); 
     $hyphen = chr(45);// "-" 
     $uuid = chr(123)// "{" 
       .substr($charid, 0, 8).$hyphen 
       .substr($charid, 8, 4).$hyphen 
       .substr($charid,12, 4).$hyphen 
       .substr($charid,16, 4).$hyphen 
       .substr($charid,20,12) 
       .chr(125);// "}" 
     return $uuid; 
    } 
} 

Aber ich muss zugeben, dass ich nur ungern wäre es wichtig, wenn für alles zu verwenden, da war ein nicht offensichtliches Problem, das darin lauerte, das mein nicht kryptographisch trainierter Verstand nicht entdeckte.

8

Versuchen uniqid - und vielleicht kombiniert mit einem MD5-Hash, wie in den Beispielen angegeben:

// no prefix 
// works only in PHP 5 and later versions 
$token = md5(uniqid()); 

// better, difficult to guess 
$better_token = md5(uniqid(rand(), true)); 

Ich muss jedoch beachten, dass keine auf diese Weise generierten URLs (unabhängig vom Hash-Algorithmus) "sicher" sind, einfach sehr schwer zu erraten sind.

+0

+1, UUID ist der Weg für diese .. fast so gut wie konventionelle Entropie, um die MD5 zu säen. –

2

Die ID muss nicht zu erraten sein, GUIDs sind einzigartig, aber nicht so schwer zu erraten.

Sie benötigen einen guten Zufallszahlengenerator, jede Kryptografie-/Verschlüsselungsbibliothek hat mindestens eine, ich kenne PHP nicht, deshalb kann ich Ihnen den Funktionsnamen nicht geben.

Dann müssen Sie entscheiden, wie lange Ihre Zufallszahl sein wird, sollten Sie eine Länge so groß wählen, dass jemand eine Zahl zu erraten wird eine freie Nummer erhalten - entweder:

  1. Schätzen Sie die Anzahl der eindeutigen URLs Sie müssen berechnen, wie viele Bits Sie benötigen, um sie alle darzustellen, und dann die Anzahl der Bits (mindestens) verdoppeln.

  2. Oder nehmen Sie die größte Anzahl Benutzer akzeptiert

Jetzt haben Sie eine „sichere“ Nummer, die Sie es einfach umwandeln kann dezimal, hex oder Base64 und diese Zeichenfolge verwenden.

+0

http://www.phptalk.net/2009/01/27/all-about-randomness-and-entropy/ schlägt einige gute (Pseudo-) Zufallszahlengeneratoren für PHP vor – menko

1

zu trimmen zusätzliche geschweifte Klammern

$ guid = strtolower (trim (com_create_guid() "{}")); (PHP 5 oder höher)

1

Wenn Sie sicherstellen möchten, dass die URL sowohl einzigartig und kann nur eine begrenzte Anzahl von Malen verwendet werden:

  • eine kleine Datenbank Halten Sie sich mit Bereichen wie: RandomKey, InternalURLCounter

  • Erstellen Sie eine Zufallszahl aus einem ausreichend großen Pool.
    Nicht Sequential GUIDs sollte von Ihrem System zu handhaben, dass die URL und einen Zeitstempel

  • speichert es in Ihrer Datenbank als RandomKey, zusammen mit dem tatsächlichen internen URL oder Ressourcen Code benötigte ausreichend sein.

  • Wenn der Benutzer klickt oder eine URL eingibt, überprüfen Sie es gegen diese Datenbank: Wenn die TimeStamp zu alt ist oder die Counter zu hoch ist, geeignete Maßnahmen ergreifen (zum Beispiel, wenn Sie diese URL wollen für eine begrenzte zugänglich sein Zeit oder eine bestimmte Anzahl von Malen).
    Ansonsten behandeln Sie einfach die Anfrage mit der InternalURL und senden Sie das Ergebnis zurück an den Benutzer.

  • Wenn die URL verwendet wurde oder ihren maximalen Nutzungszähler erreicht hat, löschen Sie sie einfach aus der Datenbank, damit sie nicht weiter verwendet werden kann.

Dies ist großartig, um Ihnen einmalige URLs zu geben, die praktisch nicht zu erraten sind.

Natürlich müssen Sie auch einige Sicherheitsprüfungen durchführen, um die Häufigkeit zu begrenzen, mit der Personen versuchen können, auf eine ungültige URL zuzugreifen.

2

Ich möchte vermeiden, dies für:

1) Sofortanmeldung Abkürzung/Symbol für Benutzer

da diese URLs auf Proxies zwischengespeichert/protokolliert werden können, weblogs, Browser-Cache, Lesezeichen, E-Mails usw.

Verwandte Themen