2009-03-01 15 views
12

Chciałbym wygenerować bezpieczny URL typu "kliknij jednym przyciskiem", podobnie jak w poniższych przykładach. Będę używał PHP, ale to nie ma znaczenia, ponieważ chcę po prostu zrozumieć podstawową koncepcję. Niektóre odpowiedzi sugerują użycie GUID, ale nie sądzę, że da mi to absolutnie unikalny, bezpieczny adres URL, jak poniżej.Generowanie prywatnych, unikatowych, bezpiecznych adresów URL

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

Pochylam się do 128 znaków, styl 1024 bitów, ponieważ wydaje się bardzo bezpieczny. Sądzę, że mógłbym wykonać cztery skróty MD5 i połączyć je, ale czy to naprawdę skuteczne?

Mam dwa konkretne intencje dla adresu URL takiego jak ten, ale jestem pewien, że są inni, którzy mogą uznać to za przydatne.

1) Błyskawiczne zalogowaniu skrótu/ikony dla użytkowników

2) Single-use URL (linki przypomnienie hasła)

+0

... dlaczego? Nie, poważnie, dlaczego chcesz tego typu adresy URL? Wygląda na to, że próbujesz odkryć klucz sesji; bez większego kontekstu trudno jest znaleźć właściwe rozwiązanie. – kquinn

+0

Dlaczego to oznacza bezpieczeństwo? – jmucchiello

+0

Wyobrażam sobie, że to oznaczono jako zabezpieczone, ponieważ tego rodzaju adresy URL są zazwyczaj używane do natychmiastowego zalogowania użytkownika lub zresetowania hasła. Są one różne od kluczy sesji, ponieważ zazwyczaj można je używać tylko raz na pojedynczą operację, a nie przez tygodnie, jak np. Identyfikator sesji. – Ben

Odpowiedz

9

Aktualizacja:

na coś takiego pojedynczego wykorzystania URL, pójdę z appoach GUID-owskiej, które zostały zasugerowane. Upewnij się, że link ma krótki okres użytkowania.

Do natychmiastowego zalogowania nie istnieje naprawdę bezpieczny sposób na uzyskanie pojedynczego adresu URL.

Tak, możesz wygenerować adres URL, który jest prawie niemożliwy do odgadnięcia, ale to nie daje super bezpieczeństwa. Jeśli chcesz zapamiętać użytkowników, dlaczego nie skorzystać z szyfrowanego pliku cookie służącego do uwierzytelniania?

Podany przykład, Kalendarz Google nie loguje się za pomocą samego adresu URL, musisz najpierw zostać uwierzytelniony, zanim adres URL nic nie znaczy.

E.g. kliknięcie na Kalendarz Google od mojego gmail daje mi:

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

to nie pomoże Ci uzyskać dostępu do konta, chyba że masz pierwszy uwierzytelnione jak ja.

Stary post:

Można wygenerować GUID w PHP przy użyciu com_create _guid i używać.

Na linux Myślę, że można użyć uuid_create, czy ten kod z 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 wydaje się być funkcją php tylko Windows. – andynormancx

+0

To prawda, obecnie jestem głównie na ASP.NET, więc mój serwer testowy działa z systemem Windows, wygląda na to, że zaktualizowałem ten sam kod co ty. –

+0

Doceniam wykorzystanie moich przykładów w poście. Rewizja. – Blaine

4

Wystarczy wygenerować GUID. Ważne jest jednak, że nie jest to sekwencyjny GUID w starym stylu.

Wygląda jednak na to, że php nie ma własnej funkcji generującej GUID. Funkcja com_create_guid zasugerowana w innej odpowiedzi wydaje się być dostępna tylko w php podczas działania w systemie Windows.

Jest użytkownik zaproponował alternatywę dla com_create_guid dla innych niż Windows na stronie ręcznego dla niego:

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

Ale muszę przyznać, że będę chciał wykorzystać go do czegoś ważnego w przypadku nie było nieczytelny problem czający się w nim, że mój umysł nie kryptograficznie wyłapał.

8

Spróbuj uniqid - a może połączyć z hash md5, jak podano w przykładach:

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

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

Muszę jednak zauważyć, że żadne wygenerowane w ten sposób adresy URL (bez względu na algorytm hashowy) będą "bezpieczne", po prostu bardzo trudne do odgadnięcia.

+0

+1, UUID to sposób na osiągnięcie tych ... prawie tak dobre, jak konwencjonalna entropia do wysiania md5. –

2

Identyfikator musi być niemożliwy do odgadnięcia, identyfikatory GUID są unikalne, ale nie są trudne do odgadnięcia.

Potrzebujesz dobrego generatora liczb losowych, każda biblioteka kryptografii/szyfrowania ma co najmniej jedną, nie znam PHP, więc nie mogę podać nazwy funkcji.

Następnie musisz zdecydować, jak długo losowy numer będzie, należy wybrać długość tak duże, że ktoś zgadywania numer dostanie numer obsadzony - albo:

  1. Szacunkowa liczba unikalnych adresów URL będziesz musiał wygenerować, obliczyć ile bitów potrzebujesz, aby je wszystkie reprezentować, a następnie podwoić liczbę bitów (przynajmniej).

  2. Albo przyjąć największą liczbę użytkownicy będą akceptować

Teraz masz „bezpieczne” numer można po prostu przekonwertować go na dziesiętny, szesnastkowy lub base64 i użyć tego ciągu.

+0

http://www.phptalk.net/2009/01/27/all-about-randomness-and-entropy/ Sugeruje kilka dobrych (pseudo) losowych generatorów liczb dla php – menko

1

Przycinanie Dodatkowe belki kręcone

$ dnik = strtolower (przycinania (com_create_guid() "{}")); (PHP 5 lub nowszy)

1

Jeśli chcesz się upewnić, że adres URL jest zarówno unikalne i mogą być wykorzystywane tylko ograniczoną liczbę razy:

  • przechowywać niewielką bazę danych z takich dziedzin jak: RandomKey, InternalURL , Counter, TimeStamp

  • Utwórz losową liczbę z wystarczająco dużej puli.
    nie były kolejne GUID powinien być wystarczający

  • zapisać go w swojej bazie danych jako RandomKey wraz z rzeczywistą wewnętrzną URL lub zasobów kodu potrzebnego przez system do obsługi tego adresu URL i datownik.

  • Gdy użytkownik kliknie lub wpisuje adres URL, sprawdź je przeciwko tej bazy danych: jeśli TimeStamp jest zbyt stary lub Counter jest zbyt wysoka, podjąć odpowiednie działania (na przykład, jeśli chcesz to URL, aby były dostępne dla ograniczonej czas lub pewna liczba razy).
    W przeciwnym razie, po prostu potraktuj żądanie, używając InternalURL i wyślij jego wynik z powrotem do użytkownika.

  • Gdy adres URL został użyty lub osiągnął swój maksymalny licznik użycia, po prostu usuń go z bazy danych, aby nie mógł być dalej używany.

To jest świetne, aby podać jednorazowe adresy URL, których praktycznie nie można odgadnąć.

Oczywiście należy również przeprowadzić pewne kontrole bezpieczeństwa w celu ograniczenia szybkości, z jaką ludzie mogą próbować uzyskać dostęp do nieprawidłowego adresu URL.

2

chciałbym tego uniknąć przez:

1) Bezpośrednia zalogowaniu skrótu/ikony dla użytkowników

ponieważ te adresy mogą być buforowane/zalogowany proxy, blogach, pamięci podręcznej przeglądarki, zakładki, e-maile itp.

Powiązane problemy