【发布时间】:2011-04-25 16:27:00
【问题描述】:
PHP 中有没有什么函数可以用来检测exec 函数是否可用?
【问题讨论】:
-
echo (int)function_exists('exec');
PHP 中有没有什么函数可以用来检测exec 函数是否可用?
【问题讨论】:
echo (int)function_exists('exec');
<?php
function exec_enabled() {
$disabled = explode(',', ini_get('disable_functions'));
return !in_array('exec', $disabled);
}
?>
编辑:根据 Ziagl 的评论修复了爆炸。
【讨论】:
exec,则返回true。
ini_get() 与 exec 和其他文件系统功能一起在禁用功能列表中;考虑到托管服务提供商可能担心在 INI 文件中公开信息,这是一种可能的情况。
您可以在ini设置disable_functions中搜索exec()函数。
if( false !== strpos(ini_get("disable_functions"), "exec") ) {
// exec() is disabled
为了完整起见,请注意 PHP Safe Mode 也对函数设置了一些限制。
【讨论】:
shell_exec 之类的函数已放入disable_functions 但exec 未放入,这将返回错误答案。最好使用explode 或regex 来确保它匹配一个完整的函数名。
您还需要检查 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;
}
【讨论】:
下面的函数更健壮。它处理函数名称之间有 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;
}
【讨论】:
使用各种 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'); }
【讨论】: