PHP बग्स #21 से #30: सामान्य गलतियाँ
PHP आपको बिना किसी चेतावनी के गलतियाँ करने की अनुमति देता है। अक्सर चीजें विफल होने के बावजूद यह चलता रहता है। इससे डेटा का चुपचाप दूषित होना (silent data corruption) या सुरक्षा संबंधी खामियां (security holes) पैदा हो सकती हैं।
यहाँ बचने योग्य 10 महत्वपूर्ण बग्स दिए गए हैं:
मल्टीबाइट टेक्स्ट (Multibyte Text)
strlen()बाइट्स गिनता है, कैरेक्टर्स नहीं। इससे हिंदी या इमोजी टेक्स्ट खराब हो जाता है। इसके बजायmb_strlen()का उपयोग करें।अनवैलिडेटेड API कॉल्स (Unvalidated API Calls)
file_get_contents()चुपचाप विफल हो सकता है।json_decode()null लौटा सकता है। हमेशा जाँचें कि क्या रिस्पॉन्स false है औरjson_last_error()को सत्यापित करें।अस्थायी कुकीज़ (Temporary Cookies) बिना एक्सपायरी डेट के
setcookie()का उपयोग करने पर ब्राउज़र बंद होते ही कुकी डिलीट हो जाती है। एक्सपायरी टाइम सेट करें और XSS हमलों को रोकने के लिएhttponlyफ्लैग का उपयोग करें।असुरक्षित फ़ाइल अपलोड (Unsafe File Uploads) केवल फ़ाइल एक्सटेंशन की जाँच करना पर्याप्त नहीं है। हैकर्स
shell.phpका नाम बदलकरshell.jpgकर देते हैं। वास्तविक MIME टाइप की जाँच करने के लिएfinfo_file()का उपयोग करें।फॉर्मेटेड स्ट्रिंग्स के साथ गणित (Math with Formatted Strings) PHP कॉमा (comma) पर नंबर पढ़ना बंद कर देता है। "1,299.00" बदलकर 1 हो जाता है। गणना करने से पहले
str_replace()के साथ कॉमा हटा दें। अपने डेटाबेस में रॉ (raw) नंबर स्टोर करें।साझा स्टैटिक प्रॉपर्टीज़ (Shared Static Properties) स्टैटिक प्रॉपर्टीज़ क्लास की होती हैं, ऑब्जेक्ट की नहीं। हर इंस्टेंस (instance) एक ही डेटा साझा करता है। यूज़र-विशिष्ट डेटा के लिए नियमित public प्रॉपर्टीज़ का उपयोग करें।
बिना Exit के रीडायरेक्ट (Redirects Without Exit)
header("Location: ...")केवल ब्राउज़र को एक निर्देश भेजता है। सर्वर स्क्रिप्ट को चलाना जारी रखता है। रीडायरेक्ट के बाद हमेशाexit()कॉल करें।SQL इंजेक्शन (SQL Injection) क्वेरी स्ट्रिंग्स में सीधे वेरिएबल्स डालने से हैकर्स आपके डेटाबेस को नियंत्रित कर सकते हैं। PDO के साथ prepared statements का उपयोग करें।
मेमोरी क्रैश (Memory Crashes)
file_get_contents()पूरी फ़ाइलों को RAM में लोड करता है। बड़ी फ़ाइलों पर यह आपके सर्वर को क्रैश कर सकता है। फ़ाइलों को लाइन-दर-लाइन पढ़ने के लिएfopen()औरfgets()का उपयोग करें।साइलेंट डेटाबेस एरर्स (Silent Database Errors) PDO डिफ़ॉल्ट रूप से शांत रहता है। एरर्स एक्सेप्शन (exceptions) फेंकने के बजाय false लौटाते हैं।
PDO::ATTR_ERRMODEकोPDO::ERRMODE_EXCEPTIONपर सेट करें।
समाधान सरल है: स्पष्ट रहें। हर रिटर्न वैल्यू की जाँच करें। हर इनपुट को वैलिडेट करें। कभी भी यह मानकर न चलें कि कोई फ़ंक्शन काम कर गया है।