सबसे अच्छा PHP इनपुट sanitizing कार्यों क्या हैं?




filter sanitization (8)

एसक्यूएल इंजेक्शन को रोकने के लिए सबसे प्रभावी स्वच्छता PDO का उपयोग कर पैरामीटरकरण है। पैरामीटरयुक्त क्वेरी का उपयोग करके, क्वेरी डेटा से अलग होती है, जिससे कि पहले क्रम के एसक्यूएल इंजेक्शन के खतरे को हटा दिया जाता है।

एचटीएमएल को हटाने के मामले में, strip_tags शायद HTML को हटाने के लिए सबसे अच्छा विचार है, क्योंकि यह सब कुछ हटा देगा। htmlentities जो यह लगता है करता है, तो यह भी काम करता है। यदि आपको अनुमति देने के लिए कौन सी HTML को पार्स करने की आवश्यकता है (यानी, आप कुछ टैग्स को अनुमति देना चाहते हैं), तो आपको एक परिपक्व मौजूदा पार्सर का उपयोग करना चाहिए जैसे HTML शोधक

मैं PHP / प्रोग्रामिंग के लिए बहुत नया हूं, इस बात को ध्यान में रखते हुए मैं एक समारोह के साथ आने की कोशिश कर रहा हूं कि मैं अपने सभी तारों को sanatize के माध्यम से पारित कर सकता हूं। ताकि उस स्ट्रिंग जो इससे बाहर आती है, डेटाबेस प्रविष्टि के लिए सुरक्षित होगी। लेकिन वहां बहुत सारे फ़िल्टरिंग फ़ंक्शंस हैं, मुझे यकीन नहीं है कि मुझे किसके लिए उपयोग / आवश्यकता होनी चाहिए। कृपया मुझे रिक्त स्थान भरने में मदद करें:

function filterThis($string) {
    $string = mysql_real_escape_string($string);
    $string = htmlentities($string);
    etc...
    return $string;
}


यह आपके द्वारा उपयोग किए जा रहे डेटा के प्रकार पर निर्भर करता है। उपयोग करने के लिए सबसे अच्छा सबसे अच्छा mysqli_real_escape_string होगा, उदाहरण के लिए, आप जानते हैं कि HTML सामग्री नहीं होगी, स्ट्रिप_टैग का उपयोग करके अतिरिक्त सुरक्षा जोड़ दी जाएगी।

आप उन पात्रों को भी हटा सकते हैं जिन्हें आप जानते हैं उन्हें अनुमति नहीं दी जानी चाहिए।


डेटाबेस सम्मिलन के लिए, आपको केवल mysql_real_escape_string (या पैरामीटरयुक्त क्वेरी का उपयोग करें) की आवश्यकता है। आप आम तौर पर इसे सहेजने से पहले डेटा को बदलना नहीं चाहते हैं, अगर आप htmlentities इस्तेमाल करते हैं तो क्या होगा। इससे बाद में जब आप इसे वेबपृष्ठ पर कहीं भी प्रदर्शित करने के लिए htmlentities माध्यम से चलाते हैं तो उस पर एक गड़बड़ी की गड़बड़ी होती है।

जब आप किसी वेबपृष्ठ पर डेटा प्रदर्शित कर रहे हों तो htmlentities उपयोग करें।

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

$input = preg_replace('/\s+/', ' ', $input);

यदि आप ऐसा नहीं करते हैं तो स्पैम बॉट्स आपके फॉर्म को ढूंढने और इसका दुरुपयोग करने से पहले ही समय की बात है, मैंने कड़ी मेहनत सीखी है।


रुकें!

आप यहाँ एक गलती कर रहे हैं। ओह, नहीं, आपने अपने डेटा को थोड़ा सुरक्षित बनाने के लिए सही PHP फ़ंक्शंस चुने हैं। कोई बात नहीं। आपकी गलती संचालन के क्रम में है , और इन कार्यों का उपयोग कैसे करें और कहां करें।

उपयोगकर्ता डेटा को स्वच्छ करने और मान्य करने, संग्रहण के लिए डेटा से बचने और प्रस्तुति के लिए डेटा से बचने के बीच अंतर को समझना महत्वपूर्ण है।

उपयोगकर्ता डेटा को स्वच्छ बनाना और मान्य करना

जब उपयोगकर्ता डेटा जमा करते हैं, तो आपको यह सुनिश्चित करना होगा कि उन्होंने आपके द्वारा अपेक्षित कुछ प्रदान की है।

स्वच्छता और फ़िल्टरिंग

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

फ्री फॉर्म टेक्स्ट फ़ील्ड और टेक्स्टरेज़ के बारे में क्या? आपको यह सुनिश्चित करने की ज़रूरत है कि उन क्षेत्रों में अप्रत्याशित कुछ भी नहीं है। मुख्य रूप से, आपको यह सुनिश्चित करने की ज़रूरत है कि जिन क्षेत्रों में कोई HTML सामग्री नहीं होनी चाहिए उनमें वास्तव में HTML नहीं है। इस समस्या से निपटने के दो तरीके हैं।

सबसे पहले, आप htmlspecialchars साथ HTML इनपुट से बचने का प्रयास कर सकते हैं। आपको एचटीएमएल को बेअसर करने के लिए एचटीएमएलटीटी का उपयोग नहीं करना चाहिए, क्योंकि यह एन्कोडेड और अन्य पात्रों के एन्कोडिंग भी करेगा जो इसे लगता है कि एन्कोड किए जाने की भी आवश्यकता है।

दूसरा, आप किसी भी संभावित HTML को हटाने का प्रयास कर सकते हैं। strip_tags त्वरित और आसान है, लेकिन मैला भी है। एचटीएमएल प्यूरिफायर सभी एचटीएमएल को अलग करने और टैग और विशेषताओं के चयनकर्ता श्वेतसूची की अनुमति देने का एक और अधिक गहन काम करता है।

आधुनिक PHP संस्करण फ़िल्टर एक्सटेंशन के साथ शिप करते हैं, जो उपयोगकर्ता इनपुट को स्वच्छ करने के लिए एक व्यापक तरीका प्रदान करता है।

मान्यकरण

यह सुनिश्चित करना कि अप्रत्याशित सामग्री से सबमिट किया गया डेटा केवल नौकरी का आधा है। आपको यह भी सुनिश्चित करने की ज़रूरत है कि सबमिट किए गए डेटा में वे मान हैं जिनके साथ आप वास्तव में काम कर सकते हैं।

यदि आप 1 और 10 के बीच की संख्या की अपेक्षा कर रहे हैं, तो आपको उस मान को जांचना होगा। यदि आप स्पिनर और चरणों के साथ उन नए फैंसी HTML5-युग संख्यात्मक इनपुटों में से एक का उपयोग कर रहे हैं, तो सुनिश्चित करें कि सबमिट किया गया डेटा चरण के अनुरूप है।

यदि वह डेटा ड्रॉप-डाउन मेनू होना चाहिए, तो सुनिश्चित करें कि सबमिट किया गया मान मेनू में दिखाई देने वाला एक है।

टेक्स्ट इनपुट के बारे में क्या है जो अन्य जरूरतों को पूरा करता है? उदाहरण के लिए, डेट इनपुट strtotime या डेटटाइम क्लास के माध्यम से सत्यापित किया जाना चाहिए। दी गई तिथि आपके द्वारा अपेक्षित श्रेणियों के बीच होनी चाहिए। ईमेल पते के बारे में क्या? पहले उल्लिखित फ़िल्टर एक्सटेंशन यह जांच सकता है कि एक पता अच्छी तरह से गठित है, हालांकि मैं is_email लाइब्रेरी का प्रशंसक हूं।

अन्य सभी फॉर्म नियंत्रणों के लिए भी यही सच है। रेडियो बटन है? सूची के खिलाफ मान्य करें। चेकबॉक्स है? सूची के खिलाफ मान्य करें। एक फाइल अपलोड है? सुनिश्चित करें कि फ़ाइल एक अपेक्षित प्रकार का है, और फ़ाइल नाम को unfiltered उपयोगकर्ता डेटा की तरह व्यवहार करें।

प्रत्येक आधुनिक ब्राउज़र में डेवलपर टूल के एक पूर्ण सेट के साथ आता है, जो किसी के लिए आपके फॉर्म में हेरफेर करने के लिए तुच्छ बनाता है। आपके कोड को यह मानना ​​चाहिए कि उपयोगकर्ता ने फ़ॉर्म सामग्री पर सभी क्लाइंट-साइड प्रतिबंधों को पूरी तरह से हटा दिया है !

भंडारण के लिए डेटा से बचने

अब जब आप सुनिश्चित कर चुके हैं कि आपका डेटा अपेक्षित प्रारूप में है और इसमें केवल अपेक्षित मान हैं, तो आपको उस डेटा को स्टोरेज में रखने के बारे में चिंता करने की आवश्यकता है।

प्रत्येक डेटा स्टोरेज तंत्र के पास यह सुनिश्चित करने का एक विशिष्ट तरीका है कि डेटा ठीक से बच निकला और एन्कोड किया गया हो। यदि आप एसक्यूएल बना रहे हैं, तो प्रश्नों में डेटा पास करने का स्वीकार्य तरीका प्लेसहोल्डर के साथ तैयार बयानों के माध्यम से है।

PHP में अधिकांश SQL डेटाबेस के साथ काम करने के बेहतर तरीकों में से एक पीडीओ एक्सटेंशन है । यह कथन तैयार करने , कथन में बाध्यकारी चर , और सर्वर पर कथन और चर भेजने के सामान्य पैटर्न का पालन करता है । यदि आपने यहां एक बहुत अच्छा MySQL- उन्मुख ट्यूटोरियल है, तो आपने पीडीओ के साथ काम नहीं किया है।

SQL सर्वर , PostgreSQL और SQLite 3 सहित कुछ SQL डेटाबेस में PHP में अपना विशेष एक्सटेंशन होता है। उन एक्सटेंशन में से प्रत्येक ने कथन समर्थन तैयार किया है जो पीडीओ के रूप में एक ही तैयारी-बाध्य-निष्पादन फैशन में काम करता है। कभी-कभी आपको गैर मानक सुविधाओं या व्यवहार का समर्थन करने के लिए पीडीओ के बजाय इन एक्सटेंशन का उपयोग करने की आवश्यकता हो सकती है।

MySQL के पास अपने स्वयं के PHP एक्सटेंशन भी हैं। वास्तव में उनमें से दो। आप केवल mysqli नामक एक का उपयोग करना चाहते हैं। पुराना "mysql" एक्सटेंशन deprecated कर दिया गया है और आधुनिक युग में उपयोग करने के लिए सुरक्षित या सुरक्षित नहीं है।

मैं व्यक्तिगत रूप से mysqli का प्रशंसक नहीं हूँ। जिस तरह से यह तैयार बयानों पर परिवर्तनीय बाध्यकारी करता है वह अनावश्यक है और इसका उपयोग करने के लिए दर्द हो सकता है। संदेह में, इसके बजाय पीडीओ का उपयोग करें।

यदि आप अपने डेटा को स्टोर करने के लिए SQL डेटाबेस का उपयोग नहीं कर रहे हैं, तो डेटाबेस इंटरफ़ेस के लिए प्रलेखन जांचें जिसका उपयोग आप सुरक्षित रूप से डेटा को सुरक्षित रूप से पास करने के तरीके के लिए कर रहे हैं।

जब संभव हो, सुनिश्चित करें कि आपका डेटाबेस आपके डेटा को उचित प्रारूप में संग्रहीत करता है। संख्यात्मक क्षेत्रों में स्टोर नंबर। तारीख फ़ील्ड में स्टोर तिथियां। एक दशमलव क्षेत्र में पैसा स्टोर करें, न कि एक फ़्लोटिंग पॉइंट फ़ील्ड। अलग-अलग डेटा प्रकारों को सही तरीके से स्टोर करने के तरीके पर अपने डेटाबेस द्वारा प्रदान किए गए दस्तावेज़ों की समीक्षा करें।

प्रस्तुति के लिए डेटा से बचने

हर बार जब आप उपयोगकर्ताओं को डेटा दिखाते हैं, तो आपको यह सुनिश्चित करना होगा कि डेटा सुरक्षित रूप से बच निकला है, जब तक कि आप नहीं जानते कि इसे बचाना नहीं चाहिए।

एचटीएमएल उत्सर्जित करते समय, आपको लगभग हमेशा किसी भी डेटा को पास करना चाहिए जो मूल रूप से htmlspecialchars माध्यम से उपयोगकर्ता द्वारा आपूर्ति की गई थी। असल में, आपको ऐसा करने का एकमात्र समय यह नहीं है जब आप जानते हैं कि उपयोगकर्ता ने HTML प्रदान किया है, और आप जानते हैं कि इसे श्वेतसूची का उपयोग करके इसे पहले से ही स्वच्छ कर दिया गया है।

कभी-कभी आपको PHP का उपयोग करके कुछ जावास्क्रिप्ट उत्पन्न करने की आवश्यकता होती है। जावास्क्रिप्ट में एचटीएमएल के समान ही बचने वाले नियम नहीं हैं! PHP के माध्यम से जावास्क्रिप्ट को उपयोगकर्ता द्वारा प्रदत्त मान प्रदान करने का एक सुरक्षित तरीका json_encode माध्यम से है।

और अधिक

डेटा सत्यापन के लिए कई और बारीकियां हैं।

उदाहरण के लिए, चरित्र सेट एन्कोडिंग एक बड़ा जाल हो सकता है । आपके आवेदन को " यूटीएफ -8 में सभी तरह से उल्लिखित प्रथाओं का पालन करना चाहिए"। ऐसे परिकल्पनात्मक हमले होते हैं जो तब हो सकते हैं जब आप गलत डेटा सेट के रूप में स्ट्रिंग डेटा का इलाज करते हैं।

इससे पहले मैंने ब्राउजर डीबग टूल्स का उल्लेख किया था। इन उपकरणों का उपयोग कुकी डेटा में हेरफेर करने के लिए भी किया जा सकता है। कुकीज़ को अविश्वसनीय उपयोगकर्ता इनपुट के रूप में माना जाना चाहिए

डेटा सत्यापन और बचाना वेब एप्लिकेशन सुरक्षा का केवल एक पहलू है। आपको स्वयं को वेब एप्लिकेशन आक्रमण पद्धतियों के बारे में अवगत कराया जाना चाहिए ताकि आप उनके खिलाफ सुरक्षा बना सकें।


आप निम्न में समान कोड में mysql_real_escape_string() उपयोग करते हैं।

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  mysql_real_escape_string($user),
  mysql_real_escape_string($password)
);

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

यदि बाइनरी डेटा डाला जाना है, तो इस फ़ंक्शन का उपयोग किया जाना चाहिए।

HTML सामग्री में स्ट्रिंग आउटपुट करते समय htmlentities() का उपयोग कुछ अक्षरों को इकाइयों में परिवर्तित करने के लिए किया जाता है।


मैं हमेशा एक छोटे सत्यापन पैकेज का उपयोग करने की सलाह देता हूं जैसे कि GUMP: https://github.com/Wixel/GUMP

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


मेरे 5 सेंट

यहां कोई भी mysql_real_escape_string काम करता है जिस तरह से समझता है। यह फ़ंक्शन कुछ भी फ़िल्टर या "sanitize" नहीं करता है।
तो, आप इस फ़ंक्शन का उपयोग कुछ सार्वभौमिक फ़िल्टर के रूप में नहीं कर सकते जो आपको इंजेक्शन से बचाएगा।
आप इसे तब ही उपयोग कर सकते हैं जब आप समझते हैं कि कैसे काम करता है और यह कहां लागू होता है।

मेरे पास पहले से ही लिखे गए एक ही प्रश्न का उत्तर है: PHP में डेटाबेस में स्ट्रिंग सबमिट करते समय मुझे HTMLspecialchars () का उपयोग करके अवैध वर्णों का ख्याल रखना चाहिए या नियमित अभिव्यक्ति का उपयोग करना चाहिए?
डेटाबेस साइड सुरक्षा के लिए पूर्ण स्पष्टीकरण के लिए कृपया क्लिक करें।

HTML के लिए - चार्ल्स सही है कि आप इन कार्यों को अलग करने के लिए कह रहे हैं।
बस कल्पना करें कि आप व्यवस्थापक द्वारा जेनरेट किए गए डेटा को सम्मिलित करने जा रहे हैं, जिसे HTML पोस्ट करने की अनुमति है। आपका काम खराब कर देगा।

हालांकि मैं htmlentities के खिलाफ सलाह देंगे। यह कार्य लंबे समय से अप्रचलित हो गया है। यदि आप केवल < , > , और " HTML सुरक्षा के लिए वर्णों को प्रतिस्थापित करना चाहते हैं - उस उद्देश्य के लिए जानबूझकर विकसित किए गए फ़ंक्शन का उपयोग करें - एक htmlspecialchars () एक।







sanitization