मुझे लगता है कि मैं यहां अपने पत्थर खो रहा हूं ... मुझे अपनी वेबसाइट पर एक समस्या है जहां यादृच्छिक रूप से यह लॉग इन स्वीकार करना बंद कर देता है। अब मैं क्रिप्ट() बहुत अजीब व्यवहार करने के लिए इसका पता लगाने में सक्षम हूं।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 पर भरोसा करने से रोकने के लिए कुछ बुरा हैक करना होगा उन्हें करने के लिए। कुछ कहीं गलत हो रहा है और इस बिंदु पर एकमात्र समाधान जिसे मैं देख सकता हूं उसे समीकरण से पूरी तरह से हटा देना है।
बेशक अगर यह अभी भी होता है, तो यह भी जानना दिलचस्प होगा! :)
धन्यवाद सब कुछ।
मुझे लगता है कि यह है कि संभावना नहीं है आपकी समस्या है, लेकिन मैं देखता हूं कि PHP दस्तावेज़ में सलाह - http://php.net/manual/en/function.crypt।php - यह है कि आपको नमक के रूप में पूरे (नमकीन) क्रिप्ट किए गए पासवर्ड को पास करना चाहिए। 'अगर (क्रिप्ट ($ दर्ज किया गया पासवर्ड, $ cryptedPasswordFromDB) == $ cryptedPasswordFromDB) {...}'। बिंदु यह प्रतीत होता है कि फिर क्रिप्ट() निर्धारित कर सकता है कि $ cryptedPasswordFromDB से क्या हैशिंग एल्गोरिदम उपयोग में है। दोबारा, मुझे संदेह है कि यह आपकी समस्या का कारण है, लेकिन आप इसे जाने दे सकते हैं ... –
क्या किसी स्क्रिप्ट से कुछ php कॉन्फ़िगरेशन बदलना संभव है जिसके परिणामस्वरूप क्रिप्ट द्वारा उपयोग किए जाने वाले एक अलग हैश फ़ंक्शन में परिवर्तन होता है? जैसा कि @Gareth ने डीबी से पूरा पासवर्ड पास किया है, इस समस्या को हल कर सकते हैं। – krtek
मैं क्रेटिक के सुझावों के साथ सोचने लगा हूं - जब सिस्टम नया क्रिप्ट() (यानी एक बहुत ही सरल उदाहरण है जहां मैं एक चर को एक चर सेट करता हूं, इसे क्रिप्ट करता हूं और फिर क्रिप्ट से तुलना करता हूं) - सभी महान काम करता है। जब मैं सर्वर को पुनरारंभ करता हूं, तो फिर से यह फिर से काम करने के लिए वापस आ जाता है। तो मैं निश्चित रूप से कुछ ऐसी चीज की ओर झुका रहा हूं जो क्रिप्ट() परिणाम की गणना करने के लिए उपयोग किए गए एल्गोरिदम को बदल रहा है ... इस पर कोई विचार क्या हो सकता है? मैंने CRYPT_STD_DES आदि के मानों को मुद्रित किया है और वे पुनरारंभ के बीच नहीं बदलते हैं। –