Проверяйте имена классов / методов с помощью регулярных выражений - PullRequest
5 голосов
/ 07 июля 2010

В настоящее время я работаю над платформой MVC Style для компании, и по соображениям безопасности мне необходимо убедиться, что контроллер / метод, который передается через строку запроса, является действительными символами для 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;
    }

Вы увидите комментарий «Санитаризация», где необходим чек.

Ответы [ 2 ]

18 голосов
/ 17 августа 2012

Я считаю, что вы ищете регулярное выражение:

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

Согласно: http://php.net/manual/en/language.oop5.basic.php

6 голосов
/ 07 июля 2010

Вам лучше использовать очень общее регулярное выражение, а затем проверить существование класса с помощью простого вызова 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...