[!!!][TASK] Remove Frontend Track User functionality 40/60840/4
authorBenni Mack <benni@typo3.org>
Wed, 29 May 2019 19:51:37 +0000 (21:51 +0200)
committerAndreas Fernandez <a.fernandez@scripting-base.de>
Thu, 30 May 2019 18:34:13 +0000 (20:34 +0200)
The functionality "ftu" ("Frontend Track User"), which allows
to send the session through GET parameter within the site
has been removed.

It was used to hand in a session via `config.ftu = 1` and
the GET parameter "ftu=a-32-character-string", which then
started a session which was added to any link generated.

This way, sessions could _have_ been transferred across
domains but only if cookies would not be activated by
the browser, which is unreliable.

In order to pave the way to modern standards (OTP
or JWT), this functionality is removed, as the ftu functionality
has some flaws, conceptually and security wise.

Removed public properties
* AbstractUserAuthentication->get_name
* AbstractUserAuthentication->getFallBack
* AbstractUserAuthentication->getMethodEnabled
* AbstractUserAuthentication->get_URL_ID
* TypoScriptFrontendController->getMethodUrlIdToken

Removed TypoScript:
* config.ftu = 1

Removed TYPO3_CONF_VARS
* $TYPO3_CONF_VARS[FE][get_url_id_token]

GET Parameter "ftu" has no special meaning anymore.

Resolves: #88458
Releases: master
Change-Id: I664be44228b2180909f6abfda8acfcd5fe36aa5a
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/60840
Tested-by: Markus Klein <markus.klein@typo3.org>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
12 files changed:
typo3/sysext/core/Classes/Authentication/AbstractUserAuthentication.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Configuration/DefaultConfigurationDescription.yaml
typo3/sysext/core/Documentation/Changelog/master/Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Authentication/FrontendUserAuthentication.php
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/frontend/Classes/Page/CacheHashCalculator.php
typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php
typo3/sysext/install/Configuration/ExtensionScanner/Php/ArrayDimensionMatcher.php
typo3/sysext/install/Configuration/ExtensionScanner/Php/PropertyPublicMatcher.php
typo3/sysext/t3editor/Resources/Private/tsref.xml
typo3/sysext/t3editor/Resources/Public/JavaScript/Mode/typoscript/typoscript.js

index f665b23..3e84d05 100644 (file)
@@ -54,12 +54,6 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
     public $name = '';
 
     /**
-     * Session/GET-var name
-     * @var string
-     */
-    public $get_name = '';
-
-    /**
      * Table in database with user data
      * @var string
      */
@@ -198,14 +192,6 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
     public $sendNoCacheHeaders = true;
 
     /**
-     * If this is set, authentication is also accepted by $_GET.
-     * Notice that the identification is NOT 128bit MD5 hash but reduced.
-     * This is done in order to minimize the size for mobile-devices, such as WAP-phones
-     * @var bool
-     */
-    public $getFallBack = false;
-
-    /**
      * The ident-hash is normally 32 characters and should be!
      * But if you are making sites for WAP-devices or other low-bandwidth stuff,
      * you may shorten the length.
@@ -216,13 +202,6 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
     public $hash_length = 32;
 
     /**
-     * Setting this flag TRUE lets user-authentication happen from GET_VARS if
-     * POST_VARS are not set. Thus you may supply username/password with the URL.
-     * @var bool
-     */
-    public $getMethodEnabled = false;
-
-    /**
      * If set to 4, the session will be locked to the user's IP address (all four numbers).
      * Reducing this to 1-3 means that only the given number of parts of the IP address is used.
      * @var int
@@ -284,14 +263,6 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
     public $user;
 
     /**
-     * Will be added to the url (eg. '&login=ab7ef8d...')
-     * GET-auth-var if getFallBack is TRUE. Should be inserted in links!
-     * @var string
-     * @internal
-     */
-    public $get_URL_ID = '';
-
-    /**
      * Will be set to TRUE if a new session ID was created
      * @var bool
      */
@@ -371,22 +342,11 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
             throw new Exception('No loginType defined, should be set explicitly by subclass', 1476045345);
         }
         $this->logger->debug('## Beginning of auth logging.');
-        // Init vars.
-        $mode = '';
         $this->newSessionID = false;
-        // $id is set to ses_id if cookie is present. Else set to FALSE, which will start a new session
+        // $id is set to ses_id if cookie is present. Otherwise a new session will start
         $id = $this->getCookie($this->name);
         $this->svConfig = $GLOBALS['TYPO3_CONF_VARS']['SVCONF']['auth'] ?? [];
 
-        // If fallback to get mode....
-        if (!$id && $this->getFallBack && $this->get_name) {
-            $id = isset($_GET[$this->get_name]) ? GeneralUtility::_GET($this->get_name) : '';
-            if (strlen($id) != $this->hash_length) {
-                $id = '';
-            }
-            $mode = 'get';
-        }
-
         // If new session or client tries to fix session...
         if (!$id || !$this->isExistingSessionRecord($id)) {
             // New random session-$id is made
@@ -396,10 +356,7 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
         }
         // Internal var 'id' is set
         $this->id = $id;
-        // If fallback to get mode....
-        if ($mode === 'get' && $this->getFallBack && $this->get_name) {
-            $this->get_URL_ID = '&' . $this->get_name . '=' . $id;
-        }
+
         // Make certain that NO user is set initially
         $this->user = null;
         // Set all possible headers that could ensure that the script is not cached on the client-side
@@ -1302,15 +1259,11 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
      */
     public function getLoginFormData()
     {
-        $loginData = [];
-        $loginData['status'] = GeneralUtility::_GP($this->formfield_status);
-        if ($this->getMethodEnabled) {
-            $loginData['uname'] = GeneralUtility::_GP($this->formfield_uname);
-            $loginData['uident'] = GeneralUtility::_GP($this->formfield_uident);
-        } else {
-            $loginData['uname'] = GeneralUtility::_POST($this->formfield_uname);
-            $loginData['uident'] = GeneralUtility::_POST($this->formfield_uident);
-        }
+        $loginData = [
+            'status' => GeneralUtility::_GP($this->formfield_status),
+            'uname'  => GeneralUtility::_POST($this->formfield_uname),
+            'uident' => GeneralUtility::_POST($this->formfield_uident)
+        ];
         // Only process the login data if a login is requested
         if ($loginData['status'] === LoginType::LOGIN) {
             $loginData = $this->processLoginData($loginData);
index 62829a5..dde3a2b 100644 (file)
@@ -1279,7 +1279,6 @@ return [
         'IPmaskMountGroups' => [ // This allows you to specify an array of IPmaskLists/fe_group-uids. If the REMOTE_ADDR of the user matches an IPmaskList,
             // array('IPmaskList_1','fe_group uid'), array('IPmaskList_2','fe_group uid')
         ],
-        'get_url_id_token' => '#get_URL_ID_TOK#',
         'enable_mount_pids' => true,
         'hidePagesIfNotTranslatedByDefault' => false,
         'eID_include' => [], // Array of key/value pairs where key is "tx_[ext]_[optional suffix]" and value is relative filename of class to include. Key is used as "?eID=" for \TYPO3\CMS\Frontend\Http\RequestHandlerRequestHandler to include the code file which renders the page from that point. (Useful for functionality that requires a low initialization footprint, eg. frontend ajax applications)
index 1f46ea8..1969a3c 100644 (file)
@@ -433,9 +433,6 @@ FE:
         additionalAbsRefPrefixDirectories:
             type: text
             description: 'Enter additional directories to be prepended with absRefPrefix. Directories must be comma-separated. TYPO3 already prepends the following directories: typo3/, typo3temp/, typo3conf/ext/ and all local storages'
-        get_url_id_token:
-            type: text
-            description: 'This is the token, which is substituted in the output code in order to keep a GET-based session going. Normally the GET-session-id is 5 chars (''&amp;ftu='') + hash_length (norm. 10)'
         enable_mount_pids:
             type: bool
             description: 'If enabled, the mount_pid feature allowing ''symlinks'' in the page tree (for frontend operation) is allowed.'
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst
new file mode 100644 (file)
index 0000000..59a04d4
--- /dev/null
@@ -0,0 +1,51 @@
+.. include:: ../../Includes.txt
+
+==================================================================
+Breaking: #88458 - Removed Frontend Track User "ftu" functionality
+==================================================================
+
+See :issue:`88458`
+
+Description
+===========
+
+The "ftu" feature, used to transfer sessions via GET parameter, has been removed.
+
+The implementation and the functionality exposed some security concerns, if enabled via TypoScript
+`config.ftu` as sessions could have been taken over by link sharing, although this was mitigated
+in the past by a security change.
+
+
+Impact
+======
+
+The following public properties now trigger a PHP warning, when accessed:
+* :php:`TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->get_name`
+* :php:`TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->getFallBack`
+* :php:`TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->getMethodEnabled`
+* :php:`TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->get_URL_ID`
+* :php:`TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->getMethodUrlIdToken`
+
+The TypoScript setting :typoscript:`config.ftu` has no effect anymore.
+
+The global configuration setting :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['get_url_id_token']` is not
+set anymore.
+
+
+Affected Installations
+======================
+
+Any TYPO3 installation using the `config.ftu` functionality.
+
+
+Migration
+=========
+
+Remove any usages to the properties or options, and use a custom session handling without
+handing over Session IDs in plaintext via GET parameters. Suggested alternatives for instance are
+JWT payloads or OTP links for starting a session.
+
+For cookie-less session handling, a custom functionality depending on the use-case has to be
+implemented as TYPO3 extension.
+
+.. index:: Frontend, LocalConfiguration, PHP-API, TypoScript, PartiallyScanned
index f3ba30d..fb36868 100644 (file)
@@ -116,7 +116,6 @@ class FrontendUserAuthentication extends AbstractUserAuthentication
         $this->dontSetCookie = true;
 
         $this->name = self::getCookieName();
-        $this->get_name = 'ftu';
         $this->loginType = 'FE';
         $this->user_table = 'fe_users';
         $this->username_column = 'username';
@@ -133,8 +132,6 @@ class FrontendUserAuthentication extends AbstractUserAuthentication
         $this->formfield_uident = 'pass';
         $this->formfield_status = 'logintype';
         $this->sendNoCacheHeaders = false;
-        $this->getFallBack = true;
-        $this->getMethodEnabled = true;
         $this->lockIP = $GLOBALS['TYPO3_CONF_VARS']['FE']['lockIP'];
         $this->checkPid = $GLOBALS['TYPO3_CONF_VARS']['FE']['checkFeUserPid'];
         $this->lifetime = (int)$GLOBALS['TYPO3_CONF_VARS']['FE']['lifetime'];
@@ -219,11 +216,7 @@ class FrontendUserAuthentication extends AbstractUserAuthentication
     {
         $loginData = parent::getLoginFormData();
         if ($GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 0 || $GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 1) {
-            if ($this->getMethodEnabled) {
-                $isPermanent = GeneralUtility::_GP($this->formfield_permanent);
-            } else {
-                $isPermanent = GeneralUtility::_POST($this->formfield_permanent);
-            }
+            $isPermanent = GeneralUtility::_POST($this->formfield_permanent);
             if (strlen($isPermanent) != 1) {
                 $isPermanent = $GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'];
             } elseif (!$isPermanent) {
index 16a4871..0e2d6e5 100644 (file)
@@ -299,16 +299,6 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     public $newHash = '';
 
     /**
-     * If config.ftu (Frontend Track User) is set in TypoScript for the current
-     * page, the string value of this var is substituted in the rendered source-code
-     * with the string, '&ftu=[token...]' which enables GET-method usertracking as
-     * opposed to cookie based
-     * @var string
-     * @internal
-     */
-    public $getMethodUrlIdToken = '';
-
-    /**
      * This flag is set before inclusion of RequestHandler IF no_cache is set. If this
      * flag is set after the inclusion of RequestHandler, no_cache is forced to be set.
      * This is done in order to make sure that php-code from pagegen does not falsely
@@ -1907,7 +1897,6 @@ class TypoScriptFrontendController implements LoggerAwareInterface
 
         // Auto-configure settings when a site is configured
         $this->config['config']['absRefPrefix'] = $this->config['config']['absRefPrefix'] ?? 'auto';
-        $this->setUrlIdToken();
 
         // Hook for postProcessing the configuration array
         $params = ['config' => &$this->config['config']];
@@ -2136,19 +2125,6 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     }
 
     /**
-     * Sets the URL_ID_TOKEN in the internal var, $this->getMethodUrlIdToken
-     * This feature allows sessions to use a GET-parameter instead of a cookie.
-     */
-    protected function setUrlIdToken()
-    {
-        if ($this->config['config']['ftu']) {
-            $this->getMethodUrlIdToken = $GLOBALS['TYPO3_CONF_VARS']['FE']['get_url_id_token'];
-        } else {
-            $this->getMethodUrlIdToken = '';
-        }
-    }
-
-    /**
      * Calculates and sets the internal linkVars based upon the current request parameters
      * and the setting "config.linkVars".
      *
@@ -3051,11 +3027,6 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     {
         $search = [];
         $replace = [];
-        // Substitutes get_URL_ID in case of GET-fallback
-        if ($this->getMethodUrlIdToken) {
-            $search[] = $this->getMethodUrlIdToken;
-            $replace[] = $this->fe_user->get_URL_ID;
-        }
         // Hook for supplying custom search/replace data
         foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['tslib_fe-contentStrReplace'] ?? [] as $_funcRef) {
             $_params = [
index 2c2f134..ab69b17 100644 (file)
@@ -187,7 +187,7 @@ class CacheHashCalculator implements SingletonInterface
      */
     protected function isCoreParameter($key)
     {
-        return $key === 'id' || $key === 'type' || $key === 'no_cache' || $key === 'cHash' || $key === 'MP' || $key === 'ftu';
+        return $key === 'id' || $key === 'type' || $key === 'no_cache' || $key === 'cHash' || $key === 'MP';
     }
 
     /**
index 4e3a3d1..6a8ecde 100644 (file)
@@ -146,6 +146,8 @@ class SilentConfigurationUpgradeService
         'FE/pageNotFound_handling_accessdeniedheader',
         'FE/pageUnavailable_handling',
         'FE/pageUnavailable_handling_statheader',
+        // #88458
+        'FE/get_url_id_token'
     ];
 
     public function __construct(ConfigurationManager $configurationManager = null)
index da2e085..a330408 100644 (file)
@@ -286,4 +286,9 @@ return [
             'Breaking-87936-TCAForSysHistoryRemoved.rst',
         ],
     ],
+    '$GLOBALS[\'TYPO3_CONF_VARS\'][\'FE\'][\'get_url_id_token\']' => [
+        'restFiles' => [
+            'Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst',
+        ],
+    ],
 ];
index 44c2e31..c57e4e7 100644 (file)
@@ -529,4 +529,29 @@ return [
             'Breaking-87511-RemoveViewFormatToObjectNameMapProperty.rst',
         ],
     ],
+    'TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->get_name' => [
+        'restFiles' => [
+            'Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst',
+        ],
+    ],
+    'TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->getFallBack' => [
+        'restFiles' => [
+            'Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst',
+        ],
+    ],
+    'TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->getMethodEnabled' => [
+        'restFiles' => [
+            'Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst',
+        ],
+    ],
+    'TYPO3\CMS\Core\Authentication\AbstractUserAuthentication->get_URL_ID' => [
+        'restFiles' => [
+            'Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst',
+        ],
+    ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->getMethodUrlIdToken' => [
+        'restFiles' => [
+            'Breaking-88458-RemovedFrontendTrackUserFtuFunctionality.rst',
+        ],
+    ],
 ];
index b68a5f8..d603a68 100644 (file)
@@ -379,17 +379,6 @@ Useful if you run a template with special content at - say &type=95 - but still
                        <description><![CDATA[If set, then frontend editing is enabled (requires EXT:frontend_editing being installed).]]></description>
                        <default><![CDATA[false]]></default>
                </property>
-               <property name="ftu" type="boolean">
-                       <description><![CDATA[If set, the "&ftu=...." GET-fallback identification is inserted.
-"&ftu=[hash]" is always inserted in the links on the first page a user hits. If it turns out in the next hit that the user has cookies enabled, this variable is not set anymore as the cookies does the job. If no cookies is accepted the "ftu" remains set for all links on the site and thereby we can still track the user.
-
-You should not set this feature if grabber-spiders like Teleport are going to grab your site!
-You should not set this feature if you want search-engines to index your site.
-
-You can also ignore this feature if you're certain, website users will use cookies.
- "ftu" means fe_typo_user ("fe" is "frontend").]]></description>
-                       <default><![CDATA[false]]></default>
-               </property>
                <property name="headerComment " type="string">
                        <description><![CDATA[The content is added before the "TYPO3 Content Management Framework" comment in the <head> section of the page. Use this to insert a note like that "Programmed by My-Agency" ...]]></description>
                        <default><![CDATA[
index c2cedf6..f19ebd6 100644 (file)
         'forceTypeValue': kw('forceTypeValue'),
         'FORM': kw('FORM'),
         'format': kw('format'),
-        'ftu': kw('ftu'),
         'function': kw('function'),
         'Functions': A,
         'gamma': kw('gamma'),