2012-06-18 9 views
1

이것은 frontController를 작성한 첫 번째 시도이며 약간의 문제를 해결했습니다.__autoload : Escape ClassName

먼저 내 사이트가 같은 모양을 내가 당신에게 인상을 줄 수 있도록 : 내 브라우저에서 http://mysite.com/test을 열 때 는, 서버가 GET 매개 변수 $ 컨트롤러 (시험)과의 index.php를 호출합니다. 이 작업은 .htaccess에 의해 수행됩니다. index.php에 $ controller 클래스의 인스턴스가 생성됩니다. 이를 위해 저는 PHP의 __autoload 함수를 사용합니다. 그래서 코드는 다음과 같습니다

$controller = $_GET["controller"]; 

function __autoload($controller) 
{ 
    include("controllers/$controller.php"); 

    if(!class_exists($controller, false)) 
    { 
     eval 
     (' 
      class '. $controller . ' 
      { 
       public function __construct() 
       { 
        include("404.html"); 
        exit(); 
       } 
      } 
     '); 
    } 
} 


$application = new $controller; 

당신은 당신이 그것을에서 평가() 꼬추를 눈치 챘을 수도에서 제공하는 코드를 보았을 때. $ controller 클래스가 존재하지 않을 때 치명적인 오류를 피하기 위해 이것을 사용하고, 대신에 404를 표시합니다. 여기

그리고

는 재미를 시작합니다 누군가가 들어갈 때

http://mysite.com/ImATroll!:D

같은 URL이

... 그래서

Fatal error: Class 'ImATroll!:D' not found

질문

Parse error: syntax error, unexpected '!'

그리고있을 것이다 is : 어떻게 c 나는 이것을 붙잡는다? $ 컨트롤러 변수를 클래스 이름에 허용 된 문자 만 포함하는 방법으로 어떻게 탈출 할 수 있습니까?

+0

Google에서 'url validation'에 대한 첫 번째 결과가 표시됩니다. –

+0

http://validator.w3.org/checklink 어떻게 도움이 될까요? 도트는 URL에서 유효하지만 클래스 이름에는 없습니다. – iceteea

+0

음, 첫 번째 결과는 다음과 같습니다. http://phpcentral.com/208-url-validation-in-php.html –

답변

1

실제로 자동로드 기능에서 예외를 throw 할 수 있습니다 (대신 : spl_autoload_register 사용).

이 예외는 캐치 가능하므로 '기본'기능을 제공 할 수 있습니다.

이 방법은 훨씬 뛰어난 방법이지만이 가짜 컨트롤러를 만들려는 경우 class_alias를 사용해야합니다.

4

나는 간단하게 을 놓았다.eval 부분은 그 부분에 직접적으로 404로 리디렉션된다.

또는 하나 (비 동적) 404 구축 - 당신이 원하는 경우 ContentNotFoundController을, 단순히이 (클래스 이름이 존재하지 않는) 것을/수율을 사용합니다.

+0

가끔은 인생이 너무 쉬울 수 있습니다! 튜토리얼 # 30을 따라했을 때 나는 나무에 대한 나무를 보지 못했습니다. – iceteea

2

new $controller; (class_exists는 autoload 함수를 호출 할 것입니다.)을 호출하기 전에 class_exists을 시도해 보시고, 틀리면 ('404.html');

function __autoload($classname){ 

    $file = "controllers/$classname.php"; 
    if(is_file($file)) 
    include_once($file); 

} 

... 그러나? controller = ../htpasswd와 같이 보안 문제에주의하십시오. 당신은 모든 영숫자가 아닌 문자를 제거하여 클래스 명을 소독한다고 - 간단히 찾을 수없는 클래스에 대한 클래스 생성 $classname = preg_replace('/[^A-Za-z0-9]/', '', $classname);

+0

class_exists는 내 의견으로는 여기에 2 가지 이점이 있습니다 : 원하는 클래스가없는 파일이 포함되어 있으면 치명적인 오류가 발생하지 않습니다. 그리고 두 번째로 언급 한 보안 문제. 답변을 주셔서 감사합니다. – iceteea

1

같은 :

if(!class_exists($controller, false)) 
{ 
    $controller = "NotFound"; 
    include("controllers/NotFoundController.php"); 
} 

을 할 수 있습니다 허용하고, 확인하는 또한 화이트리스트 컨트롤러 in_array()으로 그 클래스 이름을 인식했는지 여부. 그 단점은 추가 한 모든 클래스에 대해 화이트리스트를 변경해야한다는 것입니다.

가능한 클래스 이름을 필터링하는 정규식을 작성할 수도 있습니다.