2011-02-23 8 views
5

मैंने कोशिश की पीएचपी के अंतर्निहित समारोह: filter_input()क्या PHP का अंतर्निहित फ़िल्टर_इनपुट सही तरीके से काम करता है?

var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL)); 

आउटपुट:

स्ट्रिंग (19) "। John.doe @ gmail.com"

फिर मैंने ज़ेंड फ्रेमवर्क (1.11.3) की नवीनतम रिलीज की कोशिश की:

$validator = new Zend_Validate_EmailAddress(); 
if ($validator->isValid('[email protected]')) { 
    echo 'OK'; 
} else { 
    foreach ($validator->getMessages() as $message) { 
      echo "$message\n"; 
    } 
} 

आउटपुट:

'john.doe।' डॉट-एटम प्रारूप
'john.doe' के खिलाफ मिलान नहीं किया जा सकता है। उद्धृत-स्ट्रिंग प्रारूप
'john.doe' के खिलाफ मिलान नहीं किया जा सकता है। ईमेल पते 'john.doe। @ gmail.com'

या तो अंतर्निर्मित फ़ंक्शन को FALSE या Zend विधि 'OK' वापस करना चाहिए।

मेरा हबमेल प्रश्न है:
कौन सा सही है?

+0

यदि आप चाहते हैं कि सबसे अच्छा PHP ईमेल सत्यापनकर्ता यहां जाएं: http://www.dominicsayers.com/isemail/ – rojoca

उत्तर

2

http://framework.zend.com/manual/en/zend.validate.set.html वास्तव में गीलेर को इंगित नहीं करता है कि वे आरएफसी-सख्त हैं या नहीं, तो स्रोत को देखें। - तो स्थानीय हिस्सा शुरू या एक बिंदु के साथ समाप्त नहीं हो सकता

// Dot-atom characters are: 1*atext *("." 1*atext) 
    // atext: ALPHA/DIGIT/and "!", "#", "$", "%", "&", "'", "*", 
    //  "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~" 
    if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) { 

ऐसा लगता है कि वे निश्चित रूप से है कि करने के लिए सख्त रहते हो:

स्रोत में, _validateLocalPart() EBNF वे के खिलाफ मिलान कर रहे हैं परिभाषित करता है। और ज़ेड/मान्य/EmailAddress.php संदर्भ में अगर है docblock के रूप में 2822

का उपयोग कर इसलिए, यदि आप rfc2822 अनुरूप होने के लिए चाहते हैं - http://www.ietf.org/rfc/rfc2822.txt:

ऊपर पैटर्न बिल्कुल rfc2822 कल्पना के समान ही है , Zend_Validate_EmailAddress यह सही कर रहा है, और संभवतः, filter_input इसे spec से बाहर कर रहा है।

1

यह केवल मामला हो सकता है कि ज़ेंड_इंजिन आरएफसी (जो ईमेल के लिए 3 मील लंबा है) से सख्ती से मेल खाता है। मुझे संदेह है कि, सख्ती से बोलते हुए, अवधि को पात्रों की अनुमति है, लेकिन @ स्थिति की अनुमति नहीं होने से पहले की अवधि, इसलिए शायद यह समस्या है।

मुझे लगता है कि जीमेल अभी भी john.doe [email protected] gmail.com भेजने की अनुमति देगा। यदि ऐसा है, तो सवाल यह है कि आप वास्तव में आरएफसी से सख्ती से मेल खाना चाहते हैं या सिर्फ उन मामलों के लिए अनुमत ईमेल पते में अनुमोदित होना चाहते हैं जहां यह आपके सिस्टम को चोट नहीं पहुंचाता है।

यदि आप एसक्यूएल इंजेक्शन के बारे में चिंतित हैं, तो एसक्यूएल & में अपने चर से बाध्य करें अपने एचटीएमएल से बचें, क्योंकि इस बात की कोई गारंटी नहीं है कि आरएफसी का सख्त मैच वास्तव में ऐसी समस्याओं को रोक देगा।

यदि आप ईमेल भेजने योग्य/प्राप्य होने के बारे में चिंतित हैं, तो मैं केवल प्राप्ति की अपेक्षा के साथ भेजना चाहता हूं, या एक पुष्टिकरण लिंक का उपयोग कर वैकल्पिक ईमेल पुष्टिकरण प्रणाली स्थापित करना चाहता हूं।

यदि आप ईमेल हेडर इंजेक्शन के बारे में चिंतित हैं, तो मेल भेजने पर ईमेल लाइब्रेरी का उपयोग करने का यह एक अच्छा कारण है, मुझे उम्मीद है कि ज़ेंड एक मजबूत है।

TooLongDidn'tRead; मेरी सलाह है:

  • अनुमोदित रहें। (इसलिए जो भी विकल्प अधिक अनुमोदित है, इस मामले में filter_input)
  • परीक्षण करें कि क्या ईमेल ईमेल भेजकर काम करता है, यह लगभग एकमात्र सच्चा परीक्षण है।
  • एचटीएमएल-एस्केप & एचटीएमएल या एसक्यूएल में इसका इस्तेमाल करने का समय होने पर एसक्यूएल-बाइंड सब कुछ बांधें, और जब भी आप इसे इस्तेमाल करते हैं तो खतरनाक दुनिया से आने वाली किसी भी चीज पर भरोसा न करें।
  • शोषण योग्य PHP मेल() का उपयोग न करें, एक लाइब्रेरी का उपयोग करें जो मेल हेडर इंजेक्शन को रोक देगा।
+1

जबकि आपने सवाल का सही जवाब नहीं दिया है, तो आप निश्चित रूप से मुझे सही रास्ते पर सेट करते हैं और आप संभवतः सभी संभावित समस्याग्रस्त क्षेत्रों को कवर किया। आपने मुझे विश्वास दिलाया, कि मेरा सवाल पर्याप्त सटीक नहीं था। यह होना चाहिए था: "** कौन सा सही समस्या _ _ के लिए सही है? **" धन्यवाद! अगर मैं कर सकता तो मैं वोट दूंगा :) – user523736

0

यह आपके पास PHP के संस्करण पर भी निर्भर करता है। PHP 5.2.14 और ऊपर (साथ ही 5.3) में एक अद्यतन नियमित अभिव्यक्ति है (the commit to the PHP source code देखें)। PHP 5.2.13RC2 और नीचे पुरानी नियमित अभिव्यक्ति है। Bug #49576 भी देखें।

+0

हाँ, मेरी शुरुआती पोस्ट में इसे याद करने के लिए खेद है। PHP संस्करण 5.3.1 – user523736

+0

मेरी गलती। ऐसा लगता है कि अद्यतन नियमित अभिव्यक्ति 5.3.3 आरसी 1 तक 5.3 शाखा नहीं है। – cmbuckley

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