请问,这几句简单的代码这样写有什么问题吗?🙏

2021-04-01 08:28:14 +08:00
 wfdaj
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 会冲突。

4064 次点击
所在节点    PHP
9 条回复
eason1874
2021-04-01 08:42:37 +08:00
array_merge 那行有用?看得我有点怀疑我对 PHP 的了解了。

extract 可以在第二个参数传入 EXTR_SKIP 不覆盖已存在的变量。

模板变量你不该直接传入用户输入,你要先过滤好再传入,所以安全过滤也不在这里过滤。
shenjinpeng
2021-04-01 09:16:26 +08:00
数组合并了个寂寞
wfdaj
2021-04-01 09:18:00 +08:00
@eason1874 感谢回复。
array_merge 我以为如果传入多个数组需要合并成一个呢;
EXTR_SKIP 确实可以;
是的,我是刚学,先实现能正常显示页面,然后学习过滤输入。再次感谢。
wfdaj
2021-04-01 09:19:34 +08:00
@shenjinpeng 应该把代码放到 github 上,起名是 “php 新手常见错误用法实例” 😂
Rache1
2021-04-01 09:20:23 +08:00
单个值 array_merge 的作用等同于 array_values
Rache1
2021-04-01 09:28:37 +08:00
@faqqcn 补充一句,“数字键的情况下”,因为 array_merge 也会重置数字键。
imdong
2021-04-01 09:36:13 +08:00
@faqqcn 这个还真注意过,看了下文档“数字索引”确实会重新排。

不过,需要 extract 的大概率是关联数组了,所以真的就 array_merge 了个寂寞。

而且就算索引合并了,由于调用不是引用的,而返回值没有接收。

寂寞时的爱,到底爱的该不该。
imdong
2021-04-01 09:43:39 +08:00
另外补充回答楼主的问题:

第一个漏洞:如果构造出 $file = "../../upload/image"

并且恰巧这个目录是上传目录,就有可能会出现 include 用户上传的文件,而导致上传后门被利用。

然后 extract 这个的话,应该问题不大,简单来说就是这么搞。
Rache1
2021-04-04 15:42:48 +08:00
@imdong 这个可以用 realpath 处理后再过滤

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767055

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX