Özel, Unique, Güvenli URL'leri oluşturuluyor

7 Cevap php

Ben aşağıda örneklere benzer url güvenli bir tek tıklamayla erişim türü oluşturmak istiyorum. Ben PHP kullanarak olacak ama ben sadece temel kavramı anlamak için arıyorum gibi o alakasız. Bazı cevaplar GUıD'SINI öneririz, ama bu bana aşağıdaki gibi bir kesinlikle benzersiz, güvenli bir URL verecektir sanmıyorum.

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

Çok güvenli görünüyor gibi ben 128 karakterin, 1024 bit tarzı, doğru eğilim. Ben dört MD5 sağlamalarının yapmak ve bunları birleştirmek olabilir sanırım, ama bu gerçekten etkili mi?

Ben bu gibi bir url için iki özel niyetleri var, ama ben bu yararlı olabilir diğerleri vardır eminim.

Kullanıcıları için kısayol / simgesinde 1) Anlık log

2) Tek kullanımlık url (Şifre kurtarma bağlantılar)

7 Cevap

Güncelleme:

Tek kullanımlık bir URL gibi bir şey, ben öne sürülmüştür GUID-esque appoach ile gitmek istiyorum. Linke kısa bir ömrü var emin olun.

Bir anlık için log-in, tek bir URL var gerçekten güvenli bir şekilde hayır vardır.

Evet tahmin etmek lanet yakın imkansız olacak bir URL oluşturabilir, ama bu sana süper güvenlik vermez. Kullanıcıların hatırlamak istiyorsanız, neden bir şifreli kimlik doğrulama tanımlama kullanmak değil mi?

Verdiğiniz örnek, Google Takvim yalnız URL yoluyla sizi oturum yok, URL şey anlamına gelir ilk önce kimlik doğrulaması gerekir.

Örneğin Benim gmail google takvimde tıklayarak bana veriyor:

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

O bana ilk olarak doğrulanmış ettik sürece hesabıma erişmeye yardımcı olmuyor.

Eski bir yazı:

Sen com_create _guid PHP kullanarak bir GUID oluşturmak ve bu kullanabilirsiniz.

Linux üzerinde Sana uuid_create kullanın veya bu kod düşünüyorum 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();
?>

uniqid - deneyin ve örneklerde verildiği gibi, belki de, bir MD5 hash ile birleştirmek:

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

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

Ben bu şekilde üretilen hiçbir adresler (ne olursa olsun karma algoritması), tahmin etmek gerçekten çok zor 'güvenli' olacağını ancak dikkat etmeliyiz.

Sadece bir GUID oluşturmak. Bu olsa bir eski stil sıralı GUID değil, olsa önemlidir.

Ancak php kendi GUID üreten fonksiyonu yok görünür. Başka bir cevap önerdi com_create_guid işlevi Windows üzerinde çalışırken, sadece php kullanılabilir görünüyor.

com_create_guid non-Windows bunun için manuel sayfada için bir kullanıcı önerilen alternatif var:

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

Ama benim olmayan kriptografik eğitilmiş zihin nokta yoktu bunun içinde gizlenen olmayan belirgin bir sorun vardı durumunda önemli bir şey için kullanmak isteksiz olurdu itiraf etmeliyim.

Id tahmin etmek imkansız olmalıdır, GUID benzersiz ama tahmin etmek zor değildir.

Sen bu yüzden size işlev adını veremem ben PHP bilmiyorum, her şifreleme / şifreleme kütüphanesi en az bir iyi bir rasgele sayı üreteci, gerekir.

Sonra rasgele sayı ne kadar olacak karar vermek zorunda, bir sayı tahmin kimse atanmamış bir numara alacak kadar büyük bir uzunluğa seçmelisiniz - ya da:

  1. Eğer üretmek zorunda hepsini temsil eden ve daha sonra bit sayısını (en azından) iki katına gerekir kaç bit hesaplayabilirsiniz benzersiz URL'ler sayısını tahmin.

  2. Ya da, büyük sayı almak, kullanıcıların kabul edecek

Şimdi sen sadece ondalık dönüştürebilirsiniz bir "güvenli" numarası, altıgen veya base64 ve bu dizeyi kullanın.

Ben bu önleyeceğini:

Kullanıcıları için kısayol / simgesinde 1) Anlık log

Bu URL'ler önbelleğe alınabilir, çünkü / vekilleri, web günlükleri, tarayıcı önbelleği, yer imleri, e-posta vb giriş

Ek küme parantezi kırpmak

$ Guid = strtolower ((com_create_guid (), "{}") Döşeme); (PHP 5 veya üstü)

Eğer URL benzersiz hem de ve sadece bu kez sınırlı sayıda kullanılabilir olmasını sağlamak istiyorsanız:

  • Gibi alanlar ile küçük bir veritabanı tutun: RandomKey, InternalURL, Counter, TimeStamp

  • Create a random number out of a large enough pool.
    Non Sequential GUIDs should be sufficient

  • Gerçek iç URL veya URL işlemek için sistem tarafından ihtiyaç duyulan kaynak kodu ve zaman damgası ile birlikte, RandomKey gibi veritabanına kaydedebilirsiniz.

  • When the user clicks or enters a URL, check it against that database: if the TimeStamp is too old or the Counter is too high, take appropriate action (for instance if you want this URL to be accessible for a limited time or a certain number of times).
    Otherwise, just treat the request using the InternalURL and send its result back to the user.

  • URL kullanılır olmuştur veya maksimum kullanım sayacını ulaştığı zaman daha fazla kullanılamaz böylece, sonra sadece veritabanından silebilirsiniz.

Bu size tahmin etmek neredeyse imkansız bir defalık URL'leri vermek için harika.

Tabii ki, aynı zamanda insanların Geçersiz bir URL erişmeye deneyebilirsiniz hızını sınırlamak için bazı güvenlik kontrolleri uygulamak gerekir.