2009-11-27 18 views
10

मैं फिलहाल एक PHP- आधारित सीएमएस पर बहुत काम कर रहा हूं, और जब मैं इसमें हूं, तो मैं एक केंद्रीय स्थान पर उपयोगकर्ता इनपुट के सभी हैंडलिंग और स्वच्छता को स्थानांतरित करना चाहता हूं। (फिलहाल, यह $ _REQUEST है, वहां $ _GET है, और इसी तरह)।फ़िल्टर_इनपुट() अधूरा क्यों है?

मुझे फ़िल्टर_इनपुट() बहुत पसंद है और बुनियादी स्वच्छता के लिए इसका उपयोग करना चाहते हैं, लेकिन मुझे यह स्पष्ट नहीं है कि यह फ़ंक्शन वास्तव में उत्पादन तैयार है या नहीं। उदाहरण के लिए, documentation नाम $ के लिए निम्न पैरामीटर टाइप

INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, INPUT_SESSION (not implemented yet) and INPUT_REQUEST (not implemented yet).

समारोह 5.2.0 के बाद से मौजूद है, यही कारण है कि दो महत्वपूर्ण तत्व अभी तक लागू नहीं कर रहे हैं? अगर मैं $ _REQUEST से डेटा प्राप्त करना चाहता हूं, तो आपको उपयोगकर्ता द्वारा योगदान किए गए नोट्स से वर्कअराउंड का उपयोग करना होगा। क्या इसके लिए कोई विशेष कारण है? क्या यह कार्य अभी भी किसी प्रकार की बीटा में है? क्या आने वाले डेटा को संभालने के लिए पहली कॉल के रूप में भरोसेमंद है?

शायद PHP विकास प्रक्रिया से परिचित कोई भी इस पर कुछ प्रकाश डाल सकता है।

+1

और 2015 में वहाँ अभी भी $ _SESSION के लिए कोई कार्यान्वयन में कम से कम नहीं दूसरों की जाँच अभी तक im केवल बस फिर php गेंद उठा प्रतीत होता है, लेकिन filter_var चारों ओर एक काम है। – Chris

+2

'INPUT_SESSION' और' INPUT_FILES' लागू नहीं किए गए हैं (हालांकि '$ _FILES' एक बहु-आयामी उपयोग केस प्रस्तुत करता है और डिफ़ॉल्ट रूप से दूसरों की तरह नहीं है)। '$ _SESSION' के लिए' filter_var_array() 'का उपयोग करें। मैं यह भी ध्यान रख सकता हूं कि कोई भी "INPUT_DATABASE" नहीं है, लेकिन आपके पास अभी भी जिम्मेदारियां हैं। फिर, 'filter_var_array()' आज़माएं। –

उत्तर

8

मैं एक केंद्रीय स्थान

हाँ, वह कितना प्यारा होगा करने के लिए सभी से निपटने और उपयोगकर्ता इनपुट की स्वच्छता स्थानांतरित करना चाहते हैं। यह नहीं किया जा सकता है। ऐसा नहीं है कि पाठ प्रसंस्करण कैसे काम करता है।

यदि आप एक संदर्भ से दूसरे संदर्भ में टेक्स्ट डाल रहे हैं तो आपको सही भागने का उपयोग करने की आवश्यकता है। (mysql_real_escape_string MySQL स्ट्रिंग अक्षर के लिए, HTML सामग्री के लिए htmlspecialchars, URL पैरामीटर के लिए urlencode, विशिष्ट संदर्भों के लिए अन्य)। जब आप फ़िल्टर कर रहे हों तो अपनी स्क्रिप्ट की शुरुआत में, आपको नहीं पता कि आपका इनपुट कहां खत्म हो रहा है, इसलिए आप नहीं जानते कि इसे कैसे बचाना है।

शायद एक इनपुट स्ट्रिंग डेटाबेस में दोनों (एसक्यूएल से बचने की जरूरत है) और सीधे पृष्ठ पर (HTML-escaped होने की आवश्यकता है) में जा रहा है। उन दोनों मामलों में शामिल कोई भी बच नहीं है। आप दोनों एक दूसरे के बाद एक से बच निकल सकते हैं, लेकिन फिर HTML में मान में अजीब बैकस्लैश दिखाई देगी और डेटाबेस में प्रतिलिपि एम्पर्सेंड से भरी होगी। इस misencoding के कुछ दौर और आप उस स्थिति को मिलता है जहां हर बार जब आप कुछ संपादित करते हैं, \\\\\\\\\\\\\\\\\\\\ और & के लंबे तार बाहर आते हैं।

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

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

+0

आप बहुत लंबे जवाब लिखते हैं (हालांकि अच्छा स्पष्टीकरण)। –

+0

@ बॉबन्स: मैं कहता हूं कि यह एक डिग्री के लिए किया जा सकता है यदि आप 1.) जानते हैं कि आपको स्क्रिप्ट में क्या चाहिए, और 2.) स्वच्छता चर को चिह्नित करें कि वे क्या हैं। मेरे बारे में जानने के लिए मेरे पास \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ :) मेरा मुख्य लक्ष्य सभी कोडों के सरणी से सामान खींचने के बजाय चेक के निर्धारित सेट के साथ एक मूल "सुरक्षा चेकपॉइंट" होना है। –

+0

एक साधारण स्पष्टीकरण यह है कि फ़िल्टरिंग/स्वच्छता केवल उस प्रक्रिया का हिस्सा है जिस पर आपके डेटा को जाने की आवश्यकता है। स्वच्छता डेटा अभी भी बचने की जरूरत है। जैसे आप एक SQL क्वेरी में unquoted एक ईमेल पता नहीं चिपकेगा, इससे कोई फर्क नहीं पड़ता कि यह कितना वैध है। –

3

प्रोग्रामिंग में, आपको जितना संभव हो सके अपने इनपुट पर प्रतिबंधक होना चाहिए। यह डेटा स्रोतों के लिए भी जाता है। $ _REQUEST में $ _GET, $ _POST और $ _COOKIE में सब कुछ शामिल है, जो समस्याओं का कारण बन सकता है।

उदाहरण के लिए सोचें कि क्या होता है यदि आपके सीएमएस की एक प्लगइन उनमें से एक में एक नई विशेष कुंजी पेश करती है, जो किसी अन्य प्लगइन में सार्थक कुंजी के रूप में मौजूद होती है?

तो कभी भी $ _REQUEST का उपयोग न करें। $ _GET, $ _POST या $ _COOKIE का उपयोग करें, जो भी आपके परिदृश्य फिट बैठता है। यह यथासंभव सख्त होने का एक अच्छा अभ्यास है, और इसका PHP के साथ कुछ लेना देना नहीं है, लेकिन सामान्य रूप से प्रोग्रामिंग के साथ।

+1

$ _REQUEST के लिए मान्य बिंदु, लेकिन फिर उन्हें इसे अनुपयुक्त छोड़ने के बजाय कहना चाहिए। –

4

"इनपुट फ़िल्टरिंग" या "स्वच्छता" एक बेतुका विचार है। इससे दूर रहो।

स्पष्टीकरण और आगे की चर्चा के

What's the best method for sanitizing user input with PHP?

What else should I be doing to sanitize user input?

+0

उपरोक्त बॉबन्स के साथ मेरी चर्चा पढ़ें। –

संबंधित मुद्दे