public static function render($file, $data = null)
{
$file_path = dirname(__DIR__) . "/views/{$file}.php";
// 如果给定文件名不存在或不可读
if (!is_readable($file_path)) {
throw new \Exception("找不到模板文件:{$file_path}。");
}
// 如果是数组就合并
if (is_array($data)) {
array_merge($data);
}
extract($data);
include $file_path;
}
然后模板中这样使用:
$a = 1;
View::render('home/index', compact('a'));
我不清楚该如何检查是否有安全问题 🥺,小问题就是同名的变量 extract 会冲突。
1
eason1874 2021-04-01 08:42:37 +08:00 1
array_merge 那行有用?看得我有点怀疑我对 PHP 的了解了。
extract 可以在第二个参数传入 EXTR_SKIP 不覆盖已存在的变量。 模板变量你不该直接传入用户输入,你要先过滤好再传入,所以安全过滤也不在这里过滤。 |
2
shenjinpeng 2021-04-01 09:16:26 +08:00 3
数组合并了个寂寞
|
3
wfdaj OP |
4
wfdaj OP @shenjinpeng 应该把代码放到 github 上,起名是 “php 新手常见错误用法实例” 😂
|
5
Rache1 2021-04-01 09:20:23 +08:00
单个值 array_merge 的作用等同于 array_values
|
7
imdong 2021-04-01 09:36:13 +08:00
@faqqcn 这个还真注意过,看了下文档“数字索引”确实会重新排。
不过,需要 extract 的大概率是关联数组了,所以真的就 array_merge 了个寂寞。 而且就算索引合并了,由于调用不是引用的,而返回值没有接收。 寂寞时的爱,到底爱的该不该。 |
8
imdong 2021-04-01 09:43:39 +08:00
另外补充回答楼主的问题:
第一个漏洞:如果构造出 $file = "../../upload/image" 并且恰巧这个目录是上传目录,就有可能会出现 include 用户上传的文件,而导致上传后门被利用。 然后 extract 这个的话,应该问题不大,简单来说就是这么搞。 |