रुकें!
आप यहां गलती कर रहे हैं। ओह, नहीं, आपने अपने डेटा को थोड़ा सुरक्षित बनाने के लिए सही PHP फ़ंक्शंस चुने हैं। कोई बात नहीं। आपकी गलती संचालन के क्रम में है , और इन कार्यों का उपयोग कैसे और कहां करना है।
उपयोगकर्ता डेटा को साफ करने और मान्य करने, भंडारण के लिए डेटा से बचने और प्रस्तुति के लिए डेटा से बचने के बीच अंतर को समझना महत्वपूर्ण है।
उपयोगकर्ता डेटा को Sanitizing और मान्य करना
जब उपयोगकर्ता डेटा जमा करते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता होती है कि उन्होंने कुछ ऐसा प्रदान किया है जिसकी आप अपेक्षा करते हैं।
स्वच्छता और फ़िल्टरिंग
उदाहरण के लिए, यदि आप संख्या की अपेक्षा करते हैं, तो सुनिश्चित करें कि प्रस्तुत डेटा एक संख्या है । आप उपयोगकर्ता डेटा को अन्य प्रकारों में भी डाल सकते हैं । प्रस्तुत सब कुछ शुरू में एक स्ट्रिंग की तरह व्यवहार किया जाता है, इसलिए ज्ञात-संख्यात्मक डेटा को एक पूर्णांक या फ्लोट होने के लिए मजबूर करना स्वच्छता को तेज और दर्द रहित बनाता है।
फ्री-फॉर्म टेक्स्ट फील्ड और टेक्सटारिस के बारे में क्या? आपको यह सुनिश्चित करने की आवश्यकता है कि उन क्षेत्रों में कुछ भी अप्रत्याशित नहीं है। मुख्य रूप से, आपको यह सुनिश्चित करने की आवश्यकता है कि जिन फ़ील्ड में कोई HTML सामग्री नहीं होनी चाहिए, उनमें वास्तव में HTML नहीं है। इस समस्या से निपटने के दो तरीके हैं।
सबसे पहले, आप HTML इनपुट से बचने का प्रयास कर सकते हैं htmlspecialchars
। आपको htmlentities
HTML को बेअसर करने के लिए उपयोग नहीं करना चाहिए , क्योंकि यह उच्चारण और अन्य वर्णों की एन्कोडिंग भी करेगा जो यह सोचते हैं कि इसे एन्कोड करने की भी आवश्यकता है।
दूसरा, आप किसी भी संभावित HTML को हटाने का प्रयास कर सकते हैं । strip_tags
त्वरित और आसान है, लेकिन मैला भी है। HTML शोधक सभी HTML को अलग करने और दोनों के माध्यम से टैग और विशेषताओं के चयनात्मक श्वेतसूची की अनुमति देता है।
आधुनिक PHP संस्करण फ़िल्टर एक्सटेंशन के साथ जहाज करते हैं , जो उपयोगकर्ता इनपुट को साफ करने का एक व्यापक तरीका प्रदान करता है।
मान्यकरण
यह सुनिश्चित करना कि प्रस्तुत डेटा अनपेक्षित सामग्री से मुक्त है, काम का केवल आधा हिस्सा है। आपको यह भी प्रयास करने की आवश्यकता है और सुनिश्चित करें कि सबमिट किए गए डेटा में वे मूल्य हैं जो आप वास्तव में काम कर सकते हैं।
यदि आप 1 और 10 के बीच की संख्या की उम्मीद कर रहे हैं, तो आपको उस मूल्य की जांच करने की आवश्यकता है। यदि आप स्पिनर और चरणों के साथ उन नए फैंसी एचटीएमएल 5-युग के संख्यात्मक आदानों में से एक का उपयोग कर रहे हैं, तो सुनिश्चित करें कि प्रस्तुत डेटा चरण के अनुरूप है।
यदि वह डेटा ड्रॉप-डाउन मेनू से होना चाहिए, तो सुनिश्चित करें कि सबमिट किया गया मान मेनू में दिखाई देने वाला है।
अन्य आवश्यकताओं को पूरा करने वाले पाठ इनपुट के बारे में क्या? उदाहरण के लिए, तारीख आदानों के माध्यम से सत्यापित की जानी चाहिए strtotime
या दिनांक समय वर्ग । दी गई तिथि आपके द्वारा अपेक्षित श्रेणियों के बीच होनी चाहिए। ईमेल पतों के बारे में क्या? पहले उल्लेखित फ़िल्टर एक्सटेंशन यह जांच सकता है कि एक पता अच्छी तरह से बना है, हालांकि मैं is_email लाइब्रेरी का प्रशंसक हूं ।
अन्य सभी प्रपत्र नियंत्रणों के लिए भी यही सच है । रेडियो बटन हैं? सूची के खिलाफ मान्य। चेकबॉक्स हैं? सूची के खिलाफ मान्य। फ़ाइल अपलोड है? सुनिश्चित करें कि फ़ाइल एक अपेक्षित प्रकार की है, और फ़ाइल नाम को अनफ़िल्टर्ड उपयोगकर्ता डेटा की तरह व्यवहार करें।
हर आधुनिक ब्राउज़र सही तरीके से बनाए गए डेवलपर टूल के पूर्ण सेट के साथ आता है, जो किसी को भी आपके फॉर्म में हेरफेर करने के लिए तुच्छ बनाता है। आपके कोड को यह मान लेना चाहिए कि उपयोगकर्ता ने फ़ॉर्म सामग्री पर सभी क्लाइंट-साइड प्रतिबंधों को पूरी तरह से हटा दिया है !
भंडारण के लिए डेटा से बचना
अब जब आपने सुनिश्चित कर लिया है कि आपका डेटा अपेक्षित प्रारूप में है और इसमें केवल अपेक्षित मूल्य हैं, तो आपको उस डेटा को स्टोर करने के लिए बनाए रखने के बारे में चिंता करने की आवश्यकता है।
हर एक डेटा स्टोरेज मेकेनिज़्म के पास एक विशिष्ट तरीका है जिससे यह सुनिश्चित किया जा सकता है कि डेटा ठीक से बच गया है और एनकोड हो गया है। यदि आप एसक्यूएल का निर्माण कर रहे हैं, तो प्रश्नों में डेटा पास करने का स्वीकृत तरीका प्लेसहोल्डर्स के साथ तैयार स्टेटमेंट्स के माध्यम से है ।
PHP में अधिकांश SQL डेटाबेस के साथ काम करने के बेहतर तरीकों में से एक पीडीओ एक्सटेंशन है । यह स्टेटमेंट तैयार करने के सामान्य पैटर्न का अनुसरण करता है , स्टेटमेंट के वेरिएबल्स को बाँधता है , फिर स्टेटमेंट और वेरिएबल्स को सर्वर पर भेजता है । यदि आपने पहले पीडीओ के साथ काम नहीं किया है यहाँ एक अच्छा MySQL उन्मुख ट्यूटोरियल है ।
कुछ SQL डेटाबेस में PHP में अपने स्वयं के विशेष एक्सटेंशन होते हैं, जिनमें SQL सर्वर , PostgreSQL और SQLite 3 शामिल हैं । उन एक्सटेंशनों में से प्रत्येक ने स्टेटमेंट सपोर्ट तैयार किया है जो पीडीओ की तरह ही तैयार-बाइंड-एक्ज़ीक्यूट फैशन में संचालित होता है। कभी-कभी आपको गैर-मानक सुविधाओं या व्यवहार का समर्थन करने के लिए पीडीओ के बजाय इन एक्सटेंशन का उपयोग करने की आवश्यकता हो सकती है।
MySQL के अपने PHP एक्सटेंशन भी हैं। उनमें से दो, वास्तव में। आप केवल mysqli नामक एक का उपयोग करना चाहते हैं । पुराने "mysql" एक्सटेंशन को हटा दिया गया है और आधुनिक युग में उपयोग करने के लिए सुरक्षित या समझदार नहीं है।
मैं व्यक्तिगत रूप से मिस्क्ली का प्रशंसक नहीं हूं। जिस तरह से यह तैयार किए गए बयानों पर चर बंधन करता है वह अनम्य है और उपयोग करने के लिए दर्द हो सकता है। जब संदेह हो, तो इसके बजाय पीडीओ का उपयोग करें।
यदि आप अपने डेटा को संग्रहीत करने के लिए SQL डेटाबेस का उपयोग नहीं कर रहे हैं, तो उस डेटाबेस इंटरफ़ेस के लिए दस्तावेज़ की जाँच करें जिसका उपयोग आप यह निर्धारित करने के लिए कर रहे हैं कि इसके माध्यम से डेटा को सुरक्षित रूप से कैसे पारित किया जाए।
जब संभव हो, सुनिश्चित करें कि आपका डेटाबेस आपके डेटा को एक उपयुक्त प्रारूप में संग्रहीत करता है। संख्यात्मक क्षेत्रों में संख्याओं को स्टोर करें। खजूर के खेतों में खजूर का भंडारण करें। धन को दशमलव क्षेत्र में संग्रहित करें, फ़्लोटिंग पॉइंट फ़ील्ड नहीं। अपने डेटाबेस द्वारा प्रदान किए गए प्रलेखन की समीक्षा करें कि विभिन्न डेटा प्रकारों को ठीक से कैसे संग्रहीत किया जाए।
प्रस्तुति के लिए डेटा से बचना
हर बार जब आप उपयोगकर्ताओं को डेटा दिखाते हैं, तो आपको यह सुनिश्चित करना चाहिए कि डेटा सुरक्षित रूप से बच गया है, जब तक कि आप यह नहीं जानते कि यह बच नहीं जाना चाहिए।
HTML का उत्सर्जन करते समय, आपको लगभग हमेशा किसी भी डेटा को पारित करना चाहिए जो मूल रूप से उपयोगकर्ता द्वारा आपूर्ति की गई थी htmlspecialchars
। वास्तव में, आपको ऐसा नहीं करना चाहिए जब आप जानते हैं कि उपयोगकर्ता ने एचटीएमएल प्रदान किया है, और आपको पता है कि यह पहले से ही एक श्वेतसूची का उपयोग करके इसे साफ कर दिया गया है।
कभी-कभी आपको PHP का उपयोग करके कुछ जावास्क्रिप्ट उत्पन्न करने की आवश्यकता होती है। जावास्क्रिप्ट में HTML के समान भागने के नियम नहीं हैं! PHP के माध्यम से जावास्क्रिप्ट के लिए उपयोगकर्ता-प्रदत्त मूल्यों को प्रदान करने का एक सुरक्षित तरीका है json_encode
।
और अधिक
डेटा सत्यापन के लिए कई और बारीकियां हैं।
उदाहरण के लिए, वर्ण सेट एन्कोडिंग एक बहुत बड़ा जाल हो सकता है । आपके आवेदन को " यूटीएफ -8 के माध्यम से पूरे रास्ते " में उल्लिखित प्रथाओं का पालन करना चाहिए । ऐसे काल्पनिक हमले हैं जो तब हो सकते हैं जब आप स्ट्रिंग डेटा को गलत वर्ण सेट के रूप में मानते हैं।
पहले मैंने ब्राउज़र डिबग टूल का उल्लेख किया था। इन उपकरणों का उपयोग कुकी डेटा में हेरफेर करने के लिए भी किया जा सकता है। कुकीज़ को अविश्वसनीय उपयोगकर्ता इनपुट के रूप में माना जाना चाहिए ।
डेटा सत्यापन और भागने वेब अनुप्रयोग सुरक्षा का केवल एक पहलू है। आपको अपने आप को वेब एप्लिकेशन हमले के तरीकों से अवगत कराना चाहिए ताकि आप उनके खिलाफ बचाव का निर्माण कर सकें।