Проверьте класс/имена методов с regex

Я в настоящее время работаю над платформой Стиля MVC для компании и из соображений безопасности, я должен удостовериться, что контроллер / метод, это передается через Строку запроса, является допустимыми символами к RFC (который я не могу найти).

Я должен смочь проверить / санируют имена классов согласно тому, что позволяется интерпретатором PHP

Например:

class SomEFunk__YClAssName extends Controller
{

}

Мне нужен некоторый regex, который проверит 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;
    }

Вы будете видеть, что комментарий "Санирует", где проверка необходима.

5
задан Paused until further notice. 10 July 2010 в 16:32
поделиться

1 ответ

Лучше использовать очень общее регулярное выражение, а затем проверить, что класс существует, простым вызовом 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
6
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: