2011-11-17 20 views
6

उत्पन्न करने वाली क्वेरी मेरे पास उपयोगकर्ता डेटा अपडेट करने के लिए एक फॉर्म है। यह इस पर भी पोस्ट कर:अप्रत्याशित परिणाम (sha1)

<?php 
    //Update user table 
    session_start(); 
    include 'sql_connect_R.inc.php'; 

    $id = mysql_real_escape_string($_POST['userID']); 
    $password = mysql_real_escape_string($_POST['user_passwrd']); 

    $salt = time(); 
    $hash = sha1($password . $salt); 

    mysql_query("UPDATE users SET user_passwrd = '$hash', stamp = '$salt', pending = 'yes' 
    WHERE userID = '$id'"); 

    mysql_close($con); 
?> 

(मैं चीजों को इस सवाल का उचित नहीं बाहर संपादित किया है)

मेरा मानना ​​है कि क्या हो रहा है जब 'टिकट' फ़ील्ड $ नमक के साथ डाला जा रहा है है यह जब $ हैश की गणना की जा रही है उससे अलग मूल्य प्राप्त हो रहा है। इसलिए, जब में किसी उपयोगकर्ता के प्रवेश और यहाँ चेक किया गया है:

$qry="SELECT * FROM users WHERE userlogin = '$login' AND user_passwrd = sha1(CONCAT('$password', stamp))"; 
    $result=mysql_query($qry); 
    $row = mysql_fetch_assoc($result); 
    $num = mysql_num_rows($result); 

यह 0. मैं सोच रहा हूँ की एक मान देता है जब मैं $ संख्या गूंज अगर वहाँ सुनिश्चित करने के लिए एक तरीका है कि $ नमक अवशेष का मूल्य वही है जब इसका उपयोग $ हैश में किया जा रहा है और फिर जब यह फ़ील्ड 'स्टाम्प' को अपडेट कर रहा है। क्या कोई मेरी मदद कर सकता है या मुझे सही दिशा में इंगित कर सकता है? अग्रिम में धन्यवाद। चीयर्स

+0

जांचें कि क्या PHP ने गलत हैश या MYSQL डाला है, गलत हैश की तलाश में है। इससे समस्या स्थान को आधा में विभाजित कर दिया जाएगा। –

+0

गलत हैश डाला जा रहा है। मुझे लगता है कि पासवर्ड धोए जाने पर $ नमक के मूल्य और डेटाबेस में डालने पर $ नमक के मूल्य के बीच एक अंतर है, लेकिन मुझे सच में यकीन नहीं है। – Spud

+0

'user_passwrd' के लिए कॉलम परिभाषा क्या है? – Ben

उत्तर

0

सभी टिप्पणियों के लिए धन्यवाद। मैं रिपोर्ट करना चाहता हूं कि मैंने समस्या हल की है। मैंने देर रात पासवर्ड इनपुट क्षेत्र के नाम पर बदलाव किया था और $ _POST मूल्य बदलने के लिए उपेक्षित किया था। यह क्या हुआ, ज़ाहिर है, $ हैश के लिए $ पासवर्ड मूल्य की आपूर्ति नहीं की गई थी। हालांकि मैं इस बारे में शर्मिंदा हूं, मुझे लगता है कि मेरे पर्यवेक्षण को साझा करने के लिए यह महत्वपूर्ण है कि सभी स्थानों की जांच करना कितना महत्वपूर्ण है जहां त्रुटियां हो सकती हैं। मैं सबकुछ दोबारा जांचने में विफल रहा और समस्या की प्रकृति के बारे में गलत धारणाएं की। कोड ठीक काम करता था, यह कुंजीपटल के सामने ढीला पेंच था जो समस्याओं का कारण बनता था। चीयर्स

1

अधिक विचारों तो मैं एक जवाब में मेरी टिप्पणी ...

यह ध्यान देने योग्य है कि आप PHP के SHA1 समारोह का उपयोग करते समय भंडारण लेकिन mysql के जब पुन: प्राप्त करने के लायक है बदल दिया है। वे वही होना चाहिए लेकिन यह पहली जगह है जिसे मैं डीबग करना चाहता हूं। हैश स्टोर करने के लिए mysql के sha फ़ंक्शन का उपयोग करने का प्रयास करें या लॉगिन के आधार पर रिकॉर्ड पुनर्प्राप्त करें,

की तुलना करने के लिए PHP में नमक और हैश पढ़ें, आप टाइमस्टैम्प को कैसे संग्रहीत कर रहे हैं? क्या यह संभव है कि इसे किसी प्रकार से दिनांक स्ट्रिंग के रूप में परिवर्तित/गोलाकार/क्लिप/इलाज किया जा रहा हो? बस एक सैनिटी चेक के लिए, दोनों चरणों में sha1 फ़ंक्शन में जो स्ट्रिंग आप खिला रहे हैं उसे लें और जांचें कि वे समान हैं।

आपकी टिप्पणी के आगे, क्या आप तालिका में प्रासंगिक फ़ील्ड के लिए स्कीमा पोस्ट कर सकते हैं?

+0

user_passwrd \t varchar (60) \t नहीं/\t टिकट \t पूर्णांक (50) \t नहीं ... यह संभव $ नमक का मूल्य समय पासवर्ड मिश्रित होता है और समय यह डाक टिकट में डाला जाता है के बीच अलग है है ' खेत? – Spud

+0

यह नहीं होना चाहिए - यदि आप 'समय() 'सीधे (दो बार) कॉल कर रहे थे तो हाँ, लेकिन आप इसे एक चर में संग्रहीत कर रहे हैं जिसके बाद यह केवल एक संख्या है। Mysql 'INSERT' के बाद' $ salt' आउटपुट करने का प्रयास करें, फिर डीबी – Basic

+0

में संग्रहीत मान के साथ इसकी तुलना करें और यह अद्यतन फ़ंक्शन से पहले और बाद में समान है। अब मैं वास्तव में स्टंप हूँ। – Spud

-1

आप अपने प्रश्न गलत तरीके से कर रहे हैं। आपको स्ट्रिंग में चर को जोड़ना होगा और सिंगल कोट्स का उपयोग नहीं करना होगा। अपनी 1 कुंजी के बाईं ओर उद्धरण का प्रयोग करें। यही तरीका है कि अधिकांश MySQL प्रश्नों को पढ़ते हैं। उदाहरण:

<?php 
     //Update user table  
session_start();  
include 'sql_connect_R.inc.php';   
$id = mysql_real_escape_string($_POST['userID']);  
$password = mysql_real_escape_string($_POST['user_passwrd']);   
$salt = time();  
$hash = sha1($password . $salt);   
mysql_query("UPDATE `users` SET `user_passwrd` = '".$hash."', `stamp` = '".$salt."', `pending` = 'yes' WHERE `userID` = '".$id."'");   
mysql_close($con); 
?> 

$qry="SELECT * FROM `users` WHERE `userlogin` = '".$login."' AND `user_passwrd` = '".sha1(CONCAT($password, stamp))".'";   
$result=mysql_query($qry);   
$row = mysql_fetch_assoc($result);   
$num = mysql_num_rows($result); 

इस छोटे बदलाव में मदद करनी चाहिए। कभी-कभी डीबी थोड़ा स्पर्शपूर्ण हो सकता है। आशा है कि ये आपकी मदद करेगा।

+0

यह सच नहीं है। बैकटिक्स बिल्कुल जरूरी नहीं हैं (बिल्ली, मैं उन्हें भी इस्तेमाल करने के खिलाफ सलाह देता हूं), और जब आप डबल कोट्स का उपयोग करते हैं तो आपको संयोजित नहीं करना पड़ता है। –

+0

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

+1

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

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