मुझे लगता है कि आप डेटाबेस में पासवर्ड का हैश संग्रहीत कर रहे हैं, लेकिन अन्य पाठकों के लाभ के लिए, डेटाबेस में सादा पाठ में स्टोर पासवर्ड कभी नहीं। आप like Monster.com.uk नहीं बनना चाहते हैं!
आपको MD5()
से अधिक मजबूत हैशिंग फ़ंक्शन का उपयोग करना चाहिए। आदर्श रूप से आपको SHA256 का उपयोग करना चाहिए। यह हैश विधि hash()
फ़ंक्शन का उपयोग करके PHP में उपलब्ध है।
आपको पासवर्ड पर एक यादृच्छिक salt भी लागू करना चाहिए। प्रत्येक उपयोगकर्ता के खाते के लिए एक अलग नमक मूल्य स्टोर करें। यह शब्दकोश हमलों और rainbow table हमलों को हराने में मदद करता है।
आपको पुराने mysql एक्सटेंशन के बजाय mysqli एक्सटेंशन का उपयोग करना सीखना चाहिए। Mysqli पैरामीटरयुक्त प्रश्नों का समर्थन करता है, ताकि आप कुछ एसक्यूएल इंजेक्शन हमलों के लिए भेद्यता को कम कर सकें।
यहां कुछ उदाहरण कोड है। मैं यह परीक्षण किया है नहीं है, लेकिन यह बहुत काम कर के करीब होना चाहिए:
$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 = ?
के लिए परीक्षण करना चाहिए, लेकिन मुझे लगता है कि ऐसा करने के लिए पसंद नहीं है। यदि आप ऐसा करते हैं, तो आप नहीं जानते कि लुकअप विफल हुआ है क्योंकि लॉगिन मौजूद नहीं था, या क्योंकि उपयोगकर्ता ने गलत पासवर्ड प्रदान किया था।
बेशक आपको उस उपयोगकर्ता को प्रकट नहीं करना चाहिए जिसने असफल लॉगिन प्रयास किया है, लेकिन आपको जानने की आवश्यकता हो सकती है, ताकि आप संदिग्ध गतिविधि लॉग कर सकें।
@Javier अपने जवाब में कहा गया है कि आप डेटाबेस से पासवर्ड (या इस मामले में पासवर्ड हैश) को पुनः प्राप्त नहीं करना चाहिए। मैं सहमत नहीं हूँ।
जेवियर PHP कोड में md5()
पर कॉल करना और परिणामस्वरूप हैश स्ट्रिंग डेटाबेस को भेज रहा है। लेकिन यह आसानी से पासवर्ड को सलाम करने का समर्थन नहीं करता है। PHP में हैश करने से पहले आपको इस उपयोगकर्ता के नमक को पुनः प्राप्त करने के लिए एक अलग क्वेरी करना है।
विकल्प plaintext अपने PHP ऐप से अपने डेटाबेस सर्वर पर नेटवर्क पर पासवर्ड भेज रहा है। आपके नेटवर्क को वायरटैप करने वाला कोई भी व्यक्ति इस पासवर्ड को देख सकता है। यदि आपके पास SQL क्वेरी लॉग इन हैं, तो जो भी लॉग तक पहुंच प्राप्त करता है वह पासवर्ड देख सकता है। प्रेरित हैकर पुरानी फाइल सिस्टम बैकअप मीडिया खोजने के लिए डंपस्टर-डाइव भी कर सकते हैं, और लॉग फाइलें इस तरह से पढ़ सकते हैं!
डेटाबेस से पासवर्ड हैश स्ट्रिंग को PHP ऐप में लाने का कम जोखिम है, इसे उपयोगकर्ता के इनपुट (PHP कोड में भी) के हैश से तुलना करें, और फिर इन चर को छोड़ दें।
हम यहाँ stackoverflow पर लॉगिन के बारे में सवालों का जवाब नहीं है। हम महान तकनीकी विवरण में, उपयोगकर्ता इनपुट को स्वच्छ करने के तरीके को समझाना पसंद करते हैं। काम करने वाली वेबसाइट की तुलना में सुरक्षित होना बेहतर है। – Grant
@ अनुदान: आप मजाक कर रहे हैं, है ना? –
ध्यान रखें कि इस पृष्ठ के उत्तरों पुराने हैं और इसलिए असुरक्षित हैं, इसके बजाय [प्रश्न] (http://stackoverflow.com/q/4795385/575765) पर एक नज़र डालें। – martinstoeckli