
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 array_merge 那行有用?看得我有点怀疑我对 PHP 的了解了。 extract 可以在第二个参数传入 EXTR_SKIP 不覆盖已存在的变量。 模板变量你不该直接传入用户输入,你要先过滤好再传入,所以安全过滤也不在这里过滤。 |
2 urlk 2021-04-01 09:16:26 +08:00 数组合并了个寂寞 |
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 这个的话,应该问题不大,简单来说就是这么搞。 |