2009-03-01 12 views
12

Vorrei creare un tipo di URL sicuro con accesso one-click simile agli esempi riportati di seguito. Userò PHP, ma questo è irrilevante in quanto sto solo cercando di capire il concetto di base. Alcune risposte suggeriscono di utilizzare un GUID, ma non penso che questo mi fornirà un URL assolutamente unico e sicuro come di seguito.Generazione di URL privati, unici e sicuri

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

Sono inclinato verso quel 128 caratteri, stile 1024 bit, come sembra molto sicuro. Immagino di poter creare quattro hash MD5 e unirli, ma è davvero efficace?

Ho due intenzioni specifiche per un url come questo, ma sono sicuro che ci sono altri che potrebbero trovare utile questo.

1) registro istantaneo in collegamento/icona per gli utenti

2) monouso url (collegamenti di recupero password)

+0

... perché? No, sul serio, perché vuoi URL come questo? Sembra che tu stia cercando di reinventare una chiave di sessione; senza più contesto, è difficile aiutarti a trovare la soluzione giusta. – kquinn

+0

Perché questa sicurezza taggata? – jmucchiello

+0

Immagino che questo sia stato taggato di sicurezza in quanto questi tipi di URL sono generalmente utilizzati per registrare istantaneamente un utente o per reimpostare la propria password. Sono distinti dalle chiavi di sessione in quanto sono generalmente utilizzabili solo una volta per una singola operazione piuttosto che restare in attesa per settimane come un id di sessione. – Ben

risposta

9

Aggiornamento:

Per qualcosa di simile a un singolo URL uso, mi piacerebbe andare con l'appoach GUID-esque che è stato suggerito. Assicurati di avere una vita breve sul link.

Per un accesso istantaneo, non esiste un modo sicuro per avere un singolo URL.

Sì, è possibile generare un URL che sarà praticamente impossibile da indovinare, ma ciò non garantisce una grande sicurezza. Se si desidera ricordare gli utenti, perché non utilizzare un cookie di autenticazione crittografato?

Nell'esempio che si fornisce, Google Calendar non accede tramite l'URL da solo, è necessario essere autenticati prima che l'URL indichi qualsiasi cosa.

E.g. Cliccando sul calendario di Google dal mio gmail mi dà:

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

che non aiuta voi accedere al mio account se non hai prima autenticato come me.

Vecchio alberino:

È possibile generare un GUID in PHP utilizzando com_create _guid e usare quella.

su Linux Penso che si possa utilizzare uuid_create, o questo codice da here:

<?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 sembra essere una funzione di php solo per Windows. – andynormancx

+0

Vero, sono principalmente su ASP.NET al momento, quindi il mio server di test sta eseguendo Windows, sembra che io abbia aggiornato con lo stesso codice di te. –

+0

Apprezzo l'uso dei miei esempi nel tuo post. Upvoted. – Blaine

4

solo creare un GUID. Tuttavia, è importante che non sia un GUID sequenziale vecchio stile.

Tuttavia sembra che php non abbia la propria funzione generatrice GUID. La funzione com_create_guid suggerita in un'altra risposta sembra essere disponibile solo in PHP quando è in esecuzione su Windows.

C'è un utente alternativa suggerita per com_create_guid per non Windows sulla pagina di manuale per esso:

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; 
    } 
} 

Ma devo ammettere che sarei riluttante a usarlo per qualcosa di importante nel caso in cui ci fosse un problema non ovvio in agguato che la mia mente non crittografata non ha individuato.

8

Prova uniqid - e, forse, si combinano con un hash MD5, come indicato negli esempi:

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

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

Devo tuttavia notare che nessun url generato in questo modo (qualunque sia l'algoritmo hash) sarà 'sicuro', semplicemente molto difficile da indovinare.

+0

+1, UUID è la strada da percorrere per questi ... quasi quanto l'entropia convenzionale per seminare il md5. –

2

L'ID deve essere impossibile da indovinare, i GUID sono unici ma non sono così difficili da indovinare.

È necessario un buon generatore di numeri casuali, ogni libreria di crittografia/crittografia ne ha almeno uno, non conosco PHP quindi non posso darti il ​​nome della funzione.

Poi si deve decidere quanto tempo il vostro numero a caso sarà, si dovrebbe scegliere una lunghezza così grande che chiunque indovinare un numero otterrà un numero non assegnato - sia:

  1. Stima del numero di URL unici dovrai generare, calcolare quanti bit hai bisogno per rappresentarli tutti e poi raddoppiare il numero di bit (almeno).

  2. Oppure, prendere il maggior numero gli utenti accetteranno

Ora avete un numero di "sicuro" si può solo convertirlo in decimale, esadecimale o Base64 e l'uso che stringa.

+0

http://www.phptalk.net/2009/01/27/all-about-randomness-and-entropy/ Suggerisce alcuni generatori di numeri casuali buoni (pseudo) per php – menko

1

Per tagliare ulteriori parentesi graffe

$ guid = strtolower (trim (com_create_guid(), "{}")); (PHP 5 o versione successiva)

1

Se si vuole garantire che l'URL è unico e può essere utilizzato solo un numero limitato di volte:

  • Mantenere un piccolo database con campi come: RandomKey, InternalURL , Counter, TimeStamp

  • Creare un numero casuale da una grande piscina abbastanza.
    sequenziali GUID non dovrebbe essere sufficiente

  • Salva nel vostro database come RandomKey, insieme al codice URL o risorsa interna effettiva necessaria per il sistema per gestire tale URL e un timestamp.

  • Quando l'utente fa clic o entra in un URL, check it contro tale database: se il TimeStamp è troppo vecchio o il Counter è troppo alto, prendere i provvedimenti opportuni (per esempio se si desidera che questo URL sia accessibile per un periodo limitato tempo o un certo numero di volte).
    Altrimenti, basta trattare la richiesta usando lo InternalURL e inviare il suo risultato all'utente.

  • Quando l'URL è stato utilizzato o ha raggiunto il suo contatore di utilizzo massimo, è sufficiente eliminarlo dal database in modo che non possa essere ulteriormente utilizzato.

Questo è ottimo per fornire URL una tantum praticamente impossibili da indovinare.

Naturalmente, è necessario implementare alcuni controlli di sicurezza per limitare la velocità con cui le persone possono provare ad accedere a un URL non valido.

2

vorrei evitare questo per:

1) registro istantaneo in collegamento/icona per gli utenti

perché questi URL possono essere memorizzati nella cache/effettuato l'accesso proxy, weblog, cache del browser, i segnalibri, email ecc.

Problemi correlati