2010-07-07 15 views
5

Şu anda bir şirket için bir MVC Stil çerçevesi üzerinde çalışıyorum ve güvenlik nedenleriyle Query String aracılığıyla iletilen denetleyici/yöntemin RFC için geçerli karakter olduğundan emin olmam gerekir. bulamadığım).Regex ile geçerli sınıf/yöntem adları

class SomEFunk__YClAssName extends Controller 
{ 

} 

Ben SomEFunk__YClAssName doğrulamak ve onu sterilize edecek regex çeşit gerekir:

PHP yorumlayıcısı Örnek için

tarafından izin verilen uygulamalar uyarınca sınıf isimleri sterilize/doğrulamak gerekiyor Gerekirse! Bu aynı zamanda yöntemlerle aynı ilkedir.

birkaç şey gibi

  • Sayısallar
  • Bazı PHP Özel Karakter izin verilmesi için sadece izin underscores başından
  • de dikkate almak yoktur.

Bu veya olası anlatımlarla ilgili her türlü bilgi gerçekten yardımcı olabilir.

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; 
    } 

Check tabi comment "sterilize" göreceksiniz: Bunu uygulamak gerekir nerede görebilirsiniz

İşte benim Yönlendirici Kanununun bazı olduğunu.

cevap

17

Ben inanıyorum:

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

göre: http://php.net/manual/en/language.oop5.basic.php

+0

Kod örneği ve belge bağlantısı için teşekkür ederiz. Bunu cevap olarak işaretlerdim. – Xunnamius

+2

** Dikkat **: Başlangıç ​​/ bitiş sınırlayıcı verilmediğinden, preg_match'de bir kusur olduğunu düşünüyorum. "$ Input =" Geçerli Bir Geçersiz Sınıf Adı Değil! "Ile kodunuz 1'e dönecektir. Eğer bunu preg_match ('/^[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0- olarak değiştirirseniz 9_ \ x7f- \ xff] * $/', $ giriş); '0 değerini döndürür. –

+0

Başlangıç ​​/ bitiş sınırlayıcısında iyi çağrı. – nate

6

Çok genel bir düzenli ifade kullanmaktan ve daha sonra sınıfın class_exists() numaralı basit bir çağrıyla var olduğunu test etmekten daha iyidir.

Bu

geçerli sınıf adları her ikisi de ___ veya _3 gibi gerçekten garip olanlar da dahil olmak üzere, her çeşit PHP sınıfı adı eşleşir:

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

Ben şahsen sınıflar için PHP'nin adlandırma kuralları daha kısıtlayıcı değilim. Denetleyicilerimin büyük harfle yazılmasını ve _controller ile sonradan sabitlenmesini istemiyorum, böylece tuhaf olmayan denetleyici olmayan sınıflar garip URL'ler aracılığıyla çalıştırılmıyor. gerçekten çirkin sorgu dize verim aracılığıyla kontrolör adını geçirmeden, bir kenara bırakırsak

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(); 
} 

ve düşmanca URL'ler motoru arama: Böyle bir şey kullanmayı tercih ediyorum. URL'ye kontrolör adı ve yöntemi bina düşünün:

aradığınız regex olduğunu
/products/index # controller=products, action=index 
/users/show/3 # controller=users, action=show, user id=3 
+0

bunu yaparken ile gelip '^(? = _ * [Az] +) [A-z0-9 _] + $ 'ancak, örneğin," sınıf 1 € {} "ve" class €€ _ {} " – RobertPitt

+0

için izin verilmesi gereken karakterler var. gerçekten rasgele isimlendirilmiş bir sınıfı çağırmak istiyorsun, o zaman gerçekten umursadığın tek şey sınıfın varlığına dayanmaktır. Normal ifadeyi tamamen atla, güvenlikle ilgili bir şey eklemiyor ve sadece class_exists() 'yi kontrol et. – meagar