Php __自动加载:转义类名
这是我第一次尝试创建frontController,我遇到了一些小问题 首先让我给你一个印象,我的网站是什么样子的: 当我打开http://mysite.com/test 在我的浏览器中,服务器将使用GET参数$controller test调用index.php。这是由.htaccess完成的。 在index.php中,应创建类$controller的实例。 为此,我使用PHP的_autoload函数。 代码如下所示:Php __自动加载:转义类名,php,Php,这是我第一次尝试创建frontController,我遇到了一些小问题 首先让我给你一个印象,我的网站是什么样子的: 当我打开http://mysite.com/test 在我的浏览器中,服务器将使用GET参数$controller test调用index.php。这是由.htaccess完成的。 在index.php中,应创建类$controller的实例。 为此,我使用PHP的_autoload函数。 代码如下所示: $controller = $_GET["controller"]; f
$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有两个好处:当它包含一个缺少所需类的文件时,不会发生致命错误。第二个当然是你提到的安全问题。但是谢谢你的回答!