保护PHP中的“包含污染”变量

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了保护PHP中的“包含污染”变量脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
tl; dr:有没有办法阻止在include()调用之前声明/定义的变量(基本上是锁定)被包含的文件?另外,有点相关 question.

我想知道可以采取什么措施,以避免包含文件的可变污染.例如,鉴于这个奇特的小功能

/**
 * Recursively loads values by include returns into
 * arguments of a callback
 * 
 * If $path is a file,only that file will be included.
 * If $path is a directory,all files in that directory
 * and all sub-directories will be included.
 * 
 * When a file is included,$callback is invoked passing
 * the returned value as an argument.
 *
 * @param string $path
 * @param callable $callback
 */
function load_values_recursive($path,$callback){
    $paths[] = path($path);
    while(!empty($paths)){
        $path = array_pop($paths);
        if(is_file($path)){
            if(true === $callback(include($path))){
                break;
            }
        }
        if(is_dir($path)){
            foreach(glob($path . '*') as $path){
                $paths[] = path($path);
            }
        }
    }
}

我知道它缺少一些类型检查和其他解释,让我们忽略它们.

无论如何,这个函数基本上筛选了一堆只返回值的“数据”文件(通常是配置数组,或路由表,但无论如何),然后调用传递的回调,以便可以以某种方式过滤,排序或使用该值.例如:

$values = array();
load_values_recursive('path/to/dir/',function($value) use(&$values){
    $values[] = $value;
});

并且path / to / dir /可能有几个遵循此模板的文件

return array(
    // yay,data!
);

当这些“配置”文件(或其他任何试图保持这种可移植和跨功能文件)开始包含甚至是基本的逻辑时,我的问题就出现了.始终存在污染函数本地变量的可能性.例如,一个配置文件,为了聪明起见:

return array(
    'path_1' => $path = 'some/long/complicated/path/','path_2' => $path . 'foo/','path_3' => $path . 'bar/',);

现在,鉴于$path碰巧是一个相对于当前的可见目录,该函数将变得难以理解:

// ...
if(is_file($path)){
    if(true === $callback(include($path))){ // path gets reset to 
        break;                              // some/long/complicated/path/
    }
}
if(is_dir($path)){                          // and gets added into the
    foreach(glob($path . '*') as $path){    // seArch tree
        $paths[] = path($path);
    }
}
// ...

这可能会产生糟糕的结果.我能想到的唯一的700001解决方案是将include()调用包装在另一个匿名函数中以改变范围:

// ...
if(true === call_user_func(function() use($callback,$path){
    return $callback($path);
})){
    break;
}
// ...

因此,保护​​$path(更重要的是,$callback)不会导致每次迭代产生副作用.

我想知道在这种情况下是否存在一种更简单方法来“锁定”PHP中的变量.

>我只想在这里记录;我知道我可以使用例如一个elseif来缓解这个函数特有的问题之一,但是我的问题是对环境无关的解决方案更感兴趣,如果你愿意的话,这是一个全能的问题.

解决方法

看看 Giving PHP include()’d files parent variable scope它有一个相当独特的方法解决这里可以使用的问题.

它等于在include之前取消所有已定义的变量,然后在之后重置它们.

它肯定不优雅,但它会起作用.

脚本宝典总结

以上是脚本宝典为你收集整理的保护PHP中的“包含污染”变量全部内容,希望文章能够帮你解决保护PHP中的“包含污染”变量所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。