2010-08-20 19 views
5

मेरे पास मेरी वर्तमान वेबसाइट पर एक लॉगिन सेवा है और मैं क्या सोच रहा था - क्या कोई विशेष तरीका है जिसे आप सबसे सुरक्षित कह सकते हैं?PHP/MySQL सुरक्षित लॉगिन और सत्र

अनुमति दें मुझे मेरे प्रणाली थोड़ा बेहतर व्याख्या करने के लिए:

मैं वर्तमान में एक उपयोगकर्ता की मेज के साथ एक PHP MySQL डेटाबेस है। उपयोगकर्ता नाम और पासवर्ड दोनों VARCHAR के रूप में संग्रहीत हैं (मुझे पता है कि पासवर्ड के लिए सबसे अच्छा नहीं है)।

साइन अप फॉर्म साइड पर, मैं केवल ए-जेड 0-9 प्रविष्टि की अनुमति देकर और वर्णों की संख्या को सीमित करके पासवर्ड और उपयोगकर्ता नामों की पसंद को नियंत्रित करता हूं। लॉगिन प्रपत्र तरफ, मैं mysql_real_escape_string का उपयोग करके हमलों को रोकने और मैं AJAX के बजाय एक iframe पर पोस्ट का उपयोग करें।

मुझे लगता है कि मैं फॉर्म पक्ष से हमलों को रोकने के लिए कर सकता हूं, लेकिन डेटाबेस पक्ष से नहीं। मैं जानता हूँ कि आप डेटाबेस के लिए प्रवेश पर एन्क्रिप्ट करने के लिए पासवर्ड भंडारण के प्रकार बदल सकते हैं, लेकिन क्या मुझे समझ नहीं आता कि कैसे मैं तो यह एन्क्रिप्टेड स्ट्रिंग क्वेरी होता है।

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

+1

सबसे सुरक्षित तरीका एसएसएल + व्यक्तिगत प्रमाणपत्र है। हालांकि मुझे संदेह है कि आपकी साइट को वास्तव में सबसे सुरक्षित एक की आवश्यकता है। –

+2

और उल्लेख करने के लिए एक और बात। कुछ बुद्धिमान ने कहा, सुरक्षा कुछ ऐसा नहीं है जिसे अभी जोड़ा जा सकता है। यह एक बात नहीं है, यह एक प्रक्रिया है। –

+0

लेकिन किसी भी प्रक्रिया को परिचालन निर्देशों की एक श्रृंखला में तोड़ दिया जा सकता है। सिस्टम पूर्ण होने पर यह एक प्रक्रिया होगी। –

उत्तर

5

सबसे पहले, अपने डेटाबेस में सादा पाठ पासवर्ड संग्रहीत नहीं है (याद रखिए मैं गोपनीय या भड़काऊ डेटा को रखने के लिए एक प्रणाली बनाने नहीं कर रहा हूँ कि)। इसलिए, जब कोई नया उपयोगकर्ता पंजीकृत करते हैं तो अपना पासवर्ड hash के रूप में डालें। एमडी 5 का सबसे अधिक इस्तेमाल इस लिए किया जाता है। मैं इसके साथ नमक का उपयोग करने का सुझाव देता हूं। भंडारण के लिए तो:

$password = md5($yoursalt . $_POST['password']); 

अब जब उपयोगकर्ता के लिए लॉग इन करना चाहता है, तो आप अपने पासवर्ड को फिर से अपनी पोस्ट में किया है। अब पहले जैसा ही हैश बनाएं और डेटाबेस में इस हैश की खोज करें (उनके उपयोगकर्ता नाम के साथ)। इस तरह आप अपने वास्तविक पासवर्ड स्टोर नहीं करते हैं।

+2

+1 के आधार पर किस का उपयोग करना है, -1 "उपयोग के लिए MD5 "। यह 2010 है और एमडी 5 पासवर्ड हैशिंग, मृत के लिए है। कृपया SHA-2 फ़ंक्शंस में से कम से कम एक का उपयोग करें। – Piskvor

+0

धन्यवाद, यह एक बहुत मददगार रहा है। उपयोगकर्ता द्वारा पासवर्ड दर्ज करने और डेटाबेस से एन्क्रिप्टेड होने के बाद मेरी सोच प्रक्रिया बंद हो गई, इसलिए मैंने वास्तव में दर्ज पासवर्ड को एन्क्रिप्ट करने और तुलना करने के बारे में नहीं सोचा था। धन्यवाद –

+0

इसके अलावा, '$ yoursalt' प्रति-उपयोगकर्ता होना चाहिए, प्रति साइट नहीं; यह आपके उत्तर में स्पष्ट रूप से उल्लेख नहीं है। – Piskvor

3

एमडी 5 या एसएचए 1 में पासवर्ड को धक्का देना वेब सुरक्षा का एक महत्वपूर्ण हिस्सा है। जिस तरह से तो पासवर्ड का मिलान करने के लिए पहले, आपूर्ति उपयोगकर्ता नाम का उपयोग डीबी से टुकड़ों में बांटा पासवर्ड पुनः प्राप्त उपयोगकर्ता की आपूर्ति पासवर्ड हैश और फिर दो हैश मेल करने के लिए है। चूंकि MD5 और SHA1 एक ही रास्ता हैश हैं मतलब है यह है कि आप वर्तमान पासवर्ड यदि कोई उपयोगकर्ता यह खो दिया है प्राप्त नहीं कर सकता। एक नया पासवर्ड फिर से बनाया जाना चाहिए। आप PHPs mcrypt() फ़ंक्शंस का उपयोग कर इसके आसपास हो सकते हैं।

तुम भी पासवर्ड में विशेष वर्ण अनुमति चाहिए। यह सिर्फ ब्रूट फोर्स हमलों में जटिलता को जोड़ता है।

आप 3 गलत प्रयासों के बाद एक निश्चित अवधि के लिए खाता लॉक भी कर सकते हैं और यहां तक ​​कि 10 प्रयासों के बाद आईपी पते को लॉक करने के लिए भी जा सकते हैं। हालांकि बाद में 'टैर पिट्स' श्रेणी के अंतर्गत आता है। हैकर्स के लिए चीजों को थोड़ा और मुश्किल बनाता है।

+0

धन्यवाद। मैं अब कुछ एन्क्रिप्शन का उपयोग करने का प्रयास कर रहा हूं, जैसा कि मैंने ऊपर दिए गए उत्तर पर कहा था, मेरी सोच दर्ज किए गए पासवर्ड को एन्क्रिप्ट करने और तुलना करने के लिए विस्तारित नहीं हुई :(आपके उत्तर के साथ बहुत स्पष्ट होने के लिए धन्यवाद, बहुत से लोग बस बहुत फेंक देंगे मेरे रास्ते को झुकाव, और अनुभवहीन होने के नाते (मैं केवल 22 वर्ष का हूं) यह –

+0

सीखने का सबसे अच्छा तरीका नहीं होगा पासवर्ड को मैक्रिप्ट करना बेहद खतरनाक है क्योंकि यह उलटा है .. कोई पासवर्ड सुरक्षित करने की विधि को उलट नहीं किया जाना चाहिए। – MRW

1

जब पासवर्ड पैदा करने मैं हमेशा एक उपयोगकर्ता विशिष्ट नमक का उपयोग करें, तो मेरे 'उन' तालिका दो क्षेत्रों 'encrypted_salt' और 'पासवर्ड' है

शीर्ष और यह के नीचे है कि मैं SHA1 (encrypted_salt + 'पासवर्ड है ');

एन्क्रिप्टेड_साल्ट उत्पन्न करते समय मैं sha1 (unqid (true)) का उपयोग करता हूं; जो लगभग 100% अद्वितीय नमक उत्पन्न करता है क्योंकि यह अपने स्वयं के अतिरिक्त एन्ट्रॉपी (नमक) के साथ मिलीसेकंड में समय का उपयोग करता है। डुप्लीकेट प्राप्त करने की संभावना लगभग 0 है।

तो:

$salt = sha1(unqid(true)); 
$password = sha1($_POST['password']); 

के रूप में डीबी में दुकान:

$pw = sha1($salt.$password); or sha1($password.$salt); 

यह वास्तव में कोई फर्क नहीं पड़ता।

SHA1 की सुंदरता यह है कि यह हमेशा 40 वर्ण स्ट्रिंग उत्पन्न करेगी। जितना अधिक आप स्ट्रिंग को बेहतर कर सकते हैं, खासकर यदि आप प्रत्येक पासवर्ड के लिए एक अद्वितीय नमक उत्पन्न कर सकते हैं।

+0

मुझे बेसिंग माना जाता है उपयोगकर्ता के उपयोगकर्ता नाम + आईडी के एन्क्रिप्टेड संस्करण पर नमक, क्या आप इस व्यवहार्य पर भी विचार करेंगे? –

+0

हाँ, क्योंकि उपयोगकर्ता की आईडी (पीसी) हमेशा अद्वितीय होनी चाहिए, एक सर्वोत्तम अभ्यास के रूप में मैं हमेशा किसी प्रकार का टाइमस्टैम्प का उपयोग करता हूं हैश में ताकि आप microtime (true) या time() या unqid() का उपयोग कर सकें क्योंकि 2 उपयोगकर्ता बिल्कुल उसी मिलीसेकंड में जोड़े जाते हैं, खासकर जब PHP बहु-प्रसार को संभाल नहीं लेता है।लेकिन username.id ठीक होगा विशेष रूप से धोया जाएगा। – MRW

+0

हैशिंग के साथ, sha1 बनाम md5 मुझे लगता है कि व्यक्तिगत वरीयता है। मैं हमेशा sha1() का उपयोग करता हूं लेकिन एमडी 5 उतना ही अच्छा है! – MRW

1

जहां तक ​​आपका एसक्यूएल जाता है, स्ट्रिंग-मुंगिंग फ़ंक्शन का उपयोग न करें जैसे mysql_real_escape_string जो कुछ परिस्थितियों में इंजेक्शन हमलों को होने की अनुमति दे सकता है। पैरामीटरयुक्त प्रश्नों का प्रयोग करें, इस प्रकार यह सुनिश्चित करना कि डेटाबेस सभी उपयोगकर्ता-आपूर्ति स्ट्रिंग को डेटा के रूप में, सभी परिस्थितियों में, और संभवतः SQL कोड खंडों के रूप में नहीं मानता है।

PHP में MySQLi और पीडीओ पुस्तकालय दोनों पैरामीटर किए गए प्रश्नों का समर्थन करते हैं।

+0

धन्यवाद करने के लिए अद्वितीय है, मैं अपने कोड में इन पुस्तकालयों कैसे लागू होगा निर्माण हो जाएगा? मैं पैरामीटरयुक्त क्वेरी कैसे निष्पादित करूं? –

+0

इस पर चारों ओर दस्तावेज़ और ट्यूटोरियल की एक बड़ी मात्रा है। यहां एक http://forum.codecall.net/php-tutorials/12442-php-5-mysqli-prepared-statements.html है – Cheekysoft

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