-
Notifications
You must be signed in to change notification settings - Fork 71
Description
When TPropertyValue was written, it was PHP4/5. Things have changed. Standard PHP arrays are not "array()" but "[]".
So I propose that TPropertyValue::ensureArray be tweaked for the [newer] versions (7 & 8) of PHP format of array "[...]"
public static function ensureArray($value): array
{
if (is_string($value)) {
$value = trim($value);
$len = strlen($value);
if ($len >= 2 && $value[0] == '(' && $value[$len - 1] == ')') {
return eval('return array' . $value . ';');
} if ($len >= 2 && $value[0] == '[' && $value[$len - 1] == ']') {
return eval('return ' . $value . ';');
} else {
return $len > 0 ? [$value] : [];
}
} else {
return (array) $value;
}
}
Also, because Arrays are created by eval(), Using this function to create an array from user input could be a security risk. While that is not a typical use case, it is possible.
To reduce the security footprint of this function, I propose checking the input string for "Prado::" and not performing the eval if it's there. This is a data scrubbing function, not an "execute system routines" function.
An array string of "(Prado::getApplication()->getModule-('aModule')->flushDatabase())" might do something bad, so limiting the array eval to not access "Prado::" may be wise. For security purposes, I propose the following:
public static function ensureArray($value): array
{
if (is_string($value)) {
$value = trim($value);
$len = strlen($value);
if ($len >= 2 && $value[0] == '(' && $value[$len - 1] == ')' && stripos($value, "Prado::") === false) {
return eval('return array' . $value . ';');
} if ($len >= 2 && $value[0] == '[' && $value[$len - 1] == ']' && stripos($value, "Prado::") === false) {
return eval('return ' . $value . ';');
} else {
return $len > 0 ? [$value] : [];
}
} else {
return (array) $value;
}
}
Unit tests are needed, phpdoc would need updated as well. TPropertyValue has no unit tests. I have them written. But not for this, not yet.