【问题标题】:Check if "exec" is disabled [duplicate]检查“exec”是否被禁用[重复]
【发布时间】:2011-04-25 16:27:00
【问题描述】:

PHP 中有没有什么函数可以用来检测exec 函数是否可用?

【问题讨论】:

  • echo (int)function_exists('exec');

标签: php exec


【解决方案1】:
<?php
function exec_enabled() {
  $disabled = explode(',', ini_get('disable_functions'));
  return !in_array('exec', $disabled);
}
?>

编辑:根据 Ziagl 的评论修复了爆炸。

【讨论】:

  • 如果启用了exec,则返回true
  • 这就是为什么该函数被称为 exec_enabled 的原因,这并不是他所要求的。
  • 这可能有效,也可能无效 - 不幸的是,就我而言,我发现 ini_get()exec 和其他文件系统功能一起在禁用功能列表中;考虑到托管服务提供商可能担心在 INI 文件中公开信息,这是一种可能的情况。
  • 对我有用,但只能使用 explode(',' ... 而不是 explode(', ' ...ini_get 字符串中没有空格
  • 我不得不对返回的explode with trim 进行后期处理以剥离空白。
【解决方案2】:

您可以在ini设置disable_functions中搜索exec()函数。

if( false !== strpos(ini_get("disable_functions"), "exec") ) {
 // exec() is disabled

为了完整起见,请注意 PHP Safe Mode 也对函数设置了一些限制。

【讨论】:

  • 在我看来太慢了:)
  • 如果shell_exec 之类的函数已放入disable_functionsexec 未放入,这将返回错误答案。最好使用explode 或regex 来确保它匹配一个完整的函数名。
【解决方案3】:

您还需要检查 safe_mode 是否处于活动状态,因为如果 safe_mode 开启,则 exec 不可用

function is_exec_available() {

    // Are we in Safe Mode
    if ( $safe_mode = ini_get( 'safe_mode' ) && strtolower( $safe_mode ) != 'off' )
        return false;

    // Is shell_exec disabled?
    if ( in_array( 'exec', array_map( 'trim', explode( ',', ini_get( 'disable_functions' ) ) ) ) )
        return false;

    return true;

}

【讨论】:

    【解决方案4】:

    下面的函数更健壮。它处理函数名称之间有 0 个或多个空格的 disabled_functions 值,检查 suhosin 补丁的黑名单设置,覆盖 safe_mode,并存储答案以供将来参考。

    function is_exec_available() {
        static $available;
    
        if (!isset($available)) {
            $available = true;
            if (ini_get('safe_mode')) {
                $available = false;
            } else {
                $d = ini_get('disable_functions');
                $s = ini_get('suhosin.executor.func.blacklist');
                if ("$d$s") {
                    $array = preg_split('/,\s*/', "$d,$s");
                    if (in_array('exec', $array)) {
                        $available = false;
                    }
                }
            }
        }
    
        return $available;
    }
    

    【讨论】:

    • 为了记录,添加 suhosin 黑名单检查的编辑是我的。提交后,我意识到我的身份验证会话不正常。唉。
    【解决方案5】:

    使用各种 SO 帖子中的一些技术对安全模式、功能存在和禁用 exec 进行单行编译。

    这将在尝试运行之前检查 exec 是否可用并已启用。如果您运行 exec() 并且该功能不存在或被禁用,则会生成警告。取决于可能呈现给浏览器的服务器设置,并且几乎总是将一行写入日志文件 = 性能下降。

    // Exec function exists.
    // Exec is not disabled.
    // Safe Mode is not on.
    $exec_enabled =
         function_exists('exec')                                            &&
         !in_array('exec', array_map('trim',explode(', ', ini_get('disable_functions'))))     &&
                  !(strtolower( ini_get( 'safe_mode' ) ) != 'off')
         ;
    
    
    if ($exec_enabled) { exec('blah'); }
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 2014-08-15
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多