मैं देख रहा हूं कि आप डेटाबेस में पासवर्ड का हैश स्टोर कर रहे हैं, लेकिन अन्य पाठकों के लाभ के लिए, कभी नहीं डेटाबेस में सादे पाठ में पासवर्ड स्टोर करें। आप नहीं बनना चाहते Like Monster.com.uk !
आपको MD5()
. की तुलना में अधिक मजबूत हैशिंग फ़ंक्शन का उपयोग करना चाहिए . आदर्श रूप से आपको SHA256 का उपयोग करना चाहिए। यह हैश विधि PHP में hash()
का उपयोग करके उपलब्ध है
समारोह।
आपको एक यादृच्छिक नमक भी लगाना चाहिए। पासवर्ड को। प्रत्येक उपयोगकर्ता के खाते के लिए एक अलग नमक मूल्य स्टोर करें। यह शब्दकोश हमलों और इंद्रधनुष तालिका को हराने में मदद करता है हमले।
आपको mysqli का उपयोग करना सीखना चाहिए पुराने mysql एक्सटेंशन के बजाय एक्सटेंशन। Mysqli पैरामीटरयुक्त प्रश्नों का समर्थन करता है, ताकि आप कुछ SQL इंजेक्शन हमलों की भेद्यता को कम कर सकें।
यहाँ कुछ उदाहरण कोड है। मैंने इसका परीक्षण नहीं किया है, लेकिन यह काम करने के काफी करीब होना चाहिए:
$input_login = $_POST['login'];
$input_password = $_POST['password'];
$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);
while ($stmt->fetch()) {
$input_password_hash = hash('sha256', $input_password . $salt);
if ($input_password_hash == $password_hash) {
return true;
}
// You may want to log failed password attempts here,
// for security auditing or to lock an account with
// too many attempts within a short time.
}
$stmt->close();
// No rows matched $input_login, or else password did not match
return false;
कुछ अन्य लोगों का सुझाव है कि क्वेरी को login = ? AND password = ?
लेकिन मुझे ऐसा करना पसंद नहीं है। यदि आप ऐसा करते हैं, तो आप यह नहीं जान सकते कि लुकअप विफल हुआ क्योंकि लॉगिन मौजूद नहीं था, या क्योंकि उपयोगकर्ता ने गलत पासवर्ड प्रदान किया था।
बेशक आपको उस उपयोगकर्ता को प्रकट नहीं करना चाहिए जिसके कारण लॉगिन प्रयास विफल हुआ, लेकिन आप जानने की आवश्यकता हो सकती है, ताकि आप संदिग्ध गतिविधि लॉग कर सकें।
@ जेवियर अपने जवाब में कहता है कि आपको डेटाबेस से पासवर्ड (या इस मामले में पासवर्ड हैश) पुनर्प्राप्त नहीं करना चाहिए। मैं सहमत नहीं हूं।
जेवियर md5()
को कॉल करते हुए दिखाता है PHP कोड में और परिणामी हैश स्ट्रिंग को डेटाबेस में भेजना। लेकिन यह पासवर्ड को आसानी से नमकीन करने का समर्थन नहीं करता है। PHP में हैश करने से पहले आपको इस उपयोगकर्ता के नमक को पुनः प्राप्त करने के लिए एक अलग क्वेरी करनी होगी।
विकल्प सादा पाठ . भेज रहा है अपने PHP ऐप से अपने डेटाबेस सर्वर पर नेटवर्क पर पासवर्ड। आपके नेटवर्क को वायरटैपिंग करने वाला कोई भी व्यक्ति इस पासवर्ड को देख सकता है। यदि आपके पास SQL क्वेरी लॉग की जा रही हैं, तो लॉग तक पहुंच प्राप्त करने वाला कोई भी व्यक्ति पासवर्ड देख सकता है। प्रेरित हैकर पुराने फाइल सिस्टम बैकअप मीडिया को खोजने के लिए डंपस्टर-डाइव भी कर सकते हैं, और लॉग फाइलों को इस तरह पढ़ सकते हैं!
डेटाबेस से पासवर्ड हैश स्ट्रिंग को PHP ऐप में लाने का जोखिम कम है, इसकी तुलना उपयोगकर्ता के इनपुट के हैश से करें (PHP कोड में भी), और फिर इन चरों को त्याग दें।