假阳性。目前尚不清楚您使用的是哪个版本的 phpseclib,但我们假设您使用的是最新的 2.0 版本 (2.0.34)。call_user_func
仅发生在第 2946 行:
https://github.com/phpseclib/phpseclib/blob/2.0.34/phpseclib/Net/SSH2.php#L2946
default:
if (is_callable($callback)) {
if (call_user_func($callback, $temp) === true) {
$this->_close_channel(self::CHANNEL_EXEC);
return true;
}
} else {
$output.= $temp;
}
它在 exec() 方法中。$callback
是一个参数,其用途在https://phpseclib.com/docs/commands#callbacks进行了讨论。3.0 分支$callback($temp)
代替callback_user_func($temp)
但它是相同的基本思想。可能$callback($temp)
不适用于旧版本的 PHP,而callback_user_func($temp)
可以。
call_user_func_array
在 SSH2.php 中被调用两次。一次在2227 行,一次在3375 行。
第 2227 行在login
方法中。这是该方法的作用:
function login($username)
{
$args = func_get_args();
$this->auth[] = $args;
// try logging with 'none' as an authentication method first since that's what
// PuTTY does
if (substr($this->server_identifier, 0, 15) != 'SSH-2.0-CoreFTP' && $this->auth_methods_to_continue === null) {
if ($this->_login($username)) {
return true;
}
if (count($args) == 1) {
return false;
}
}
return call_user_func_array(array(&$this, '_login'), $args);
}
在 phpseclib 3.0.11 中它正在做return $this->sublogin($username, ...$args);
,但基本思想是它获取每个元素$args
并将其作为单独的参数传递给$this->_login
. 就像如果你这样做了,$this->_login($args)
那么_login
只会采用一个参数。PHP 5.6 引入了 splat (...) 运算符,但 phpseclib 2 在 PHP 5.3 上运行,因此您必须执行call_user_func_array
或仅使用单个参数,仅此而已。
这是另一个实例call_user_func_array
:
function _reconnect()
{
$this->_reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST);
$this->retry_connect = true;
if (!$this->_connect()) {
return false;
}
foreach ($this->auth as $auth) {
$result = call_user_func_array(array(&$this, 'login'), $auth);
}
return $result;
}
所以同样的事情。
所以就像我说的,这是一个没有三明治的东西。误报。