提问人:Ernest Allen Buffington 提问时间:12/20/2022 最后编辑:IMSoPErnest Allen Buffington 更新时间:5/4/2023 访问量:362
内爆警告:PHP中的数组到字符串转换-Nuke 钛函数deepPurifier
implode Warning: array to string conversion in PHP-Nuke Titanium function deepPurifier
问:
这在除 8 之外的每个 PHP 版本中都没有任何警告
我认为他们已经用内爆改变了一些东西,我已经尝试了所有的例子,但无济于事。
也许我可以用其他方式完成这项工作。我需要一些 PHP 8 的眼睛,因为我对 PHP 8 及更高版本非常陌生。
我的函数中的警告在以下行:
警告:数组到字符串的转换
$test = implode(', ', $data);
当你使用这么多具有相似语法的不同语言时,很难理解某些事情。我担心这只是我的一个小脑屁。
尽管我有警告,但此代码似乎可以正常工作,我想知道这是否只是 PHP 8 和 8.1 等中的错误
function deepPurifier($data)
{
global $html_auth, $admin;
static $config, $purifier;
# Error check
if(empty($data) || !isset($data))
return $data;
if(!is_array($data))
return stripslashes((string) $data);
// THIS IS WHERE MY WARNING IS
// warning: array to string conversion
$test = implode(', ', $data);
if(!preg_match('[<|>]', $test))
{
return $data;
}
if(!isset($config) || empty($config))
{
set_include_path(NUKE_BASE_DIR. get_include_path() );
require_once(NUKE_VENDOR_DIR.'ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php');
require_once(NUKE_VENDOR_DIR.'ezyang/htmlpurifier/library/HTMLPurifier.autoload.php');
$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
if(!is_god($admin) || (is_god($admin) && !$html_auth))
{
$config->set('HTML.Trusted', true);
$config->set('HTML.SafeObject', true);
$config->set('HTML.SafeEmbed', true);
$config->set('HTML.AllowedAttributes','img@height,img@width,img@src,iframe@src,iframe@allowfullscreen');
$config->set('HTML.AllowedAttributes', 'src, height, width, alt');
$config->set('HTML.AllowedElements', ['img', 'iframe', 'div', 'script', 'object', 'p', 'span', 'pre', 'b', 'i', 'u', 'strong', 'em', 'sup', 'a', 'img', 'table', 'tr', 'td', 'tbody', 'thead', 'param']);
$config->set('Output.FlashCompat', true);
$config->set('Attr.EnableID', true);
$config->set('Filter.Custom', [new HTMLPurifier_Filter_YouTube()]);
}
$def = $config->getHTMLDefinition(true);
$def->addAttribute('iframe', 'allowfullscreen', 'Bool');
$purifier = new HTMLPurifier($config);
}
# Loop through the data
foreach ($data as $k => $v) {
# If its an array
if (is_array($data[$k])) {
# Go though this function again
$data[$k] = array_map('deepStrip', $data[$k]);
} elseif (is_numeric($v) || empty($v)) {
$data[$k] = $v;
} else {
if (isset($_GET['op']) && $_GET['op'] == 'Configure' && isset($_GET['sub']) && $_GET['sub'] == '11') {
$data[$k] = $v;
continue;
} elseif ($k == 'xsitename' || $k == 'xslogan') {
$data[$k] = $v;
continue;
} elseif (isset($_GET['name'])) {
# If forum post let it pass to the forum html security
if ($_GET['name'] == 'Forums' && (isset($_GET['file']) && ($_GET['file'] == 'posting')) && ($k == 'message' || $k == 'subject')) {
$data[$k] = $v;
continue;
}
# If PM let it pass to the forum html security
if ($_GET['name'] == 'Private_Messages' && ($k == 'message' || $k == 'subject')) {
$data[$k] = $v;
continue;
}
# If SIG let it pass to the forum html security
if ($_GET['name'] == 'Profile' && (isset($_GET['mode']) && ($_GET['mode'] == 'signature')) && $k == 'signature') {
$data[$k] = $v;
continue;
}
}
# If its a strip lets purify it
if (!is_god($admin) || (is_god($admin) && !$html_auth)) {
$data[$k] = $purifier->purify($v);
}
$data[$k] = str_replace('\n', "\n", (string) $data[$k]);
# Get the registered globals also
global ${$k};
if (isset(${$k}) && !empty(${$k})) {
${$k} = $data[$k];
}
}
}
return $data;
}
var_dump($test);
string(20) “论坛,viewtopic,284” string(20) “论坛,viewtopic,284”
答:
0赞
Ernest Allen Buffington
12/20/2022
#1
若要删除警告,必须更改以下内容:
从:
$test = implode(',', $data);
自:
$test = json_encode($data);
同时更改不正确的语法:
从:
if(!preg_match('[<|>]', $test))
{
return $data;
}
自:
if(!preg_match('/[<|>]/', $test))
{
return $data;
}
1赞
danialk
12/25/2022
#2
在 PHP 8 中,当被内爆的数组嵌套时,会出现警告。从文档中,参数应该是字符串数组,而不是数组数组。$array
例如,以下代码在 PHP 7.4 和 PHP 8.1 中均未产生警告:
$data = ["a", "b"];
print(implode(" ", $data));
而下面给出了警告(注意第一个数组中的数组):Array to string conversion
$data = ["a", "b" => ["c"], "d" => ["e"]];
print(implode(" ", $data));
您可以使用 docker 和不同的 PHP 版本验证行为:
docker run --rm php:7.4 -r 'print(implode(" ", ["a", "b" => ["c"], "d" => ["e"]]));'
docker run --rm php:8.1 -r 'print(implode(" ", ["a", "b" => ["c"], "d" => ["e"]]));'
两者都产生输出:
a Array Array
但是 PHP 8 现在会发出警告:
Warning: Array to string conversion in Command line code on line 1
评论