>

현재 회사의 MVC 스타일 프레임 워크에서 작업하고 있으며 보안상의 이유로 쿼리 문자열을 통해 전달 된 컨트롤러/메소드가 RFC에 유효한 문자인지 확인해야합니다 (이를 찾을 수 없음). .

PHP 인터프리터가 허용하는 것에 따라 클래스 이름을 검증/위생 할 수 있어야합니다

예 :

class SomEFunk__YClAssName extends Controller
{
}

SomEFunk__YClAssName 를 검증 할 정규식이 필요합니다.  필요한 경우 소독하십시오! 이것도 방법과 같은 원리입니다.

고려해야 할 몇 가지 사항이 있습니다.

  • 시작시 숫자
  • 밑줄 만 허용
  • 특정 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;
    }

확인이 필요한 곳에 "Sanitize"라는 주석이 표시됩니다.

  • 답변 # 1

    당신이 찾고있는 정규식은 다음과 같습니다.

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

    에 따르면 : http://php.net/manual/en/language.oop5.basic.php

  • 답변 # 2

    매우 일반적인 정규식을 사용하는 것이 좋습니다. class_exists() 에 대한 간단한 호출로 클래스가 존재합니다. .

    이것은 ___ 와 같은 정말 이상한 것을 포함하여 유효한 PHP 클래스 이름과 일치합니다.  또는 _3 , 둘 다 유효한 클래스 이름입니다 :

    /^[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
    
    

  • 이전 angularjs - Google 애널리틱스에서 사용자 ID를 추적하고 로그인 후 페이지를 다시로드하지 않으려면 어떻게합니까?
  • 다음 판다 MultiIndex에서 사전 사전 정렬 보장