Php __自动加载:转义类名

Php __自动加载:转义类名,php,Php,这是我第一次尝试创建frontController,我遇到了一些小问题 首先让我给你一个印象,我的网站是什么样子的: 当我打开http://mysite.com/test 在我的浏览器中,服务器将使用GET参数$controller test调用index.php。这是由.htaccess完成的。 在index.php中,应创建类$controller的实例。 为此,我使用PHP的_autoload函数。 代码如下所示: $controller = $_GET["controller"]; f

这是我第一次尝试创建frontController,我遇到了一些小问题

首先让我给你一个印象,我的网站是什么样子的: 当我打开http://mysite.com/test 在我的浏览器中,服务器将使用GET参数$controller test调用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;
当您查看我提供的代码时,您可能已经注意到其中的eval内容。 我使用它来避免$controller类不存在时的致命错误,并显示404而不是它

有趣的是,当有人输入一个url,比如

会有

分析错误:语法错误,意外“!”

而且

致命错误:类“ImATroll!”:没有找到

所以问题是:我怎样才能抓住这个?如何以只包含类名所允许的字符的方式转义$controller变量?

我只需删除eval部分,并在该部分直接重定向到404

或者,如果需要,可以构建一个非动态404-ContentNotFoundController,并在类名不存在时简单地使用/yield它。

我只需删除eval部分,并在该部分直接重定向到404

如果需要,也可以构建一个非动态404-ContentNotFoundController,当类名不存在时,只需在那里使用/生成它。

为什么不在调用新的$controller之前尝试class_exists;类_exists将调用自动加载函数,如果为false,则包括'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

为什么不在调用新的$controller之前尝试class_exists;类_exists将调用自动加载函数,如果为false,则包括'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

只需为找不到的类创建一个类:

if(!class_exists($controller, false))
{
    $controller = "NotFound";
    include("controllers/NotFoundController.php");
}
您还可以将允许的控制器列为白名单,并在数组中检查是否识别该类名。这样做的缺点是,您必须为添加的每个类更改白名单


您还可以编写一个正则表达式来过滤可能的类名。

只需为找不到的类创建一个类:

if(!class_exists($controller, false))
{
    $controller = "NotFound";
    include("controllers/NotFoundController.php");
}
您还可以将允许的控制器列为白名单,并在数组中检查是否识别该类名。这样做的缺点是,您必须为添加的每个类更改白名单


您还可以编写一个正则表达式来过滤可能的类名。

实际上,您可以从自动加载函数中抛出一个异常

此异常是可捕获的,因此您可以提供“默认”功能


这是目前为止最好的方法,但是如果你坚持创建这个假控制器,你应该改用class_别名。

你实际上可以从你的自动加载函数中抛出一个异常p.s.:改用

此异常是可捕获的,因此您可以提供“默认”功能


这是目前为止最好的方法,但是如果你坚持创建这个假控制器,你应该改用class_别名。

谷歌“url验证”的第一个结果告诉你怎么做,这对我有什么帮助?虽然一个点在url中是有效的,但它不在类名中。好吧,这是我得到的第一个结果:谷歌“url验证”的第一个结果告诉你怎么做,这对我有什么帮助?虽然一个点在url中是有效的,但它不在类名中。好吧,这是我得到的第一个结果:有时生活可以如此简单!当我学习教程30的时候,我并没有把树木看成是木头。有时候生活是如此的简单!在我看来,遵循教程30.class_exists有两个好处:当它包含一个缺少所需类的文件时,不会发生致命错误。第二个当然是你提到的安全问题。但是谢谢你的回答!在我看来,类exists有两个好处:当它包含一个缺少所需类的文件时,不会发生致命错误。第二个当然是你提到的安全问题。但是谢谢你的回答!