[TASK] Properly escape all form attributes in SetupModuleController 81/47181/3
authorStefan Neufeind <typo3.neufeind@speedpartner.de>
Fri, 20 Nov 2015 14:34:35 +0000 (15:34 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Tue, 1 Nov 2016 10:01:10 +0000 (11:01 +0100)
Change-Id: Ia208202e440992e7cf6a21639b83f84205fc2606
Resolves: #69062
Releases: master, 7.6
Reviewed-on: https://review.typo3.org/47181
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Stephan GroƟberndt <stephan@grossberndt.de>
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Reviewed-by: Joerg Boesche <typo3@joergboesche.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/setup/Classes/Controller/SetupModuleController.php
typo3/sysext/setup/Resources/Private/Language/locallang.xlf

index c5cd689..1984435 100644 (file)
@@ -148,9 +148,9 @@ class SetupModuleController extends AbstractModule
     protected $simulateSelector = '';
 
     /**
-     * @var string
+     * @var int
      */
-    protected $simUser = '';
+    protected $simUser;
 
     /**
      * The name of the module
@@ -396,8 +396,8 @@ class SetupModuleController extends AbstractModule
         $this->content .= $this->moduleTemplate->getDynamicTabMenu($menuItems, 'user-setup', 1, false, false);
         $formToken = $this->formProtection->generateToken('BE user setup', 'edit');
         $this->content .= '<div>';
-        $this->content .= '<input type="hidden" name="simUser" value="' . $this->simUser . '" />
-            <input type="hidden" name="formToken" value="' . $formToken . '" />
+        $this->content .= '<input type="hidden" name="simUser" value="' . (int)$this->simUser . '" />
+            <input type="hidden" name="formToken" value="' . htmlspecialchars($formToken) . '" />
             <input type="hidden" value="1" name="data[save]" />
             <input type="hidden" name="data[setValuesToDefault]" value="0" id="setValuesToDefault" />';
         $this->content .= '</div>';
@@ -518,11 +518,11 @@ class SetupModuleController extends AbstractModule
             }
             $more = '';
             if ($class) {
-                $more .= ' class="' . $class . '"';
+                $more .= ' class="' . htmlspecialchars($class) . '"';
             }
             $style = $config['style'];
             if ($style) {
-                $more .= ' style="' . $style . '"';
+                $more .= ' style="' . htmlspecialchars($style) . '"';
             }
             if (isset($this->overrideConf[$fieldName])) {
                 $more .= ' disabled="disabled"';
@@ -546,18 +546,18 @@ class SetupModuleController extends AbstractModule
                         $noAutocomplete = 'autocomplete="off" ';
                         $more .= ' data-rsa-encryption=""';
                     }
-                    $html = '<input id="field_' . $fieldName . '"
-                        type="' . $type . '"
-                        name="data' . $dataAdd . '[' . $fieldName . ']" ' .
+                    $html = '<input id="field_' . htmlspecialchars($fieldName) . '"
+                        type="' . htmlspecialchars($type) . '"
+                        name="data' . $dataAdd . '[' . htmlspecialchars($fieldName) . ']" ' .
                         $noAutocomplete .
                         'value="' . htmlspecialchars($value) . '" ' .
                         $more .
                         ' />';
                     break;
                 case 'check':
-                    $html = $label . '<div class="checkbox"><label><input id="field_' . $fieldName . '"
+                    $html = $label . '<div class="checkbox"><label><input id="field_' . htmlspecialchars($fieldName) . '"
                         type="checkbox"
-                        name="data' . $dataAdd . '[' . $fieldName . ']"' .
+                        name="data' . $dataAdd . '[' . htmlspecialchars($fieldName) . ']"' .
                         ($value ? ' checked="checked"' : '') .
                         $more .
                         ' /></label></div>';
@@ -567,11 +567,11 @@ class SetupModuleController extends AbstractModule
                     if ($config['itemsProcFunc']) {
                         $html = GeneralUtility::callUserFunction($config['itemsProcFunc'], $config, $this, '');
                     } else {
-                        $html = '<select id="field_' . $fieldName . '"
-                            name="data' . $dataAdd . '[' . $fieldName . ']"' .
+                        $html = '<select id="field_' . htmlspecialchars($fieldName) . '"
+                            name="data' . $dataAdd . '[' . htmlspecialchars($fieldName) . ']"' .
                             $more . '>' . LF;
                         foreach ($config['items'] as $key => $optionLabel) {
-                            $html .= '<option value="' . $key . '"' . ($value == $key ? ' selected="selected"' : '') . '>' . $this->getLabel($optionLabel, '', false) . '</option>' . LF;
+                            $html .= '<option value="' . htmlspecialchars($key) . '"' . ($value == $key ? ' selected="selected"' : '') . '>' . $this->getLabel($optionLabel, '', false) . '</option>' . LF;
                         }
                         $html .= '</select>';
                     }
@@ -621,7 +621,7 @@ class SetupModuleController extends AbstractModule
                     }
                     $html .= '<input id="field_' . htmlspecialchars($fieldName) . '" type="hidden" ' .
                             'name="data' . $dataAdd . '[' . htmlspecialchars($fieldName) . ']"' . $more .
-                            ' value="' . $avatarFileUid . '" />';
+                            ' value="' . (int)$avatarFileUid . '" />';
 
                     $html .= '<div class="btn-group">';
                     if ($avatarFileUid) {
@@ -754,8 +754,8 @@ class SetupModuleController extends AbstractModule
             $users = BackendUtility::getUserNames('username,usergroup,usergroup_cached_list,uid,realName', $where);
             $opt = [];
             foreach ($users as $rr) {
-                $label = htmlspecialchars(($rr['username'] . ($rr['realName'] ? ' (' . $rr['realName'] . ')' : '')));
-                $opt[] = '<option value="' . $rr['uid'] . '"' . ($this->simUser == $rr['uid'] ? ' selected="selected"' : '') . '>' . $label . '</option>';
+                $label = $rr['username'] . ($rr['realName'] ? ' (' . $rr['realName'] . ')' : '');
+                $opt[] = '<option value="' . (int)$rr['uid'] . '"' . ($this->simUser === (int)$rr['uid'] ? ' selected="selected"' : '') . '>' . htmlspecialchars($label) . '</option>';
             }
             if (!empty($opt)) {
                 $this->simulateSelector = '<select id="field_simulate" class="form-control" name="simulateUser" onchange="window.location.href=' . GeneralUtility::quoteJSvalue(BackendUtility::getModuleUrl('user_setup') . '&simUser=') . '+this.options[this.selectedIndex].value;"><option></option>' . implode('', $opt) . '</select>';
@@ -832,7 +832,7 @@ class SetupModuleController extends AbstractModule
     protected function getLabel($str, $key = '', $addLabelTag = true)
     {
         if (substr($str, 0, 4) === 'LLL:') {
-            $out = $this->getLanguageService()->sL($str);
+            $out = htmlspecialchars($this->getLanguageService()->sL($str));
         } else {
             $out = htmlspecialchars($str);
         }
@@ -840,7 +840,7 @@ class SetupModuleController extends AbstractModule
             $out = '<span style="color:#999999">' . $out . '</span>';
         }
         if ($addLabelTag) {
-            $out = '<label for="' . ($altLabelTagId ?: 'field_' . $key) . '">' . $out . '</label>';
+            $out = '<label for="' . ($altLabelTagId ?: 'field_' . htmlspecialchars($key)) . '">' . $out . '</label>';
         }
         return $out;
     }
@@ -951,8 +951,8 @@ class SetupModuleController extends AbstractModule
 
                 // Create new file reference
                 $storeRec['sys_file_reference']['NEW1234'] = [
-                    'uid_local' => $fileUid,
-                    'uid_foreign' => $beUserId,
+                    'uid_local' => (int)$fileUid,
+                    'uid_foreign' => (int)$beUserId,
                     'tablenames' => 'be_users',
                     'fieldname' => 'avatar',
                     'pid' => 0,
index 017f1fc..c81a616 100644 (file)
                                <source>Show Thumbnails by default</source>
                        </trans-unit>
                        <trans-unit id="condensedMode">
-                               <source>Use condensed mode in backend&lt;br /&gt;(for small screens)</source>
+                               <source>Use condensed mode in backend (for small screens)</source>
                        </trans-unit>
                        <trans-unit id="noMenuMode">
                                <source>Select navigation mode</source>
                                <source>Start up in the following module</source>
                        </trans-unit>
                        <trans-unit id="emailMeAtLogin">
-                               <source>Notify me by email, when somebody logs in &lt;br /&gt;from my account</source>
+                               <source>Notify me by email when somebody logs in from my account</source>
                        </trans-unit>
                        <trans-unit id="helpText">
                                <source>Show help text when applicable</source>
                                <source>Make Textareas flexible</source>
                        </trans-unit>
                        <trans-unit id="editFunctionsTab">
-                               <source>Edit &amp; Advanced functions</source>
+                               <source>Edit and Advanced functions</source>
                        </trans-unit>
                        <trans-unit id="edit_functions">
                                <source>Edit</source>
                                <source>Advanced functions</source>
                        </trans-unit>
                        <trans-unit id="copyLevels">
-                               <source>&lt;b&gt;Recursive Copy:&lt;/b&gt; Enter the number of page&lt;br /&gt;sublevels to include, when a page is copied</source>
+                               <source>Recursive Copy: Enter the number of page sublevels to include, when a page is copied</source>
                        </trans-unit>
                        <trans-unit id="recursiveDelete">
-                               <source>&lt;b&gt;Recursive Delete(!):&lt;/b&gt; Allow ALL subpages&lt;br /&gt;to be deleted when deleting a page</source>
+                               <source>Recursive Delete(!): Allow ALL subpages to be deleted when deleting a page</source>
                        </trans-unit>
                        <trans-unit id="activateChanges">
                                <source>Notice! In order to activate most of these changes, please reload the backend (eg. logout and login again).</source>