V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wfdaj
V2EX  ›  PHP

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

  •  1
     
  •   wfdaj · 2021-04-01 08:28:14 +08:00 · 4023 次点击
    这是一个创建于 1092 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 会冲突。

    9 条回复    2021-04-04 15:42:48 +08:00
    eason1874
        1
    eason1874  
       2021-04-01 08:42:37 +08:00   ❤️ 1
    array_merge 那行有用?看得我有点怀疑我对 PHP 的了解了。

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

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

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

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

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

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

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

    然后 extract 这个的话,应该问题不大,简单来说就是这么搞。
    Rache1
        9
    Rache1  
       2021-04-04 15:42:48 +08:00
    @imdong 这个可以用 realpath 处理后再过滤
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1404 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:45 · PVG 07:45 · LAX 16:45 · JFK 19:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.