2009-01-19 8 views
23

जेड कोड पर फिर से फैक्टरिंग php और सभी कोड $_GET["this"] और $_POST["that"] से भरा है। मैंने हमेशा अधिक phpish $this->_request->getPost('this') और $this->_request->getQuery('that') का उपयोग किया है (यह GetGet के बजाय getquery के साथ इतना तार्किक नहीं है)।ज़ेंड फ्रेमवर्क (पोस्ट, प्राप्त, आदि) के साथ इनपुट हैंडलिंग

तो मैं अगर मेरे विधि सुरक्षित/बेहतर/आसान mantain लिए किया गया था सोच रहा था। मैंने ज़ेंड फ्रेमवर्क दस्तावेज में पढ़ा है कि आपको अपना ऑब्जेक्ट सत्यापित करना होगा क्योंकि अनुरोध ऑब्जेक्ट ऐसा नहीं करेगा।

जो मुझे 2 सवालों के साथ छोड़ देता है:

  • क्या यह दोनों में से सबसे अच्छा है? (या यदि एक और बेहतर तरीका है)
  • इस विधि के साथ PHP इनपुट को सत्यापित करने के लिए सबसे अच्छा अभ्यास क्या है?

धन्यवाद!

उत्तर

34

मैं आमतौर पर उपयोग करें $ इस -> _ अनुरोध> getParams(); पोस्ट या यूआरएल पैरामीटर को पुनः प्राप्त करने के लिए। फिर मैं सत्यापन और फ़िल्टरिंग करने के लिए Zend_Filter_Input का उपयोग करता हूं। GetParams() सत्यापन नहीं करता है।

का उपयोग Zend_Filter_Input आप Zend प्रमाणकों का उपयोग कर, अनुप्रयोग स्तर सत्यापन कर सकते हैं (या आप भी अपने खुद के बारे में कर सकते हैं)। उदाहरण के लिए, आप सुनिश्चित कर सकते 'महीने का क्षेत्र एक संख्या है:

$data = $this->_request->getParams(); 

$validators = array(
    'month' => 'Digits', 
); 

$input = new Zend_Filter_Input($filters, $validators, $data); 
+1

मैं सहमत हूं और ज़ेंड फॉर्म को भी देखने का सुझाव दूंगा क्योंकि आप एक फॉर्म में फ़िल्टर और सत्यापनकर्ता संलग्न कर सकते हैं और फिर उस फॉर्म ऑब्जेक्ट के साथ आने वाले इनपुट को मान्य कर सकते हैं। इस तथ्य को न मानें कि यह एक फॉर्म ऑब्जेक्ट है - यह एक फिल्टर/सत्यापनकर्ता कंटेनर भी है। –

6

आप प्राप्त/पोस्ट डेटा के लिए एक एक आकार फिट सभी मान्यता समारोह नहीं लिख सकते हैं। कुछ मामलों में आपको एक फ़ील्ड को पूर्णांक होने की आवश्यकता होती है और दूसरों में उदाहरण के लिए एक तिथि होती है। यही कारण है कि ज़ेंड फ्रेमवर्क में कोई इनपुट सत्यापन नहीं है।

आप जगह है जहाँ आप इसकी आवश्यकता पर सत्यापन कोड लिखना होगा। आप निश्चित रूप से कुछ सहायक तरीकों को लिख सकते हैं, लेकिन आप getPost() को अपने लिए कुछ भी सत्यापित करने की उम्मीद नहीं कर सकते हैं ...

और यह कुछ भी मान्य करने के लिए पोस्ट/getQuery की जगह भी नहीं है, यह नौकरी है आपको वह डेटा प्राप्त करना है जो आप नहीं चाहते हैं, वहां से क्या होता है, यह चिंता का विषय नहीं होना चाहिए।

+0

पता नहीं क्यों आप नीचे मतदान कर रहे हैं। –

10

ब्रायन के उत्तर का विस्तार।

क्या आप भी $this->_request->getPost() और $this->_request->getQuery() की जांच कर सकते बताया गया है। यदि आप getParams() पर सामान्यीकृत करते हैं, तो यह $_REQUEST सुपरग्लोबल का उपयोग करने जैसा है और मुझे नहीं लगता कि यह सुरक्षा के मामले में स्वीकार्य है।

ज़ेंड_फिल्टर के अतिरिक्त, आप आवश्यकतानुसार सरल PHP का उपयोग भी कर सकते हैं।

उदा .:

$id = (int) $this->_request->getQuery('id'); 

अन्य मूल्यों के लिए, यह और अधिक जटिल हो जाता है, तो उदा यह सुनिश्चित कर लें अपने डीबी प्रश्नों में उद्धरण (Zend_Db, पहचानकर्ताओं को उद्धृत करना देखें, $db->quoteIdentifier()) और विचारों में सामग्री से बचने के लिए $this->escape($var); का उपयोग करें।

1

मैं हमेशा अधिक phpish $this->_request->getPost('this') और $this->_request->getQuery('that') (यह एक इतना getGet की getquery insteado साथ तार्किक नहीं किया जा रहा) का इस्तेमाल किया है।

इन दोनों में से सबसे अच्छा क्या है?(या यदि एक और बेहतर तरीका है)

getQuery() की पसंद पर बस एक त्वरित स्पष्टीकरण। शब्द पसंद यह किस प्रकार का डेटा है, यह नहीं कि यह कैसे मिला। जीईटी और पोस्ट केवल अनुरोध विधि हैं, जिसमें पोस्ट अनुरोध के मामले में, "पोस्ट डेटा" के नाम से जाना जाने वाला सभी प्रकार की जानकारी शामिल है। एक जीईटी अनुरोध में ऐसा कोई ब्लॉक नहीं है, जो कोई वैरिएबल डेटा होता है वह यूआरएल की क्वेरी स्ट्रिंग (भाग के बाद का हिस्सा) का हिस्सा होता है।

तो, जबकि getPost() एक पोस्ट अनुरोध के पद डेटा अनुभाग, से डेटा प्राप्त getQuery() या तो किसी GET या पोस्ट अनुरोध (और साथ ही अन्य HTTP अनुरोध विधि) की क्वेरी स्ट्रिंग से डेटा प्राप्त करता है।

(ध्यान दें कि GET अनुरोध भी चीज के लिए नहीं किया जाना चाहिए कि एक पक्ष प्रभाव का उत्पादन हो सकता है, एक DB पंक्ति में फेरबदल की तरह)

तो, अपने पहले प्रश्न के उत्तर में, getPost() और getQuery() तरीकों का उपयोग, इस तरह से , आप सुनिश्चित कर सकते हैं कि डेटा स्रोत कहां है (यदि आपको परवाह नहीं है, getParams() भी काम करता है, लेकिन इसमें अतिरिक्त डेटा शामिल हो सकता है)।

इस विधि के साथ PHP इनपुट को सत्यापित करने के लिए सबसे अच्छा अभ्यास क्या है?

इनपुट को मान्य करने के लिए सबसे अच्छी जगह है जहाँ आप पहले इसका इस्तेमाल होता है। ऐसा कहने के लिए, जब आप इसे getParams(), getPost(), या getQuery() से खींचते हैं। इस तरह, आपका डेटा हमेशा जहां आपको इसकी आवश्यकता है, के लिए सही है, और यदि आप इसे पास करते हैं, तो आप जानते हैं कि यह सुरक्षित है। ध्यान रखें, अगर आप इसे किसी अन्य नियंत्रक (या नियंत्रक एक्शन) में पास करते हैं, तो आपको सुरक्षित होने के लिए, इसे फिर से जांचना चाहिए। आप यह कैसे करते हैं आपके आवेदन पर निर्भर करता है, लेकिन इसे अभी भी जांचना होगा।

1

सीधे विषय से संबंधित नहीं है, लेकिन है कि आप अपने इनपुट में एक नंबर मिल बीमा करने के लिए, + 0 (हालांकि अगर $ वर एक नाव यह एक नाव रहता है) आप उपयोग कर सकते हैं एक भी $ वर इस्तेमाल कर सकते हैं ज्यादातर मामलों में $ id = $ यह -> _ अनुरोध-> getQuery ('id') +0;

2
$dataGet = $this->getRequest()->getParam('id',null); 
$valid = new Zend_Validate_Digits(); 

if(isset($dataGet) && $valid->isValid($dataGet)){ 
// do some... 
} else{ 
    // not set 
} 
संबंधित मुद्दे