[!!!][TASK] Remove magic quote handling from $_GET / $_POST 06/41206/5
authorBenjamin Mack <benni@typo3.org>
Tue, 14 Jul 2015 14:24:26 +0000 (16:24 +0200)
committerSusanne Moog <typo3@susannemoog.de>
Fri, 7 Aug 2015 08:46:38 +0000 (10:46 +0200)
The magic quote functionality was removed with PHP 5.4.0.
In previous PHP versions this was a switch to turn on/off adding
slashes to the _GET and _POST superglobals.

TYPO3 however was always adding slashes at every request
and using GeneralUtility::_GP() etc. to remove the slashes again.

As the PHP functionality is now removed, meaning there are no
slashes added at all, TYPO3 can now use the non-slashed data
inside the superglobals directly.

Resolves: #68128
Releases: master
Change-Id: I173732b62feeab55e13162a48aec52099f188f0d
Reviewed-on: http://review.typo3.org/41206
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Susanne Moog <typo3@susannemoog.de>
Tested-by: Susanne Moog <typo3@susannemoog.de>
typo3/sysext/core/Classes/Core/SystemEnvironmentBuilder.php
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-68128-GeneralUtilitySlash-relatedMethods.rst [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Important-68128-PHPMagicQuoteHandlingRemoved.rst [new file with mode: 0644]
typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php
typo3/sysext/felogin/Tests/Unit/Controller/FrontendLoginControllerTest.php
typo3/sysext/frontend/Tests/Unit/Page/PageGeneratorTest.php

index f9ea553..f61e48d 100644 (file)
@@ -71,7 +71,6 @@ class SystemEnvironmentBuilder {
                self::defineBaseConstants();
                self::definePaths($relativePathPart);
                self::checkMainPathsExist();
-               self::handleMagicQuotesGpc();
                self::initializeGlobalVariables();
                self::initializeGlobalTimeTrackingVariables();
                self::initializeBasicErrorReporting();
@@ -191,20 +190,6 @@ class SystemEnvironmentBuilder {
        }
 
        /**
-        * Compatibility layer for magic quotes
-        *
-        * @return void
-        */
-       static protected function handleMagicQuotesGpc() {
-               if (!get_magic_quotes_gpc()) {
-                       GeneralUtility::addSlashesOnArray($_GET);
-                       GeneralUtility::addSlashesOnArray($_POST);
-                       $GLOBALS['HTTP_GET_VARS'] = $_GET;
-                       $GLOBALS['HTTP_POST_VARS'] = $_POST;
-               }
-       }
-
-       /**
         * Set up / initialize several globals variables
         *
         * @return void
index 58b98d7..dc79438 100755 (executable)
@@ -119,12 +119,13 @@ class GeneralUtility {
         * But the clean solution is that quotes are never escaped and that is what the functions below offers.
         * Eventually TYPO3 should provide this in the global space as well.
         * In the transitional phase (or forever..?) we need to encourage EVERY to read and write GET/POST vars through the API functions below.
+        * This functionality was previously needed to normalize between magic quotes logic, which was removed from PHP 5.4,
+        * so these methods are still in use, but not tackle the slash problem anymore.
         *
         *************************/
        /**
         * Returns the 'GLOBAL' value of incoming data from POST or GET, with priority to POST (that is equalent to 'GP' order)
-        * Strips slashes from all output, both strings and arrays.
-        * To enhancement security in your scripts, please consider using \TYPO3\CMS\Core\Utility\GeneralUtility::_GET or \TYPO3\CMS\Core\Utility\GeneralUtility::_POST if you already
+        * To enhance security in your scripts, please consider using GeneralUtility::_GET or GeneralUtility::_POST if you already
         * know by which method your data is arriving to the scripts!
         *
         * @param string $var GET/POST var to return
@@ -135,12 +136,9 @@ class GeneralUtility {
                        return;
                }
                $value = isset($_POST[$var]) ? $_POST[$var] : $_GET[$var];
-               if (isset($value)) {
-                       if (is_array($value)) {
-                               self::stripSlashesOnArray($value);
-                       } else {
-                               $value = stripslashes($value);
-                       }
+               // This is there for backwards-compatibility, in order to avoid NULL
+               if (isset($value) && !is_array($value)) {
+                       $value = (string)$value;
                }
                return $value;
        }
@@ -156,13 +154,13 @@ class GeneralUtility {
                $getParameter = isset($_GET[$parameter]) && is_array($_GET[$parameter]) ? $_GET[$parameter] : array();
                $mergedParameters = $getParameter;
                ArrayUtility::mergeRecursiveWithOverrule($mergedParameters, $postParameter);
-               self::stripSlashesOnArray($mergedParameters);
                return $mergedParameters;
        }
 
        /**
         * Returns the global $_GET array (or value from) normalized to contain un-escaped values.
         * ALWAYS use this API function to acquire the GET variables!
+        * This function was previously used to normalize between magic quotes logic, which was removed from PHP 5.5
         *
         * @param string $var Optional pointer to value in GET array (basically name of GET var)
         * @return mixed If $var is set it returns the value of $_GET[$var]. If $var is NULL (default), returns $_GET itself. In any case *slashes are stipped from the output!*
@@ -170,13 +168,9 @@ class GeneralUtility {
         */
        static public function _GET($var = NULL) {
                $value = $var === NULL ? $_GET : (empty($var) ? NULL : $_GET[$var]);
-               // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
-               if (isset($value)) {
-                       if (is_array($value)) {
-                               self::stripSlashesOnArray($value);
-                       } else {
-                               $value = stripslashes($value);
-                       }
+               // This is there for backwards-compatibility, in order to avoid NULL
+               if (isset($value) && !is_array($value)) {
+                       $value = (string)$value;
                }
                return $value;
        }
@@ -191,13 +185,9 @@ class GeneralUtility {
         */
        static public function _POST($var = NULL) {
                $value = $var === NULL ? $_POST : (empty($var) ? NULL : $_POST[$var]);
-               // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
-               if (isset($value)) {
-                       if (is_array($value)) {
-                               self::stripSlashesOnArray($value);
-                       } else {
-                               $value = stripslashes($value);
-                       }
+               // This is there for backwards-compatibility, in order to avoid NULL
+               if (isset($value) && !is_array($value)) {
+                       $value = (string)$value;
                }
                return $value;
        }
@@ -210,13 +200,6 @@ class GeneralUtility {
         * @return void
         */
        static public function _GETset($inputGet, $key = '') {
-               // Adds slashes since TYPO3 standard currently is that slashes
-               // must be applied (regardless of magic_quotes setting)
-               if (is_array($inputGet)) {
-                       self::addSlashesOnArray($inputGet);
-               } else {
-                       $inputGet = addslashes($inputGet);
-               }
                if ($key != '') {
                        if (strpos($key, '|') !== FALSE) {
                                $pieces = explode('|', $key);
@@ -1621,9 +1604,11 @@ class GeneralUtility {
         * Twin-function to stripSlashesOnArray
         *
         * @param array $theArray Multidimensional input array, (REFERENCE!)
+        * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
         * @return array
         */
        static public function addSlashesOnArray(array &$theArray) {
+               self::logDeprecatedFunction();
                foreach ($theArray as &$value) {
                        if (is_array($value)) {
                                self::addSlashesOnArray($value);
@@ -1642,6 +1627,7 @@ class GeneralUtility {
         * Twin-function to addSlashesOnArray
         *
         * @param array $theArray Multidimensional input array, (REFERENCE!)
+        * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
         * @return array
         */
        static public function stripSlashesOnArray(array &$theArray) {
@@ -1662,8 +1648,10 @@ class GeneralUtility {
         * @param array $arr Multidimensional input array
         * @param string $cmd "add" or "strip", depending on usage you wish.
         * @return array
+        * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
         */
        static public function slashArray(array $arr, $cmd) {
+               self::logDeprecatedFunction();
                if ($cmd == 'strip') {
                        self::stripSlashesOnArray($arr);
                }
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-68128-GeneralUtilitySlash-relatedMethods.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-68128-GeneralUtilitySlash-relatedMethods.rst
new file mode 100644 (file)
index 0000000..9e7199f
--- /dev/null
@@ -0,0 +1,26 @@
+==========================================================
+Deprecation: #68128 - GeneralUtility slash-related methods
+==========================================================
+
+Description
+===========
+
+The following methods within GeneralUtility used to add or remove slashes have been marked as deprecated.
+
+.. code-block:: php
+
+       GeneralUtility::addSlashesOnArray()
+       GeneralUtility::stripSlashesOnArray()
+       GeneralUtility::slashArray()
+
+
+Impact
+======
+
+Any usage of these methods will throw a deprecation warning.
+
+
+Affected Installations
+======================
+
+Extensions that call these PHP methods directly.
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Important-68128-PHPMagicQuoteHandlingRemoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Important-68128-PHPMagicQuoteHandlingRemoved.rst
new file mode 100644 (file)
index 0000000..f1c8dc6
--- /dev/null
@@ -0,0 +1,12 @@
+====================================================
+Important: #68128 - PHP Magic Quote Handling removed
+====================================================
+
+Description
+===========
+
+In PHP versions prior to PHP 5.4 the option of adding slashes (magic quotes) to the superglobals ``$_GET`` and ``$_POST`` was causing inconsistent data handling. TYPO3 has therefore always added slashes to these variables
+on every request to streamline the handling of the superglobals. The corresponding methods ``GeneralUtility::_GET()``, ``GeneralUtility::_GP()`` and ``GeneralUtility::_POST()`` have been changed to not strip off slashes anymore.
+
+Since the PHP option was completely removed, TYPO3 is not adding slashes anymore, and also does not strip
+the slashes anymore when using the methods within GeneralUtility.
index e28a660..df561bf 100644 (file)
@@ -87,14 +87,14 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
                return array(
                        'No key parameter' => array(NULL, array(), array(), NULL),
                        'Key not found' => array('cake', array(), array(), NULL),
-                       'Value only in GET' => array('cake', array('cake' => 'li\\e'), array(), 'lie'),
-                       'Value only in POST' => array('cake', array(), array('cake' => 'l\\ie'), 'lie'),
-                       'Value from POST preferred over GET' => array('cake', array('cake' => 'is a'), array('cake' => '\\lie'), 'lie'),
+                       'Value only in GET' => array('cake', array('cake' => 'li\\e'), array(), 'li\\e'),
+                       'Value only in POST' => array('cake', array(), array('cake' => 'l\\ie'), 'l\\ie'),
+                       'Value from POST preferred over GET' => array('cake', array('cake' => 'is a'), array('cake' => '\\lie'), '\\lie'),
                        'Value can be an array' => array(
                                'cake',
                                array('cake' => array('is a' => 'l\\ie')),
                                array(),
-                               array('is a' => 'lie')
+                               array('is a' => 'l\\ie')
                        )
                );
        }
@@ -143,9 +143,9 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
        public function getAndPostDataProvider() {
                return array(
                        'Requested input data doesn\'t exist' => array('cake', array(), NULL),
-                       'No key will return entire input data' => array(NULL, array('cake' => 'l\\ie'), array('cake' => 'lie')),
-                       'Can retrieve specific input' => array('cake', array('cake' => 'li\\e', 'foo'), 'lie'),
-                       'Can retrieve nested input data' => array('cake', array('cake' => array('is a' => 'l\\ie')), array('is a' => 'lie'))
+                       'No key will return entire input data' => array(NULL, array('cake' => 'l\\ie'), array('cake' => 'l\\ie')),
+                       'Can retrieve specific input' => array('cake', array('cake' => 'l\\ie', 'foo'), 'l\\ie'),
+                       'Can retrieve nested input data' => array('cake', array('cake' => array('is a' => 'l\\ie')), array('is a' => 'l\\ie'))
                );
        }
 
@@ -188,7 +188,7 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
        public function getSetDataProvider() {
                return array(
                        'No input data used without target key' => array(NULL, NULL, array()),
-                       'No input data used with target key' => array(NULL, 'cake', array('cake' => '')),
+                       'No input data used with target key' => array('', 'cake', array('cake' => '')),
                        'No target key used with string input data' => array('data', NULL, array()),
                        'No target key used with array input data' => array(array('cake' => 'lie'), NULL, array('cake' => 'lie')),
                        'Target key and string input data' => array('lie', 'cake', array('cake' => 'lie')),
index af7ed56..518e4f5 100644 (file)
@@ -355,7 +355,7 @@ class FrontendLoginControllerTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
                        'url params are encoded' => array(
                                array('tx_ext1' => 'param with spaces and \\ %<>& /'),
                                'L,tx_ext1',
-                               '&tx_ext1=param%20with%20spaces%20and%20%20%25%3C%3E%26%20%2F'
+                               '&tx_ext1=param%20with%20spaces%20and%20%5C%20%25%3C%3E%26%20%2F'
                        ),
                );
        }
index aa63f5b..226526e 100644 (file)
@@ -270,7 +270,7 @@ class PageGeneratorTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
                        'word with regex chars' => array(
                                array('A \\ word with / a bunch of [] regex () chars .*'),
                                FALSE,
-                               'A  word with \\/ a bunch of \\[\\] regex \\(\\) chars \\.\\*',
+                               'A \\\\ word with \\/ a bunch of \\[\\] regex \\(\\) chars \\.\\*',
                        ),
                );
        }