2011-03-10 22 views
9

मुझे लगता है कि मैं यहां अपने पत्थर खो रहा हूं ... मुझे अपनी वेबसाइट पर एक समस्या है जहां यादृच्छिक रूप से यह लॉग इन स्वीकार करना बंद कर देता है। अब मैं क्रिप्ट() बहुत अजीब व्यवहार करने के लिए इसका पता लगाने में सक्षम हूं।PHP क्रिप्ट() गलत जवाब लौटा रहा है

मेरे डेटाबेस में, मुझे उपयोगकर्ता पासवर्ड का क्रिप्ट संस्करण मिला है - तो मान लें Og12345678।

जब उपयोगकर्ता लॉग इन करता है, तो वे अपना पासवर्ड दर्ज करते हैं, मैं डीबी से नमक पढ़ता हूं और फिर क्रिप्ट करता हूं कि उन्होंने क्या दर्ज किया और तुलना की - आमतौर पर यह बहुत अच्छी तरह से काम करता है।

तो मैं क्रिप्ट कर रहा हूं ($ enterPassword, $ saltFromDb) - इस मामले में, नमक निश्चित रूप से ओग होगा। आम तौर पर दिए गए उपयोगकर्ताओं के लिए पासवर्ड क्रिप्ट ठीक काम करता है।

जब चीजें गलत होती हैं (और जब वे अपाचे को पुनरारंभ करते हैं तो यह स्थायी परिवर्तन होता है) मैंने पाया कि क्रिप्ट उसी नमक के साथ एक ही इनपुट के लिए एक अलग उत्तर लौटाना शुरू कर देता है।

हालांकि यह लगातार है, यानी सिस्टम गलत गलती हो जाने पर गलत जवाब देता है लेकिन यह हमेशा समान गलत उत्तर लौटा रहा है। पृष्ठ के दोहराए गए रीफ्रेश एक ही आउटपुट दिखाते हैं। नए नमक क्रिप्ट परिणाम में भी वही नमक साक्ष्य में है, इसलिए ऐसा नहीं है कि नमक कहीं गायब हो गया है।

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

मुझे सराहना है कि यह नवीनतम PHP (5.2.8) नहीं है, लेकिन इस पर किसी भी विचार का मूल्य होगा, भले ही यह बाद के संस्करण में एक ज्ञात बग है (PHP को अपग्रेड करना बहुत सी साइटों के साथ एक खुश काम नहीं है, जिनमें से कुछ अभी भी दुर्भाग्यपूर्ण क्विर्क का उपयोग करें कि सभी को प्रत्येक अपग्रेड के साथ फिर से परीक्षण करने की आवश्यकता है) - यदि यह एक ज्ञात निश्चित बग है तो जाहिर है कि मैं इसे सभी अपग्रेड किए गए ASAP प्राप्त कर दूंगा, इससे परे कि मैं केवल क्रिप्ट को बाहरी रूप से आउटसोर्स करना आसान कर दूंगा क्योंकि मैं केवल इसे मेरी साइट के लिए एक आम जगह में उपयोग करें।

किसी भी इनपुट की सराहना की।

मैट Peddlesden

--- अद्यतन: 11 मार्च 2011

सुधार पहले से ऑपरेटिंग सिस्टम ... के बारे में दिए गए टिप्पणी करने के लिए - ऑपरेटिंग सिस्टम विंडोज सर्वर 2008 SP1 के 64 बिट है। माफी मांगने के बजाय मुझे दोबारा जांच करनी चाहिए! मशीन एक डेल 2 9 50 8 जीबी राम, ज़ीऑन प्रोसेसर है।

मैं क्रेटिक सुझाव दे रहा हूं कि जब मैं नया क्रिप्ट() उत्पन्न करता हूं, (यानी एक बहुत ही सरल उदाहरण जहां मैं एक चर को एक चर सेट करता हूं, इसे क्रिप्ट करता हूं और फिर तुलना करता हूं क्रिप्ट के साथ) - सभी महान काम करता है। जब मैं सर्वर को पुनरारंभ करता हूं, तो यह फिर से पिछली गणनाओं पर वापस आ जाता है। तो मैं निश्चित रूप से क्रिप्ट() परिणाम की गणना करने के लिए उपयोग किए गए एल्गोरिदम को बदलने की ओर झुका रहा हूं ... इस बारे में कोई विचार क्या हो सकता है? मैंने CRYPT_STD_DES आदि के मानों को मुद्रित किया है और वे पुनरारंभ के बीच नहीं बदलते हैं।

किसी को भी इस बात का कोई संकेत मिलता है कि ऐसा होने के कारण क्या हो सकता है?

जो कुछ भी कल एक दिन में दो बार हुआ था, सबसे अजीब।

इस प्रकार के उत्तरों के लिए धन्यवाद।

--- अद्यतन: 16 मार्च 2011

बस एक और अद्यतन प्रदान करना चाहता था।

यह अभी भी हो रहा है, फिर भी क्यों और समझ नहीं है।

यदि भविष्य में कोई भी इस पर आता है, तो मुझे लगता है कि मेरा समाधान आगे बढ़ रहा है, सभी क्रिप्ट() निष्पादन को बाहरी सी # अनुप्रयोग में धक्का देने और PHP पर भरोसा करने से रोकने के लिए कुछ बुरा हैक करना होगा उन्हें करने के लिए। कुछ कहीं गलत हो रहा है और इस बिंदु पर एकमात्र समाधान जिसे मैं देख सकता हूं उसे समीकरण से पूरी तरह से हटा देना है।

बेशक अगर यह अभी भी होता है, तो यह भी जानना दिलचस्प होगा! :)

धन्यवाद सब कुछ।

+1

मुझे लगता है कि यह है कि संभावना नहीं है आपकी समस्या है, लेकिन मैं देखता हूं कि PHP दस्तावेज़ में सलाह - http://php.net/manual/en/function.crypt।php - यह है कि आपको नमक के रूप में पूरे (नमकीन) क्रिप्ट किए गए पासवर्ड को पास करना चाहिए। 'अगर (क्रिप्ट ($ दर्ज किया गया पासवर्ड, $ cryptedPasswordFromDB) == $ cryptedPasswordFromDB) {...}'। बिंदु यह प्रतीत होता है कि फिर क्रिप्ट() निर्धारित कर सकता है कि $ cryptedPasswordFromDB से क्या हैशिंग एल्गोरिदम उपयोग में है। दोबारा, मुझे संदेह है कि यह आपकी समस्या का कारण है, लेकिन आप इसे जाने दे सकते हैं ... –

+1

क्या किसी स्क्रिप्ट से कुछ php कॉन्फ़िगरेशन बदलना संभव है जिसके परिणामस्वरूप क्रिप्ट द्वारा उपयोग किए जाने वाले एक अलग हैश फ़ंक्शन में परिवर्तन होता है? जैसा कि @Gareth ने डीबी से पूरा पासवर्ड पास किया है, इस समस्या को हल कर सकते हैं। – krtek

+0

मैं क्रेटिक के सुझावों के साथ सोचने लगा हूं - जब सिस्टम नया क्रिप्ट() (यानी एक बहुत ही सरल उदाहरण है जहां मैं एक चर को एक चर सेट करता हूं, इसे क्रिप्ट करता हूं और फिर क्रिप्ट से तुलना करता हूं) - सभी महान काम करता है। जब मैं सर्वर को पुनरारंभ करता हूं, तो फिर से यह फिर से काम करने के लिए वापस आ जाता है। तो मैं निश्चित रूप से कुछ ऐसी चीज की ओर झुका रहा हूं जो क्रिप्ट() परिणाम की गणना करने के लिए उपयोग किए गए एल्गोरिदम को बदल रहा है ... इस पर कोई विचार क्या हो सकता है? मैंने CRYPT_STD_DES आदि के मानों को मुद्रित किया है और वे पुनरारंभ के बीच नहीं बदलते हैं। –

उत्तर

1

यह आपके क्रिप्ट() फ़ंक्शन को प्रभावित करने वाले सुहोसिन PHP सुरक्षा पैच हो सकता है। यह बहुत सी एन्क्रिप्शन/यादृच्छिक तरीकों को बदलता है और आपकी समस्या का कारण हो सकता है।

एक phpinfo() देखें और देखें कि पृष्ठ पर 'सुहोसिन' कहीं भी है या नहीं। यदि यह वहां है, तो php config में इसकी कुछ विशेषताओं को अक्षम करने में देखें।

+0

आपकी टिप्पणियों के लिए धन्यवाद, मैंने phpinfo() की जांच की है और इसमें कोई भी सुहोसिन बिट्स नहीं है, इसलिए मुझे लगता है कि यह लागू नहीं होता है। –

2

आप नमक क्यों पढ़ रहे हैं? और आप नमक कैसे प्राप्त कर रहे हैं? विभिन्न एल्गोरिदम आउटपुट में नमक को शामिल करने के लिए विभिन्न विधियों का उपयोग करते हैं।

$crypted='Og12345678'; 
    if (crypt($_POST['password'], $crypted)==$crypted) { 
     .... 

और एकल पास डेस:

बस दूसरा तर्क के रूप में तहखाने समारोह के पूरे उत्पादन का उपयोग करें? वास्तव में?

पिछली बार मैंने देखा, PHP क्रिप्ट कार्यान्वयन सिस्टम द्वारा प्रदान किए गए क्रिप्ट() फ़ंक्शन को कॉल करेगा - इसलिए यदि यह ब्रोकन है तो PHP से आपकी ओएस होने की अधिक संभावना है - लेकिन आपने यह नहीं कहा कि आपका ओएस क्या है है।

+0

ओएस विंडोज सर्वर 2008 एसपी 2 है। आपकी टिप्पणियों के लिए आभार। –

+0

केवल मुझे सिंगल लाइन टिप्पणी जोड़ने दो :) - मैंने क्रिप्ट() कमांड में पूर्ण पासवर्ड का उपयोग करने के लिए कोड को एडजस्ट किया है और यह एक पल पहले सिस्टम गलत होने पर मदद नहीं करता था। –

+0

हां, एकल पास डीईएस, सिस्टम बहुत समय पहले लिखा गया था और ईमानदार होने के लिए यह कुछ भी सुरक्षित रूप से सुरक्षित नहीं है, यह सिर्फ लोगों को साइट से फ़ाइलों को डाउनलोड करने देता है। पूरी साइट किसी बिंदु पर एक नई तकनीक में पुन: विकसित होने के लिए तैयार है। लेकिन हाँ, बिंदु ले लिया :) –

0

मुझे एक ही समस्या का सामना करना पड़ा। चूंकि मेरी vTigerCRM स्थापना को स्थानीय मशीन पर ले जाने के बाद, पहले से संग्रहीत पासवर्ड के साथ उपयोगकर्ता लॉगिन विफल होना शुरू हो गया। यह तहखाने की तरह लगता है() एक ही तर्क के साथ विभिन्न वातावरण पर विभिन्न हैश लौटा रहा है:

SYSTEM: Windows NT 6.1 build 7601 (Business Edition Service Pack 1) i586 
PHP: 5.3.5 

crypt('hello world','$1$ad0000000'): 

    $1$ad00000008tTFeywywdEQrAl9QzV.M1 

उत्पादन वातावरण में::

स्थानीय पर्यावरण पर

SYSTEM: Linux 2.6.18-338.9.1.el5.lve0.8.32 #1 x86_64 
PHP: 5.3.5 

crypt('hello world','$1$ad0000000'): 

    $1$ad000000$8tTFeywywdEQrAl9QzV.M1 
+0

मुझे लगता है कि यह एक क्रिप्ट() मुद्दा नहीं है, यह जूट विंडोज है: पी क्या होता है यदि आप अन्य गैर-विंडोज़ ओएस जैसे रेडहाट, सोलारिस, डेबियन में समान पैरामीटर का उपयोग करते हैं तो क्या होता है? – Juan

1

मैं के साथ एक ही समस्या थी क्रिप्ट ... मेरे पास 2 सर्वर पर काम करने वाला लॉगिन-चेक था, लेकिन जब मैं इसे नवीनतम में स्थानांतरित करता हूं तो अंततः यह काम करना बंद कर देता है। मैं md5 एन्क्रिप्शन के साथ यह आसपास चलने के इस प्रकार है: register.php

$encrypted = md5($_POST["pass"]); 
... 

में और फिर login.php में

$password = md5($_POST["password"]); 
if ($password == $row["hash"]) 
     { 
      // remember that user's now logged in by storing user's details in session 
      $_SESSION["id"] = $row["id"]; 
      $_SESSION['username'] = $_POST['username']; 
      $_SESSION['logged'] = 'Yes'; 
      // redirect to homepage 
      redirect("index.php"); 
     } 

मुझे आशा है कि मदद करता है :)

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