diff --git a/application/utils.inc.php b/application/utils.inc.php index 52f3bdfbf..71eb20a66 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -52,22 +52,31 @@ class utils { /** * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_INTEGER = 'integer'; /** + * Datamodel class * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.0 + * @since 2.7.10 3.0.4 3.1.1 3.2.0 N°6606 update PHPDoc + * @uses MetaModel::IsValidClass() */ public const ENUM_SANITIZATION_FILTER_CLASS = 'class'; /** * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.4 3.1.1 3.2.0 N°6606 + * @uses class_exists() + */ + public const ENUM_SANITIZATION_FILTER_PHP_CLASS = 'php_class'; + /** + * @var string + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_STRING = 'string'; /** * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_CONTEXT_PARAM = 'context_param'; /** @@ -82,22 +91,22 @@ class utils public const ENUM_SANITIZATION_FILTER_OPERATION = 'operation'; /** * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_PARAMETER = 'parameter'; /** * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_FIELD_NAME = 'field_name'; /** * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_TRANSACTION_ID = 'transaction_id'; /** * @var string For XML / HTML node identifiers - * @since 3.0.0 + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER = 'element_identifier'; /** @@ -107,12 +116,13 @@ class utils public const ENUM_SANITIZATION_FILTER_VARIABLE_NAME = 'variable_name'; /** * @var string - * @since 3.0.0 + * @since 2.7.10 3.0.0 */ public const ENUM_SANITIZATION_FILTER_RAW_DATA = 'raw_data'; /** * @var string - * @since 3.0.2, 3.1.0 N°4899 + * @since 3.0.2 3.1.0 N°4899 + * @since 2.7.10 N°6606 */ public const ENUM_SANITIZATION_FILTER_URL = 'url'; @@ -396,6 +406,10 @@ class utils * @since 2.7.0 new 'element_identifier' filter * @since 3.0.0 new utils::ENUM_SANITIZATION_* const * @since 2.7.7, 3.0.2, 3.1.0 N°4899 - new 'url' filter + * @since 2.7.10 N°6606 use the utils::ENUM_SANITIZATION_* const + * @since 2.7.10 N°6606 new case for ENUM_SANITIZATION_FILTER_PHP_CLASS + * + * @link https://www.php.net/manual/en/filter.filters.sanitize.php PHP sanitization filters */ protected static function Sanitize_Internal($value, $sSanitizationFilter) { @@ -416,6 +430,13 @@ class utils $retValue = filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS); break; + case static::ENUM_SANITIZATION_FILTER_PHP_CLASS: + $retValue = $value; + if (!class_exists($value)) { + $retValue = false; + } + break; + case static::ENUM_SANITIZATION_FILTER_CONTEXT_PARAM: case static::ENUM_SANITIZATION_FILTER_ROUTE: case static::ENUM_SANITIZATION_FILTER_OPERATION: @@ -481,6 +502,7 @@ class utils // For URL case static::ENUM_SANITIZATION_FILTER_URL: + // N°6350 - returns only valid URLs $retValue = filter_var($value, FILTER_VALIDATE_URL); break; diff --git a/pages/ajax.render.php b/pages/ajax.render.php index 7d6a24e5d..2981273ab 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -1030,9 +1030,9 @@ EOF case 'new_dashlet_id': $sDashboardDivId = utils::ReadParam("dashboardid"); $bIsCustomized = true; // Only called at runtime when customizing a dashboard - $iRow = utils::ReadParam("iRow"); - $iCol = utils::ReadParam("iCol"); - $sDashletIdOrig = utils::ReadParam("dashletid"); + $iRow = utils::ReadParam("iRow", 0, false, utils::ENUM_SANITIZATION_FILTER_INTEGER); + $iCol = utils::ReadParam("iCol", 0, false, utils::ENUM_SANITIZATION_FILTER_INTEGER); + $sDashletIdOrig = utils::ReadParam("dashletid", '', false, utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER); $sFinalDashletId = Dashboard::GetDashletUniqueId($bIsCustomized, $sDashboardDivId, $iRow, $iCol, $sDashletIdOrig); $oPage = new AjaxPage(''); $oPage->SetOutputDataOnly(true); @@ -1042,8 +1042,8 @@ EOF case 'new_dashlet': require_once(APPROOT.'application/forms.class.inc.php'); require_once(APPROOT.'application/dashlet.class.inc.php'); - $sDashletClass = utils::ReadParam('dashlet_class', ''); - $sDashletId = utils::ReadParam('dashlet_id', '', false, 'raw_data'); + $sDashletClass = utils::ReadParam('dashlet_class', '', false, utils::ENUM_SANITIZATION_FILTER_PHP_CLASS); + $sDashletId = utils::ReadParam('dashlet_id', '', false, utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER); if (is_subclass_of($sDashletClass, 'Dashlet')) { $oDashlet = new $sDashletClass(new ModelReflectionRuntime(), $sDashletId); $offset = $oPage->start_capture(); @@ -1065,13 +1065,14 @@ EOF case 'update_dashlet_property': require_once(APPROOT.'application/forms.class.inc.php'); require_once(APPROOT.'application/dashlet.class.inc.php'); - $aExtraParams = utils::ReadParam('extra_params', array(), false, 'raw_data'); - $aParams = utils::ReadParam('params', '', false, 'raw_data'); - $sDashletClass = $aParams['attr_dashlet_class']; - $sDashletType = $aParams['attr_dashlet_type']; - $sDashletId = utils::HtmlEntities($aParams['attr_dashlet_id']); - $aUpdatedProperties = $aParams['updated']; // Code of the changed properties as an array: 'attr_xxx', 'attr_xxy', etc... - $aPreviousValues = $aParams['previous_values']; // hash array: 'attr_xxx' => 'old_value' + $aExtraParams = utils::ReadParam('extra_params', array(), false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA); + $aParams = utils::ReadParam('params', [], false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA); // raw_data because we need different filter depending on the options + $sDashletClass = utils::Sanitize($aParams['attr_dashlet_class'], DashletUnknown::class, utils::ENUM_SANITIZATION_FILTER_PHP_CLASS); // Dashlet PHP class or DashletUnknown if impl isn't present in the installed extensions + $sDashletType = utils::Sanitize($aParams['attr_dashlet_type'], '', utils::ENUM_SANITIZATION_FILTER_PHP_CLASS); // original Dashlet PHP class, could be non-existing on the iTop instance (XML definition loading) + $sDashletId = utils::Sanitize($aParams['attr_dashlet_id'], '', utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER); + $aUpdatedProperties = utils::Sanitize($aParams['updated'], [], utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER); // Code of the changed properties as an array: 'attr_xxx', 'attr_xxy' etc + $aPreviousValues = utils::Sanitize($aParams['previous_values'], [], utils::ENUM_SANITIZATION_FILTER_RAW_DATA); // hash array: 'attr_xxx' => 'old_value' - no sanitization as values will be handled in the Dashlet object + if (is_subclass_of($sDashletClass, 'Dashlet')) { /** @var \Dashlet $oDashlet */ $oDashlet = new $sDashletClass(new ModelReflectionRuntime(), $sDashletId);