2010-07-07 19 views
5

के साथ क्लास/विधि नामों को मान्य करें मैं वर्तमान में एक कंपनी के लिए एक एमवीसी स्टाइल फ्रेमवर्क पर काम कर रहा हूं और सुरक्षा कारणों से मुझे यह सुनिश्चित करने की ज़रूरत है कि क्वेरी स्ट्रिंग के माध्यम से पारित नियंत्रक/विधि आरएफसी के लिए वैध वर्ण है (जो मुझे नहीं मिल रहा है)।रेगेक्स

class SomEFunk__YClAssName extends Controller 
{ 

} 

मुझे लगता है कि SomEFunk__YClAssName को मान्य है और यह स्वच्छ होगा regex किसी तरह की जरूरत है:

मैं क्या पीएचपी दुभाषिया

उदाहरण के लिए द्वारा दी जाने वाली अनुमति के अनुसार वर्ग नामों स्वच्छ मान्य करने के लिए/सक्षम होना चाहिए अगर जरूरत हो! यह विधियों के समान सिद्धांत भी है।

कुछ चीजें शुरू

  • केवल अनुमति वाले अंडरस्कोर की अनुमति दी
  • कुछ पीएचपी विशेष वर्ण में इस तरह के रूप

    • अंकीय ध्यान में रखना करने के लिए नहीं है।

    इस या संभावित अभिव्यक्तियों पर कोई भी जानकारी वास्तव में सहायक होगी।

    private function prepareQueryString() 
        { 
         if(strlen($this->query_string) == 0) 
         { 
          return; 
         } 
         //Remove [ending|starting|multiple] slashes 
         $this->query_string = preg_replace('/^\/+|\/+$|\/(?=\/)/', '', $this->query_string); 
         foreach(explode('/',$this->query_string) as $Key => $Value) 
         { 
          if($Key == 0) 
          { 
           $Controller = $this->AssignController($Value); 
          } 
          if($Key == 1) 
          { 
           $this->AssignMethod($Value); 
          }else 
          { 
           $this->AssignParam($Value); 
          } 
         } 
    
         //Build RouterVar stdClass 
        } 
    
        public function AssignController(String $Controller) 
        { 
         if(!empty($Controller)) 
         { 
          //Sanitize 
         } 
        } 
    
        public function AssignMethod(String $Method) 
        { 
         if(!empty($Method)) 
         { 
          //Sanitize 
         } 
        } 
    
        public function AssignParam(String $Param) 
        { 
         $this->params[] = $Param; 
        } 
    

    आप टिप्पणी "स्वच्छ" जहां चेक की जरूरत है देखेंगे:

    यहाँ मेरी रूटर संहिता के कुछ ताकि आप देख सकते हैं, जहां मैं इसे लागू करने की आवश्यकता है।

  • उत्तर

    17

    मेरा मानना ​​है कि regex आप के लिए देख रहे हैं:

    <?php 
    preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $input); 
    ?> 
    

    के अनुसार: http://php.net/manual/en/language.oop5.basic.php

    +0

    कोड उदाहरण और दस्तावेज़ीकरण लिंक के लिए धन्यवाद। मैंने इसे उत्तर के रूप में चिह्नित किया होगा। – Xunnamius

    +2

    ** ध्यान **: मुझे लगता है कि आपके 'preg_match' में कोई दोष है, क्योंकि कोई प्रारंभ/अंत डिलीमीटर नहीं दिया जाता है। '$ इनपुट =" के साथ आपका कोड निश्चित रूप से मान्य क्लासनाम नहीं है! "वापस आ जाएगा 1. यदि आप इसे 'preg_match ('/^ [a-zA-Z_ \ x7f- \ xff] में बदलते हैं [a-zA-Z0- 9_ \ x7f- \ xff] * $/', $ इनपुट); 'यह 0/ –

    +0

    प्रारंभ/समाप्ति डिलिमीटर पर अच्छा कॉल देता है। – nate

    6

    आप एक सामान्य सामान्य अभिव्यक्ति का उपयोग करके बेहतर हैं, और फिर परीक्षण करते हैं कि वर्ग class_exists() पर एक साधारण कॉल के साथ मौजूद है।

    यह किसी भी वैध पीएचपी वर्ग के नाम से मेल खाएगी, ___ या _3 की तरह वास्तव में अजीब हैं, जो दोनों के वैध वर्ग के नाम हैं जिनमें शामिल हैं:

    /^[a-z_]\w+$/i 
    

    मैं व्यक्तिगत रूप से कक्षाओं के लिए PHP के नामकरण सम्मेलनों तुलना में अधिक प्रतिबंधात्मक हूँ। मैं अपने नियंत्रकों को पूंजीकृत होने की मांग करता हूं, और _controller के साथ पोस्ट-फिक्स्ड करता हूं ताकि अजीब गैर-नियंत्रक कक्षाएं अजीब यूआरएल के माध्यम से नहीं आतीं। और खोज इंजन अमित्र यूआरएल

    class Products_controller extends Controller { } 
    
    // elsewhere, after parsing the controller name from the URI: 
    
    if (preg_match('/^[A-Z]\w+_controller$/', $controller_name) 
    && class_exists($controller_name)) { 
        $controller = new $controller_name(); 
    } 
    

    एक अलग रूप में के रूप में, क्वेरी स्ट्रिंग पैदावार वास्तव में बदसूरत के माध्यम से नियंत्रक नाम गुजर: मैं कुछ इस तरह का उपयोग करेंगे। URL में नियंत्रक नाम और विधि के निर्माण पर विचार करें:

    /products/index # controller=products, action=index 
    /users/show/3 # controller=users, action=show, user id=3 
    
    +0

    मैं यह कर के साथ आने के '^(? = _ * [एज़] +) [ए-जे 0-9 _] + $ 'लेकिन अभी भी वर्ण हैं जिन्हें उदाहरण के लिए 'कक्षा € 1 {}' और 'वर्ग € € _ {}' – RobertPitt

    +0

    अनुमति दी जानी चाहिए आप वास्तव में किसी भी मनमाने ढंग से नामित कक्षा का आह्वान करना चाहते हैं, तो सचमुच आप जिस चीज की परवाह करते हैं वह वर्ग मौजूद है। नियमित अभिव्यक्ति को पूरी तरह से छोड़ें, यह सुरक्षा-वार कुछ भी नहीं जोड़ रहा है, और बस 'class_exists() 'की जांच करें। – meagar