2010-08-28 19 views
7

यहाँपीएचपी सुरक्षित लॉगिन - पासवर्ड एन्क्रिप्शन

main_login.php 

    <form name="form1" method="post" action="checklogin.php"> 
    Username:<input name="myusername" type="text" id="myusername" /> <br /> 
    Password:<input name="mypassword" type="password" id="mypassword" /> 
    <input type="submit" name="Submit" value="Login" /> 
    </form> 

प्रवेश प्रणाली सुरक्षित लॉगिन लागू किया जाना है जो करने के लिए/है Checklogin.php

<?php 
ob_start(); 
$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password=""; // Mysql password 
$db_name="cosmos"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'"; 
$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
// If result matched $myusername and $mypassword, table row must be 1 row 

if($count==1){ 
// Register $myusername, $mypassword and redirect to file "login_success.php" 
session_register("myusername"); 
session_register("mypassword"); 
header("location:login_success.php"); 
} 
else { 
echo "Wrong Username or Password"; 
} 

ob_end_flush(); 
?> 

login_success.php

<?php 
session_start(); 

if(isset($_SESSION['username']) && ($_SESSION['username'] == $myusername)){ 
header("location:main_login.php"); 
} 
?> 

<html> 
<body> 
Login Successful. <a href="logout.php">Logout</a> 
</body> 
</html> 

logout.php

<?php 
session_destroy(); 

header("location:main_login.php"); 
?> 

समस्या यह है कि मैं पासवर्ड एन्क्रिप्शन या किसी अन्य विधि (यदि कोई हो) द्वारा यह सुरक्षित लॉगिन करना चाहता हूं। मैं PHP के लिए शुरुआत कर रहा हूं

+1

आप वास्तव में क्या एन्क्रिप्ट करना चाहते हैं और क्यों? –

+2

आपको पासवर्ड इनपुट फ़ील्ड्स के लिए 'password' टाइप करना चाहिए। – Gumbo

उत्तर

5

आप md5 के साथ एक डिग्री करने के लिए पासवर्ड एन्क्रिप्ट कर सकते हैं मिल जाएगा। // Define $myusername and $mypassword $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; $mypassword = md5($mypassword);

तुम भी जब भी आप एक उपयोगकर्ता के लिए साइन अप किया है इस का उपयोग करने की आवश्यकता होगी: आप से जब उपयोगकर्ता ऊपर और प्रवेश md5 से पहले संकेत ....

उदाहरण पासवर्ड MD5 की आवश्यकता होगी।

+0

यह बेहद असुरक्षित है। आपको एक मजबूत हैशिंग एल्गोरिदम (जैसे bcrypt) का उपयोग करना चाहिए। आपका कोड एसक्यूएल इंजेक्शन के लिए भी कमजोर है। – CountMurphy

2

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

मान लीजिए पासवर्ड myPassword है तो बस यह स्टोर नहीं करते, यह पहली बार md5 की तरह एक कलन विधि का उपयोग तब हैश जो अपने डेटाबेस में deb1536f480475f7d593219aa1afd74c है की दुकान हैश। फिर जब उपयोगकर्ता पासवर्ड दर्ज करता है, तो हैश करें और दो हैश की तुलना करें।

अधिक सुरक्षित दृष्टिकोण के लिए, SSL का उपयोग करें।

+1

एन्क्रिप्शन उलटा है; और यह एक अच्छा विचार नहीं है। बेहतर उपयोग हैशिंग। – Gumbo

1

आम तौर पर आप डेटाबेस में पासवर्ड का हैश स्टोर करेंगे md5 हालांकि यह वेबपृष्ठ और सर्वर के बीच सुरक्षित नहीं है - इसके लिए आपको https का उपयोग करने की आवश्यकता है।

यहां दो चीज़ें हैं।

1. यदि मैं एक गूंगा उपयोगकर्ता हूं और जब मैं आपकी साइट के लिए साइन अप करता हूं तो मुझे पासवर्ड देना होगा, मैं वही पासवर्ड दे सकता हूं जैसा मैंने कहीं और इस्तेमाल किया था, इसलिए आपकी साइट को वास्तव में पासवर्ड का हैश स्टोर करना चाहिए वास्तविक चीज़ों के कारण यदि वे हैक हो जाते हैं तो हमलावरों को मेरा पासवर्ड नहीं मिलेगा जो मैंने हर जगह इस्तेमाल किया था। ऐसा करने के लिए आप हैश को अपने सदस्यों की तालिका में संग्रहीत करते हैं और क्वेरी में यह जांचता है कि यह मान्य है, आप वास्तविक चीज़ के बजाय हैश पास करते हैं।

2. http के तहत पासवर्ड सादे पाठ में सर्वर से सर्वर पर भेजा जाएगा। यदि यह इंटरनेट पर है और किसी हमलावर के पास ब्राउज़र और क्लाइंट के बीच किसी भी नेटवर्क तक पहुंच है तो वे पासवर्ड देख सकते हैं - यदि आपने जावास्क्रिप्ट का उपयोग कर ब्राउज़र में हैश किया है तो हमलावर हैश उठा सकता है और संभवतः इसे लॉगिन करने के लिए उपयोग कर सकता है आपकी जगह। यही कारण है कि हमारे पास https है। कम लागत के लिए (विशेष रूप से विकास लागत की तुलना में) आप एक प्रमाणपत्र खरीद सकते हैं जो कनेक्शन को सुरक्षित रखेगा। यदि आप ऐसा नहीं करना चाहते हैं तो आप स्वयं प्रमाण पत्र पर हस्ताक्षर कर सकते हैं और इसका उपयोग कर सकते हैं। यदि आपकी होस्टिंग आपको प्रमाणपत्र का उपयोग करने की अनुमति नहीं देती है तो घर ब्रूव समाधान बनाना संभव हो सकता है लेकिन यह अन्य होस्टिंग को ढूंढना बहुत बेहतर है।

+0

ठीक मैं इस पर वास्तव में बुरा हूँ, लेकिन मैं उदाहरण के लिए अगर मैं न तो एसएसएल के लिए उपयोग किया है कि कैसे मैं हैश विधियों का उपयोग करते किसी कारण के कारण जानना चाहता? मेरा मतलब है कि मुझे md5 फ़ंक्शन और सभी का उपयोग करके साइन अप पेज बनाना है, क्या आप इसे समझा सकते हैं ... –

+0

@ ट्यून एसएसएल के पास वैसे भी कुछ भी नहीं है। यह सुरक्षित पासवर्ड भंडारण है, लॉगिन सिस्टम नहीं हर कोई बात कर रहा है। –

+0

मेरा संपादन देखें - लेकिन जैसा कि किसी और ने उल्लेख किया है शायद आपको अपना खुद का कार्यान्वयन करने से पहले कुछ ओपन सोर्स सीएमएस आज़माएं। –

2

आप तालिका में साइनअप डेटा डालने के दौरान md5 ($ पासवर्ड) या sha1 ($ पासवर्ड) का उपयोग कर सकते हैं।

फिर से लॉगिन लॉगिन करने के लिए

$ एसक्यूएल मैच के लिए = "का चयन करें * $ tbl_name से कहां उपयोगकर्ता नाम = '$ myusername' और पासवर्ड = '" "" md5 ($ mypassword)।।'; $ परिणाम = mysql_query ($ sql);

आगे की रक्षा के लिए कुछ और तरीका भी है। शा 1 और नमक के संयोजन का उपयोग करना।

जिस तरह से आप कुछ त्वरित PHP फ्रेमवर्क कोज़ का उपयोग नहीं करते हैं, इन छोटी चीजें पहले से ही उनके साथ बनाई गई हैं।

धन्यवाद

+3

@ ट्यूनेटोसुरज: आप एक PHP शुरुआत करने के दौरान एक सीएमएस बना रहे हैं? आप एक ओपनसोर्स सीएमएस का उपयोग करके सुझाव देते हैं कि आप उनकी जरूरतों को अनुकूलित करते हैं? –

4

अभी शुरुआत के रूप में, सबसे अधिक संभावना है कि आप किसी भी एन्क्रिप्शन जरूरत नहीं है। विशेष रूप से क्योंकि यह जावास्क्रिप्ट होगा, PHP नहीं।
हालांकि यह किया जा सकता है।
आप टुकड़ों में बंटी चुनौती को लागू करने डाइजेस्ट प्रमाणीकरण स्कीमा का उपयोग

  • सर्वर एक चुनौती भेज सकता है - एक यादृच्छिक strimg
  • ग्राहक इस चुनौती का एक हैश और एक पासवर्ड
  • इस हैश बनाने के सर्वर के लिए भेजा जा रहा है
  • सर्वर एक हैश कर रहा है और

दोनों की तुलना में जावास्क्रिप्ट एमडी 5 हैशिंग एल्गोरिदम कार्यान्वयन शुद्ध।

बेशक, इस घर के कार्यान्वयन पर एक एसएसएल प्रमाणपत्र पसंद किया जाएगा।

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

कुछ समय के लिए कुछ नोट्स।
आपका लॉगिन_समूह कोड या तो काम नहीं करेगा और कुछ भी सुरक्षित नहीं करेगा।
यह सिर्फ

if(isset($_SESSION['username'])){ 

होना चाहिए कोई $ myusername तुलना करने के लिए चर रहा है क्योंकि वहाँ।
और वहाँ exit;header("location:... सही होने के बाद
होना चाहिए या एक ग्राहक की रक्षा की सामग्री वैसे भी

+2

घर का बना कार्यान्वयन एक मैन-इन-द-बीच हमले के साथ पराजित किया जा सकता है। फिर भी, यह छिपाने के खिलाफ सुरक्षित है। –

+0

@ जॉर्ज कैसे आते हैं? मुझे कोई रास्ता नहीं दिख रहा है –

+0

एक मैन-इन-द-बीच क्लाइंट को भेजे गए जावास्क्रिप्ट को संशोधित कर सकता है (उदा। एन्क्रिप्शन कोड हटाएं) या सर्वर के रूप में पॉज़ करें। एक सच्चा एसएसएल सुरक्षित कनेक्शन प्रमाण पत्र के साथ काम करता है यह सुनिश्चित करने के लिए कि जिस सर्वर से आप बात कर रहे हैं वह वास्तव में वह सर्वर है जिसे आप बात करना चाहते हैं। –

2

करने से पहले उन्हें संग्रहीत एक से तुलना का उपयोग

$static_salt='asdfasdfqwertyuiop123ABC_some_static_salt_string'; 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 
$mypassword=hash('sha512', $mypassword . $static_salt . $myusername); 

आप टुकड़ों में बांटा पासवर्ड की दुकान है और किसी भी पासवर्ड हैश चाहिए चाहिए। http://uk1.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash तुम भी उपयोग कर रहा salts

+0

हैश एल्गोरिदम SHA * हैश पासवर्ड के लिए उपयुक्त नहीं है, विशेष रूप से आपके उदाहरण में अनसुलझा नहीं है। वे बहुत तेज़ तरीके हैं, इसके बजाए बीसीआरपीटी या पीबीकेडीएफ 2 जैसे धीमी कुंजी-व्युत्पन्न कार्य का उपयोग करें। – martinstoeckli

+0

मैं मानता हूँ आपको दो लिंक मैं अपने जवाब में शामिल किया है पीएचपी डॉक्स पर एक नज़र डालें तो के बारे में उपयुक्त हैशिंग एल्गोरिदम में बात करती है लेकिन मुझे लगता है SHA512 SHA1 की तुलना में बेहतर विकल्प है इसलिए मैं अपने जवाब में बदल जाएगा और मैं भी साथ एक लिंक प्रदान लवण पर जानकारी जो मैं अपने उत्तर में भी जोड़ूंगा। – nettux443

+1

मैं समझता हूं कि आप केवल स्वीकार्य उत्तर में सुधार करना चाहते हैं, लेकिन यह एक बहुत पुराना धागा है, और उत्तर पर टिप्पणी में इसे इंगित करना बेहतर होगा। आपका उदाहरण अभी भी पासवर्ड हैशिंग का एक बहुत ही असुरक्षित तरीका है, एक स्थिर नमक को नमक के रूप में नहीं गिना जा सकता है, और SHA512 अभी भी उपयुक्त नहीं है। मैं आपको [सुरक्षित पासवर्ड भंडारण] (http://www.martinstoeckli.ch/hash/en/index.php) के बारे में अपने ट्यूटोरियल को पढ़ने के लिए आमंत्रित करना चाहता हूं। – martinstoeckli

0

md5 इस मामले में सबसे अच्छा होगा विचार करना चाहिए: md5 hashing पासवर्ड देखने के लिए अनुकूल नहीं है। इनपुट विवरण चलाएं जैसे कि MD5 फ़ंक्शन के माध्यम से पासवर्ड और अपने डेटाबेस में डालें।

इसका लगभग अपरिवर्तनीय है इसलिए इसका उपयोग करने का एकमात्र तरीका लॉगिन पर एमडी 5 का उपयोग करना और डेटाबेस में संग्रहीत संस्करण के साथ एमडी 5 पासवर्ड को लॉग इन करना है।

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