सबसे अच्छा PHP इनपुट सैनिटाइजिंग फ़ंक्शन क्या हैं?


161

मैं एक ऐसे फंक्शन के साथ आने की कोशिश कर रहा हूं, जिसमें मैं अपनी सारी स्ट्रेंथ को सैनिटाइज कर पाऊं। ताकि इससे निकलने वाली स्ट्रिंग डेटाबेस प्रविष्टि के लिए सुरक्षित हो। लेकिन वहाँ बहुत सारे फ़िल्टरिंग कार्य हैं, मुझे यकीन नहीं है कि मुझे किन लोगों का उपयोग करना चाहिए / आवश्यकता है।

कृपया मुझे रिक्त स्थान भरने में मदद करें:

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

4
सम्मिलन के लिए, mysql_real_escape_string का उपयोग करके SQL इंजेक्शन के खिलाफ सिर्फ स्वच्छता करना ठीक है। जब आप चयनित डेटा (HTML आउटपुट में या php सूत्र / फ़ंक्शन में) का उपयोग कर रहे हों, तो आपको htmlentities को लागू करना चाहिए
davidosomething

देखें stackoverflow.com/questions/60174/... डेटाबेस प्रविष्टि के लिए सफाई का उत्तर विशिष्ट के लिए (यह पीडीओ, जो दूसरों के नीचे उल्लेख किया है का एक उदाहरण देता है)।
पैट

जवाबों:


433

रुकें!

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

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

उपयोगकर्ता डेटा को Sanitizing और मान्य करना

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

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

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

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

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

दूसरा, आप किसी भी संभावित 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 के माध्यम से पूरे रास्ते " में उल्लिखित प्रथाओं का पालन करना चाहिए । ऐसे काल्पनिक हमले हैं जो तब हो सकते हैं जब आप स्ट्रिंग डेटा को गलत वर्ण सेट के रूप में मानते हैं।

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

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


और इसे निर्दिष्ट करते समय, सुनिश्चित करें कि यह समर्थित एन्कोडिंग की सूची में है।
चार्ल्स

3
और htmlentities का उपयोग बिल्कुल न करें, इसे प्रतिस्थापित करने के उद्देश्य से htmlspecialchars के साथ बदलें <>, यह इकाई के लिए हर वर्ण नहीं
आपका कॉमन सेंस

6
बस htmlspecialcharsदो बार कॉल नहीं करना सुनिश्चित करें , क्योंकि वह "जब उपयोगकर्ता डेटा भाग सबमिट करते हैं" और "डेटा प्रदर्शित करते समय" भाग में बोलते हैं।
सेवजमैन

2
Upvoted। एसक्यूएल इंजेक्शन के बारे में मैंने कई प्रश्नोत्तरों को पढ़ा है।
एकिनुरी

भविष्य के उपयोगकर्ताओं के लिए और अधिक विकल्पों का पता लगाने के लिए कई स्पष्टीकरण और लिंक के साथ एक गुणवत्ता उत्तर। मुझे भी एक-एक मिल गया ...
जेम्स वॉकर

32

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

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


2
अरे यार, मैंने पाठ की उस विशाल दीवार को सिर्फ इसलिए लिखा क्योंकि मैंने किसी को HTML शोधक का उल्लेख नहीं करते देखा था, और यहाँ तुमने मुझे 40 मिनट तक हराया। ;)
चार्ल्स

3
क्या आपको आउटपुट पर केवल HTML पट्टी नहीं करनी चाहिए? IMO आपको इनपुट डेटा कभी नहीं बदलना चाहिए - आपको कभी नहीं पता होगा कि आपको कब इसकी आवश्यकता होगी
जो फिलिप्स

11

डेटाबेस इनपुट - SQL इंजेक्शन को कैसे रोकें

  1. उदाहरण के लिए, पूर्णांक प्रकार के डेटा को सुनिश्चित करने के लिए जाँच करें, यह वास्तव में पूर्णांक है यह सुनिश्चित करके मान्य है
    • गैर-स्ट्रिंग के मामले में आपको यह सुनिश्चित करने की आवश्यकता है कि डेटा वास्तव में सही प्रकार है
    • स्ट्रिंग के मामले में आपको यह सुनिश्चित करने की आवश्यकता है कि स्ट्रिंग को क्वेरी में उद्धरण से घिरा हुआ है (जाहिर है, अन्यथा यह भी काम नहीं करेगा)
  2. SQL इंजेक्शन से बचने के लिए डेटाबेस में मान दर्ज करें (mysql_real_escape_string या पैरामीटर किए गए प्रश्न)
  3. जब डेटाबेस से मान को पुनः प्राप्त करना सुनिश्चित करें कि एचटीएमएल को पेज (htmlspecialchars) में इंजेक्ट नहीं किया जा सकता है, तो क्रॉस साइट स्क्रिप्टिंग हमलों से बचने के लिए सुनिश्चित करें।

डेटाबेस में डालने या अपडेट करने से पहले आपको उपयोगकर्ता इनपुट से बचना होगा। यहाँ यह करने का एक पुराना तरीका है। आप अब (शायद पीडीओ वर्ग से) पैरामीटर वाले प्रश्नों का उपयोग करना चाहेंगे।

$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);

डेटाबेस से आउटपुट - XSS को कैसे रोकें (क्रॉस साइट स्क्रिप्टिंग)

htmlspecialchars()डेटाबेस से डेटा आउटपुट करते समय ही उपयोग करें । HTML शोधक के लिए भी यही बात लागू होती है। उदाहरण:

$html['username'] = htmlspecialchars($clean['username'])

और अंत में ... आपने जो अनुरोध किया था

मुझे यह बताना चाहिए कि यदि आप पैरामीटर किए गए प्रश्नों (इसे करने का उचित तरीका) के साथ पीडीओ ऑब्जेक्ट का उपयोग करते हैं तो वास्तव में इसे आसानी से प्राप्त करने का कोई आसान तरीका नहीं है। लेकिन अगर आप पुराने 'mysql' तरीके का इस्तेमाल करते हैं तो आपको यही चाहिए।

function filterThis($string) {
    return mysql_real_escape_string($string);
}

5

मेरे 5 सेंट।

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

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

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

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


1
mysql_real_escape_stringएक स्ट्रिंग के अंदर आवश्यक पात्रों से बच जाता है। यह कड़ाई से फ़िल्टर या सैनिटाइज़िंग नहीं है, लेकिन उद्धरणों में एक स्ट्रिंग संलग्न करना न तो है (और हर कोई ऐसा करता है, मैं बहुत ज्यादा कभी इसके बारे में सवाल नहीं देखा)। जब हम SQL लिखते हैं तो कुछ भी sanitized नहीं होता है? बिलकूल नही। SQL इंजेक्शन क्या रोकता है का उपयोग होता है mysql_real_escape_string। इसके अलावा संलग्नक उद्धरण, लेकिन हर कोई इसे करता है, और यदि आप परीक्षण करते हैं कि आप क्या करते हैं, तो आप इस चूक के साथ SQL सिंटैक्स त्रुटि के साथ समाप्त होते हैं। असली खतरनाक हिस्से को संभाला जाता है mysql_real_escape_string
सेवेजमैन

@ सवेगमैन सॉरी पाल, आप समझ गए ना कि बात। आपको mysql_real_escape_string के काम करने के तरीके की समझ नहीं है। ये "आवश्यक वर्ण" उद्धरण हैं। इस फंक्शन में और न ही उद्धरण कुछ भी साफ नहीं करता है। ये 2 चीजें केवल एक साथ काम करती हैं । क्वेरी स्ट्रिंग को केवल वाक्यात्मक रूप से सही बनाते हुए, "इंजेक्शन से सुरक्षित" नहीं। और क्या सिंटैक्स त्रुटि मुझे बस के लिए मिलेगी WHERE id = 1? ;)
आपका कॉमन सेंस

WHERE my_field = two wordsवाक्यविन्यास त्रुटि प्राप्त करने के लिए (बिना उद्धरण के) प्रयास करें । आपका उदाहरण खराब है, क्योंकि इसमें न तो भागने की जरूरत है, न ही संख्यात्मक जांच की। इसके अलावा, मैंने यह नहीं कहा कि उद्धरण बेकार थे। मैंने कहा कि हर कोई उनका उपयोग करता है इसलिए यह SQL इंजेक्शन के बारे में समस्याओं का स्रोत नहीं है।
सवजीमन

1
@ सैवेजमैन, ताकि मैंने कहा: आप इसका उपयोग केवल तभी कर सकते हैं जब आप समझते हैं कि यह कैसे काम करता है और यह कहां लागू होता है। आपने अभी स्वीकार किया है कि mysql_real_escape_string हर जगह लागू नहीं है। everyone use themआप के लिए एसओ पर यहाँ कोड की जाँच कर सकते हैं। कई लोग संख्याओं के साथ उद्धरण का उपयोग नहीं करते हैं। जाओ पता लगाओ। कृपया, इस बात को ध्यान में रखें कि मैं यहां चर्चा नहीं कर रहा हूं कि आपने क्या कहा है और क्या नहीं। मैं सिर्फ बुनियादी डेटाबेस सुरक्षा नियमों की व्याख्या कर रहा हूं। आप खाली बहस के बजाय बेहतर सीखेंगे। किसी ने यहां उद्धरण या कास्टिंग का उल्लेख नहीं किया है, लेकिन m_r_e_s केवल इसलिए कि यह जादू है। मैं किस बारे में बात कर रहा हूं
आपका कॉमन सेंस

1
एक ऊपर, साथ ही साथ @Charles। एक नौसिखिया के रूप में, डेटाबेस इंटरैक्शन ... इनपुट और डिस्प्ले के लिए चीजों को सुरक्षित बनाना, विशेष वर्ण, इंजेक्शन मुद्दे, एक बहुत ही कठिन सीखने की अवस्था रही है। आपकी पोस्ट और उनके (साथ ही साथ आपके अन्य PHP उत्तर अन्य प्रश्नों को पढ़ते हुए, मुझे बहुत मदद मिली है। आपके सभी इनपुट के लिए टीएक्स।
जेम्स वॉकर

2

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

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

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

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

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


2

1) देशी php फिल्टर्स के उपयोग से , मुझे निम्नलिखित परिणाम मिले हैं:

यहां छवि विवरण दर्ज करें


(सोर्स स्क्रिप्ट: https: // RunFor github.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php )


आपकी छवि लोड नहीं होती (या हो सकता है कि उसे Google ड्राइव पर लॉगिन की आवश्यकता हो)।
क्रिस्टोफ़र बोहमन

2

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

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


1

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

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


1

यहाँ उन सभी के बारे में जो mysql_real_escape_string पर बात कर रहे हैं और भरोसा कर रहे हैं, आपको यह ध्यान देने की आवश्यकता है कि उस फ़ंक्शन को PHP5 पर पदावनत किया गया था और अब PHP7 पर मौजूद नहीं है।

IMHO इस कार्य को पूरा करने का सबसे अच्छा तरीका डेटाबेस के साथ बातचीत करने के लिए PDO के उपयोग के माध्यम से पैरामीट्रिक प्रश्नों का उपयोग करना है। इसे देखें: https://phpdelusions.net/pdo_examples/select

उपयोगकर्ता इनपुट को संसाधित करने के लिए हमेशा फ़िल्टर का उपयोग करें। Http://php.net/manual/es/function.filter-input.php देखें


यह वास्तव में सवाल का जवाब नहीं देता है। समाधान शामिल करने के लिए अपने उत्तर को संशोधित करने पर विचार करें।
क्रिस

उम्मीद है आप इसे पसंद करते हैं!
कुंतूर

मैं करता हूँ। अच्छा उत्तर!
kris

मेरा सुझाव है कि PHP 7 mysqli_real_escape_string()में उपलब्ध है।
क्रिस

हाय क्रिस, यहाँ उजागर किए गए समाधानों ने mysql_real_escape_string का संदर्भ दिया, मैंने देखा कि अब कौन पढ़ता है कि यह PHP7 पर अब मौजूद नहीं है और PDO (और फ़िल्टर) का उपयोग करके कोई विकल्प प्रस्तावित नहीं किया है mysqli। जो आप सुझाव देते हैं उसका उपयोग करके एक समाधान बताने के लिए स्वतंत्र महसूस करें। सादर
कुंतूर

0

आप निम्नलिखित के समान कोड में 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 () में रखना सुरक्षित हो । प्रलेखन भी जोड़ता है:

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

htmlentities () का उपयोग संस्थाओं में कुछ वर्णों को परिवर्तित करने के लिए किया जाता है, जब आप HTML सामग्री में स्ट्रिंग का उत्पादन करते हैं।


0

यह वर्तमान में अभ्यास कर रहा है, में से 1 है,

  1. इंप्लांट csrf, और नमक के प्रलोभन टोकन के साथ-साथ उपयोगकर्ता द्वारा किए जाने वाले अनुरोध के साथ, और उन सभी को एक साथ अनुरोध से मान्य करते हैं। यहाँ देखें
  2. सुनिश्चित करें कि क्लाइंट साइड कुकीज़ पर बहुत अधिक निर्भर न हों और सर्वर साइड सत्रों का उपयोग करके अभ्यास करना सुनिश्चित करें
  3. जब कोई भी पार्सिंग डेटा, केवल डेटा प्रकार और हस्तांतरण विधि (जैसे POST और GET) को स्वीकार करना सुनिश्चित करता है
  4. SSL को ur webApp / App के लिए उपयोग करना सुनिश्चित करें
  5. जानबूझकर स्पैम अनुरोध को प्रतिबंधित करने के लिए समय आधार सत्र अनुरोध भी सुनिश्चित करें।
  6. जब डेटा सर्वर पर पार्स किया जाता है, तो यह सुनिश्चित करना सुनिश्चित करें कि अनुरोध को datamethod यू में बनाया जाना चाहिए, जैसे कि json, html, और आदि ... और फिर आगे बढ़ें।
  7. भागने के प्रकार का उपयोग करके इनपुट से सभी अवैध विशेषताओं से बचें ... जैसे कि realescapestring।
  8. उसके बाद यूजर्स से केवल डेटा टाइप u का एकमात्र फॉर्मल वेरिफिकेशन सत्यापित करें।
    उदाहरण:
    - ईमेल: जांचें कि क्या इनपुट वैध ईमेल प्रारूप में है
    - पाठ / स्ट्रिंग: केवल इनपुट की जांच करें केवल पाठ प्रारूप (स्ट्रिंग)
    - संख्या: केवल संख्या स्वरूप की जांच की अनुमति है।
    - आदि पेलसे ने php पोर्टल से php इनपुट वैरिफिकेशन लाइब्रेरी का संदर्भ लिया है
    - एक बार मान्य होने के बाद, तैयार SQL स्टेटमेंट / PDO का उपयोग करके आगे बढ़ें।
    - एक बार हो जाने के बाद, कनेक्शन से बाहर निकलें और समाप्त करना सुनिश्चित करें - एक बार किए
    गए आउटपुट मूल्य को साफ करना न भूलें।

मेरा मानना ​​है कि बुनियादी सेकंड के लिए पर्याप्त पर्याप्त है। यह हैकर से सभी बड़े हमले को रोकना चाहिए।

सर्वर साइड सुरक्षा के लिए, आप अपनी अपाचे / htaccess में पहुँच और रोबोट की रोकथाम की सीमा और रोकथाम को भी रोक सकते हैं। सर्वर साइड सुरक्षा के अलावा सर्वर साइड पर सुरक्षा के लिए बहुत कुछ करना चाहते हैं।

आप htaccess अपाचे सेकंड स्तर (आम rpactices) से सेकंड की एक प्रति सीख और प्राप्त कर सकते हैं


0
function sanitize($string,$dbmin,$dbmax){
$string = preg_replace('#[^a-z0-9]#i', '', $string); //useful for strict cleanse, alphanumeric here
$string = mysqli_real_escape_string($con, $string); //get ready for db
if(strlen($string) > $dbmax || strlen($string) < $dbmin){
    echo "reject_this"; exit();
    }
return $string;
}

0

इस बारे में क्या

$string = htmlspecialchars(strip_tags($_POST['example']));

या यह

$string = htmlentities($_POST['example'], ENT_QUOTES, 'UTF-8');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.