2010-07-07 6 views
5

현재 회사 및 보안상의 이유로 MVC 스타일 프레임 워크에서 작업 중입니다. 쿼리 문자열을 통해 전달 된 컨트롤러/메소드가 RFC에 유효한 문자인지 확인해야합니다 나는 찾을 수 없다).정규식을 사용하여 클래스/메소드 이름 유효성 검사

class SomEFunk__YClAssName extends Controller 
{ 

} 

내가 SomEFunk__YClAssName을 확인하고 소독합니다 정규식의 일종이 필요합니다

나는 PHP 인터프리터 예를 들어

에 의해 허용 있는지에 따라 클래스 이름을 살균/검증 할 수 있어야합니다 필요하다면! 이것은 또한 방법과 같은 원리입니다.

는 몇 가지 같은

  • 메릭스
  • 특정 PHP 특별 숯을 허용 할 만 허용 밑줄이 시작
  • 에서 고려하는있다.

이 표현식이나 가능한 표현식에 대한 정보는 도움이 될 것입니다.

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

내가 믿는 :

<?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'에 결함이 있다고 생각합니다. '$ input = "확실히 유효한 클래스 명이 아님!"으로 표시된 코드는 1을 반환합니다.'preg_match ('/^[a-zA-Z_ \ x7f- \ xff] [a-zA- $ input/$ input); 그것은 0을 반환합니다. –

+0

시작/끝 구분 기호에 대한 호출이 좋습니다. – nate

6

매우 일반적인 정규 표현식을 사용한 다음, class_exists()이라는 간단한 호출로 클래스가 존재하는지 테스트하는 것이 더 낫습니다.

은 유효한 클래스 이름입니다 둘 다 ___ 또는 _3 같은 정말 이상한 사람을 포함한 모든 유효한 PHP 클래스 이름과 일치합니다

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

나는 개인적으로 클래스 PHP의 명명 규칙보다 더 제한적입니다. 컨트롤러를 대문자로 표기하고 _controller으로 수정하여 이상한 비 컨트롤러 클래스가 이상한 URL을 통해 호출되지 않도록하십시오. 정말 추한 쿼리 문자열 수익률 통해 컨트롤러의 이름을 전달, 여담으로

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을-검색 엔진 :이 같은 것을 사용하십시오. 의 URL에 컨트롤러 이름 및 방법을 구축 고려 :

당신이 찾고있는 정규 표현식이
/products/index # controller=products, action=index 
/users/show/3 # controller=users, action=show, user id=3 
+0

내가이 일을 들고 오지'^A-z0-9 _] + $'하지만 여전히 허용되는 문자가 있습니다. 예를 들어 'class € 1 {}'클래스와 'class € _ _ {}'클래스가 허용되어야합니다. – RobertPitt

+0

If 임의로 명명 된 클래스를 호출하기를 원한다면 문자 그대로 클래스가 존재한다는 것이 중요합니다. 정규식을 완전히 건너 뛰고, 보안 측면에서 아무 것도 추가하지 않고'class_exists() '를 확인하십시오. – meagar

관련 문제