2010-05-17 12 views
8

सामान्य रूप से, सभी समझदार डेवलपर्स (,, उचित प्रकार के कास्टिंग मान्य sanitizing आदि) सभी सार्वजनिक विधियों में से इनपुट सुरक्षित करने के लिए कोशिश कर रहे हैंनिजी/संरक्षित तरीकों के इनपुट को सुरक्षित करना?

मेरा प्रश्न है: सत्यापित किया जा रहा भी संरक्षित/निजी तरीकों के लिए पारित पैरामीटर आपके कोड में आप कर रहे हैं ? मेरी राय में यह आवश्यक नहीं है, यदि आप सार्वजनिक तरीकों के उचित पैरामीटर को सुरक्षित करते हैं और बाहर से मूल्य वापस लौटाते हैं (अन्य कक्षाएं, डीबी, उपयोगकर्ता इनपुट इत्यादि ...)।

लेकिन मुझे लगातार फ्रेमवर्क और ऐप्स (यानी एक नाम देने के लिए Prestashop) का सामना करना पड़ रहा है, जहां विधि कॉल में सत्यापन कॉल में अक्सर सत्यापन किया जाता है और एक बार फिर लौटा मूल्य सुरक्षित करने के लिए - जो मुझे लगता है, प्रदर्शन ओवरहेड बना रहा है और खराब डिजाइन का संकेत भी है।

+0

जब तक आप नियमित अभिव्यक्तियों का उपयोग नहीं कर रहे हैं (जो आपको नहीं होना चाहिए) तक आपको सत्यापन से बहुत अधिक प्रदर्शन ओवरहेड नहीं मिलेगा। – Andy

+0

मैंने काफी खराब सत्यापन देखा है, यानी। उल्लेखनीय prestashop में उनके पास उनके ओआरएम में TableOrIdentifier है, जो तालिका/कॉलम नाम की वैधता की जांच करने के लिए regexp का उपयोग करता है और इसे एक वस्तु के अंदर सचमुच दर्जन बार कहा जाता है (और अब सैकड़ों या हजार वस्तुओं को आयात करने की कल्पना करें) –

+0

यदि आप उपयुक्त कर रहे हैं यूनिट परीक्षण का स्तर, फिर कुछ निजी सदस्यों के कुछ सत्यापन को छोड़ना ठीक होगा। हमेशा जोखिम होता है, लेकिन यदि आपका; या एक समीक्षक; कोड के निरीक्षण से पता चलता है कि आपकी डाउनस्ट्रीम धारणा हमेशा कॉलिंग के सार्वजनिक सदस्य क्या कर रही हैं, इसके आधार पर सही होगी। – JoeGeeky

उत्तर

2

आप की राय है कि सार्वजनिक API का कार्यान्वयन कि खुद बुरा मापदंडों के खिलाफ की रक्षा होनी चाहिए का पालन हैं, तो आप कसौटी तरीकों की दृश्यता नहीं होना चाहिए, लेकिन एपीआई के उपयोगकर्ता सीधे कि विधि कॉल करने के लिए जा रहा है कि क्या (या अप्रत्यक्ष रूप से इसे किसी अन्य व्यक्ति के माध्यम से कॉल करें जो सत्यापन को रोकता है)।

तरीकों के उदाहरण है कि चाहिए सत्यापन करने के लिए:

class A { 
    protected final function myMethodDefaultImplementation(...) { 
     /* subclasses can just call this method in their myMethod implementations */ 
     /* should do validation */ 
     ... 
    } 
    protected abstract myMethod(...); 

    public function orderByDate() { 
     return $this->orderBy(ORDER_BY_DATE) 
    } 

    private function orderBy($crit) { 
     /* should do validation */ 
     ... 
    } 
} 
0

बिल्कुल - यदि आप अपने ऐप को अच्छी तरह डिज़ाइन करते हैं तो यह आवश्यक नहीं होना चाहिए।

3

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

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

-1

केवल पिछले संभव मौका पर इनपुट स्वच्छ। मैं नहीं देखता कि ओओ अर्थशास्त्र कैसे इसे अलग करता है।

उदाहरण के लिए अगर किसी कारण आप पैरामिट्रीकृत प्रश्न या एक ORM (उदाहरण के ony मैं पल :) पर सोच सकते हैं उपयोग नहीं कर सकते के लिए , तो आप इस तरह समारोह लिखना चाहते हैं:

function getname($id) { 
    $id = intval($id); 
    mysql_query("SELECT * FROM users WHERE id = $id"); 
    ... 
} 

अब इस फ़ंक्शन को कॉल करने और अप्रत्याशित परिणामों का कारण बनने के लिए किसी भी कोड के लिए असंभव है।

+0

क्यों डाउनवोट? इस तरह यह किया गया है। एपीआई बनाने का कोई मतलब नहीं है जो आपको एसक्यूएल इंजेक्ट करने देता है। इसका उल्लेख नहीं है ** बिल्कुल ** स्वीकृत समाधान के समान है। –

0

मैं कहूंगा कि इससे कोई फर्क नहीं पड़ता कि यह किस प्रकार की विधि है (सार्वजनिक, निजी, संरक्षित), दृश्यता कीवर्ड को देखे बिना जब भी इसकी आवश्यकता होती है तो उचित सावधानी बरतें।

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