2009-03-01 15 views
12

मैं नीचे दिए गए उदाहरणों के समान यूआरएल का सुरक्षित एक-क्लिक-एक्सेस प्रकार जेनरेट करना चाहता हूं। मैं PHP का उपयोग करूँगा लेकिन यह अप्रासंगिक है क्योंकि मैं अंतर्निहित अवधारणा को समझने के लिए देख रहा हूं। कुछ उत्तर एक GUID का उपयोग करने का सुझाव देते हैं, लेकिन मुझे नहीं लगता कि यह मुझे नीचे एक बिल्कुल अद्वितीय, सुरक्षित यूआरएल देगा।निजी, अद्वितीय, सुरक्षित URL उत्पन्न करना

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

मैं उस 128 वर्ण, 1024 बिट शैली की तरफ झुका रहा हूं, क्योंकि यह बहुत सुरक्षित लगता है। मुझे लगता है कि मैं चार एमडी 5 हैश बना सकता हूं और उन्हें मर्ज कर सकता हूं, लेकिन क्या यह वास्तव में प्रभावी है?

मेरे पास इस तरह के यूआरएल के लिए दो विशिष्ट इरादे हैं, लेकिन मुझे यकीन है कि ऐसे लोग भी हैं जो इसे उपयोगी पा सकते हैं।

1) उपयोगकर्ताओं

2) एकल-उपयोग यूआरएल (पासवर्ड वसूली लिंक)

+0

... क्यों? नहीं, गंभीरता से, आप इस तरह के यूआरएल क्यों चाहते हैं? ऐसा लगता है कि आप एक सत्र कुंजी को फिर से शुरू करने की कोशिश कर रहे हैं; अधिक संदर्भ के बिना, सही समाधान खोजने में आपकी सहायता करना मुश्किल है। – kquinn

+0

यह टैग की गई सुरक्षा क्यों है? – jmucchiello

+0

मुझे लगता है कि यह टैग की गई सुरक्षा थी क्योंकि इस तरह के यूआरएल आमतौर पर उपयोगकर्ता को लॉग इन करने या अपने पासवर्ड को रीसेट करने के लिए उपयोग किया जाता है। वे सत्र कुंजी से अलग होते हैं क्योंकि वे आम तौर पर सत्र आईडी जैसे सप्ताहों के लिए लटकने की बजाए एक ही ऑपरेशन के लिए केवल एक बार प्रयोग योग्य होते हैं। – Ben

उत्तर

9

अद्यतन:

एक एकल उपयोग URL कुछ इस तरह के लिए, मैं GUID-esque appoach कि सुझाव दिया गया है के साथ जाना चाहते हैं। लिंक पर एक छोटा जीवनकाल सुनिश्चित करें।

तत्काल लॉग-इन के लिए, एक ही यूआरएल रखने का कोई वास्तव में सुरक्षित तरीका नहीं है।

हां आप एक यूआरएल उत्पन्न कर सकते हैं जो अनुमान लगाने के लिए असंभव होने वाला है, लेकिन इससे आपको सुपर सुरक्षा नहीं मिलती है। यदि आप उपयोगकर्ताओं को याद रखना चाहते हैं, तो एन्क्रिप्टेड प्रमाणीकरण कुकी का उपयोग क्यों न करें?

उदाहरण जो आप देते हैं, Google कैलेंडर आपको केवल यूआरएल के माध्यम से लॉग इन नहीं करता है, आपको यूआरएल का मतलब कुछ भी पहले प्रमाणित करना होगा।

उदा। मेरे जीमेल से गूगल कैलेंडर पर क्लिक मुझे देता है:

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

है कि आप अपने खाते में प्रवेश जब तक आप पहले मुझे के रूप में प्रमाणीकृत किया है मदद नहीं करता है।

पुरानी पोस्ट:

आप com_create _guid का उपयोग कर PHP में एक GUID पैदा करते हैं और है कि उपयोग कर सकते हैं।

linux पर मुझे लगता है कि आप uuid_create उपयोग कर सकते हैं, या 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 एक विंडोज़ केवल php फ़ंक्शन प्रतीत होता है। – andynormancx

+0

सच है, मैं इस समय मुख्य रूप से एएसपी.NET पर हूं इसलिए मेरा परीक्षण सर्वर विंडोज चल रहा है, ऐसा लगता है जैसे मैंने आपके जैसा ही कोड अपडेट किया है। –

+0

मैं आपकी पोस्ट में अपने उदाहरणों के उपयोग की सराहना करता हूं। Upvoted। – Blaine

4

बस एक GUID उत्पन्न के लिए शॉर्टकट/आइकन में त्वरित लॉग। यह महत्वपूर्ण है हालांकि यह पुरानी शैली अनुक्रमिक GUID नहीं है हालांकि।

हालांकि ऐसा लगता है कि PHP के पास अपना स्वयं का GUID उत्पन्न करने वाला फ़ंक्शन नहीं है। किसी अन्य उत्तर में सुझाए गए com_create_guid फ़ंक्शन को Windows पर चलते समय केवल php में उपलब्ध होना प्रतीत होता है।

एक उपयोगकर्ता सुझाव com_create_guid के लिए गैर- Windows के लिए मैन्युअल पृष्ठ पर इसके लिए विकल्प नहीं है:

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

लेकिन मैं स्वीकार करने के लिए मैं कुछ भी महत्वपूर्ण के लिए इसका इस्तेमाल करने के मामले में वहाँ था अनिच्छुक हो चाहते हैं इसमें कोई स्पष्ट समस्या नहीं है कि मेरे गैर-क्रिप्टोग्राफिक रूप से प्रशिक्षित दिमाग में कोई जगह नहीं है।

8

uniqid का प्रयास करें - और उदाहरण के रूप में दी शायद, एक MD5 हैश के साथ गठबंधन:

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

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

मुझे ध्यान रखना चाहिए कि इस तरह से उत्पन्न कोई यूआरएल (जो भी हैश एल्गोरिदम) 'सुरक्षित' होगा, अनुमान लगाने में बहुत मुश्किल है।

+0

+1, यूयूआईडी इनके लिए जाने का तरीका है .. लगभग एमडी 5 के लिए परंपरागत एन्ट्रॉपी के रूप में अच्छा है। –

2

आईडी को अनुमान लगाना असंभव होना चाहिए, GUID अद्वितीय हैं लेकिन अनुमान लगाने में मुश्किल नहीं है।

आपको एक अच्छी यादृच्छिक संख्या जनरेटर की आवश्यकता है, प्रत्येक क्रिप्टोग्राफी/एन्क्रिप्शन लाइब्रेरी में कम से कम एक है, मुझे PHP नहीं पता है इसलिए मैं आपको फ़ंक्शन नाम नहीं दे सकता।

तो फिर तुम तय करने के लिए कितनी देर तक अपने यादृच्छिक संख्या हो जाएगा है, तो आप इतना बड़ा है कि एक नंबर अनुमान लगा किसी को भी एक अ-निरुपित नंबर मिल जाएगा लंबाई का चयन करना चाहिए - या तो:

  1. अनुमान अनन्य URL की संख्या आपको उत्पन्न करना होगा, गणना करें कि आपको उन सभी का प्रतिनिधित्व करने के लिए कितने बिट्स की आवश्यकता है और फिर बिट्स की संख्या दोगुना करें (कम से कम)।

  2. या, सबसे बड़ी संख्या ले अपने उपयोगकर्ताओं को स्वीकार करेंगे

अब आप बस, दशमलव में हेक्स या बेस 64 और उस स्ट्रिंग का उपयोग करने के लिए इसे परिवर्तित कर सकते हैं एक "सुरक्षित" संख्या है।

+0

http://www.phptalk.net/2009/01/27/all-about- यादृच्छिकता-and-entropy/ php के लिए कुछ अच्छे (छद्म) यादृच्छिक संख्या जेनरेटर सुझाता है – menko

1

ट्रिम करने के लिए अतिरिक्त घुंघराले ब्रेसिज़

$ GUID = strtolower (ट्रिम (com_create_guid(), "{}")); (PHP 5 या बाद में)

1

आप यह सुनिश्चित करें कि URL दोनों अद्वितीय है चाहते हैं और केवल समय की एक सीमित संख्या में इस्तेमाल किया जा सकता है:

  • जैसे क्षेत्रों के साथ एक छोटे डेटाबेस रखें: RandomKey, InternalURL , Counter, TimeStamp

  • एक बड़े पर्याप्त पूल से यादृच्छिक संख्या बनाएं।
    गैर अनुक्रमिक GUIDs पर्याप्त

  • यह सहेजें RandomKey के रूप में अपने डेटाबेस में होना चाहिए, आपके सिस्टम की जरूरत है कि यूआरएल और एक समय स्टाम्प को संभालने के लिए वास्तविक आंतरिक URL या संसाधन कोड के साथ।

  • उपयोगकर्ता क्लिक करता है या एक URL प्रवेश करती है, यह है कि डेटाबेस के खिलाफ जांच: यदि आप इस URL एक सीमित के लिए सुलभ होना चाहते हैं TimeStamp बहुत पुराना है या Counter बहुत अधिक है, उचित कार्रवाई (उदाहरण के लिए ले समय या कुछ निश्चित समय)।
    अन्यथा, InternalURL का उपयोग करके अनुरोध का इलाज करें और इसके परिणाम को उपयोगकर्ता को भेजें।

  • जब यूआरएल का उपयोग किया गया है या अपने अधिकतम उपयोग काउंटर तक पहुंच गया है, तो बस इसे डेटाबेस से हटा दें ताकि इसका उपयोग आगे नहीं किया जा सके।

यह आपको एक बार के यूआरएल देने के लिए बहुत अच्छा है जो अनुमान लगाने के लिए व्यावहारिक रूप से असंभव हैं।

बेशक, आपको उस दर को सीमित करने के लिए कुछ सुरक्षा जांच भी लागू करनी चाहिए, जिस पर लोग अमान्य यूआरएल तक पहुंचने का प्रयास कर सकते हैं।

2

मैं के लिए इससे बचने होगा:

1) उपयोगकर्ताओं

के लिए शॉर्टकट/आइकन में त्वरित लॉग क्योंकि इन यूआरएल कैश्ड किया जा सकता है/प्रॉक्सी, वेबलॉग, ब्राउज़र कैश, बुकमार्क्स लॉग ऑन, ईमेल इत्यादि

संबंधित मुद्दे