Я в настоящее время работаю над платформой Стиля MVC для компании и из соображений безопасности, я должен удостовериться, что контроллер / метод, это передается через Строку запроса, является допустимыми символами к RFC (который я не могу найти).
Я должен смочь проверить / санируют имена классов согласно тому, что позволяется интерпретатором PHP
Например:
class SomEFunk__YClAssName extends Controller
{
}
Мне нужен некоторый regex, который проверит SomEFunk__YClAssName
и санируйте его в случае необходимости! Это - также те же принципы как методы.
Существует несколько вещей учесть такой как
Любая информация об этом или возможных выражениях была бы действительно полезна.
Вот часть моего Кода Маршрутизатора, таким образом, Вы видите, где я должен реализовать его:
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;
}
Вы будете видеть, что комментарий "Санирует", где проверка необходима.
Лучше использовать очень общее регулярное выражение, а затем проверить, что класс существует, простым вызовом 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