2010-06-07 6 views
7

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

क्या मुझे डेटा को प्रमाणित करना चाहिए, फिर बैक-एंड फ़ंक्शंस में क्लीन डेटा भेजना चाहिए या क्या मुझे प्रत्येक कार्य पर भरोसा करना चाहिए ताकि वह अपना सत्यापन कर सके? या दोनों भी?

क्या इस तरह की चीज़ के लिए कोई मानक या सर्वोत्तम अभ्यास है?

वर्तमान में ऐप दोनों असंगत रूप से करता है और मैं चीजों को और अधिक सुसंगत बनाना चाहता हूं।

+0

http://symcbean.blogspot.co.uk/2017/07/validate-input-escape-output.html – symcbean

उत्तर

6

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

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

+0

इसके साथ एक समस्या यह है कि जब आवेदन यह आपके आवेदन के लिए आता है कि आप शायद नहीं जानते कि चर का उपयोग कैसे किया जा रहा है।इस कारण से आम तौर पर उपयोग से पहले इसे तुरंत साफ करना सर्वोत्तम होता है, इससे सुरक्षा आधारित सहकर्मी समीक्षा के लिए यह ** बहुत आसान हो जाता है **। – rook

2

मुझे लगता है कि यदि आप दोनों कर सकते हैं, और समय/संसाधन कोई समस्या नहीं है, क्यों नहीं?

2

यह एप्लिकेशन के दायरे/परिभाषा पर निर्भर करता है। लेकिन परंपरागत रूप से, आपके कार्यों का उपयोग $ ऑब्जेक्ट में किया जा सकता है-> कुछ करना() बस यही करता है। वहां सत्यापन पर भरोसा करके, आप अपने ओडब्ल्यूएन acccord के कुछ() को करने की क्षमता को रोकते हैं, या पता है?

बहुत, यदि आप बाहर सत्यापन रखते हैं तो आप इसे आसानी से प्रबंधित कर सकते हैं। उस विशेष आंतरिक कार्य में इसे शिकार करने की आवश्यकता नहीं है। इसे ओओपी रखें, लेकिन

$ डेटा = $ वैधकर्ता-> sanitize कुछ ($ डेटा); $ ऑब्जेक्ट-> कुछ करना ($ डेटा);

यह आपके सत्यापन नियमों को अलग-अलग और आपके आंतरिक कार्यों के लिए आसान रखता है।

class db { 
    function addRow($table, $associativeArray) { 
     // primitive i know, just an example 
    } 
} 

तुम वहाँ में अपने मान्यता चाहेगा:

विस्तार करने के लिए, आप एक डाटाबेस उद्देश्य यह है कि मेज पर एक सरणी कहते है कहते हैं?

function addRow($table, $associativeArray) { 
    if(isset($assiciativeArray['description']) { 
     // validate 
    } 
} 

मूर्खतापूर्ण होगा - यदि आप चाहते हैं कि वस्तु में आप

class product { 
    function update() { 
     if($this->validate()) { 
      $this->db->addRow($this->toArray()); // or something, you get the idea, ya? 
     } 
    } 
    function validate() { 
     if($this->description != "") { 
     return true; 
     } 
     return false; 
    } 
} 
8

दोनों बेहतर जवाब है में काम कर रहे हैं। होप प्रेरित विकास की समस्या से बचने के लिए डेटा को संभालने वाले प्रत्येक फ़ंक्शन में डेटा सत्यापन होना चाहिए (HDD)

+0

मुझे इस दृष्टिकोण के साथ मजबूत सहानुभूति है! यह वास्तव में करने का सही तरीका है। यह वह जगह है जहां PHP काम करने के लिए सिरदर्द बन जाता है, क्योंकि कमजोर टाइपिंग आपको यह सुनिश्चित करने के लिए मजबूर करती है कि सभी फ़ंक्शन तर्क सही प्रकार हैं ( –

+0

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

2

बैकएंड पर मान्य करना विमान पर चढ़ने के बाद यात्रियों को स्क्रीनिंग की तरह है। सत्यापन का पूरा बिंदु उन तत्वों को इंजेक्ट करने से रोकना है जो आपके ऐप को दबा सकते हैं। इसलिए आपको गेट में प्रवेश करने से पहले सत्यापित करना होगा :)

+0

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