[SECURITY] Fix several XSS issues 64/45264/2
authorNicole Cordes <typo3@cordes.co>
Tue, 15 Dec 2015 10:33:35 +0000 (11:33 +0100)
committerOliver Hader <oliver.hader@typo3.org>
Tue, 15 Dec 2015 10:33:41 +0000 (11:33 +0100)
Resolves: #59150
Releases: master, 6.2
Security-Commit: 897e553b01145fe2867f362aa8025a71bc620961
Security-Bulletins: TYPO3-CORE-SA-2015-010, 011, 012, 013, 014, 015
Change-Id: I16ef6ad6e7146a9963139d2fa419dbc6ed88b774
Reviewed-on: https://review.typo3.org/45264
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
typo3/sysext/backend/Classes/Controller/EditDocumentController.php
typo3/sysext/backend/Classes/Form/Element/SuggestElement.php
typo3/sysext/backend/Classes/Template/DocumentTemplate.php
typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php
typo3/sysext/rtehtmlarea/Classes/BrowseLinks.php
typo3/sysext/rtehtmlarea/Classes/RteHtmlAreaBase.php
typo3/sysext/rtehtmlarea/Classes/SelectImage.php
typo3/sysext/rtehtmlarea/Classes/User.php

index b3e7628..fc24acf 100644 (file)
@@ -866,7 +866,7 @@ class EditDocumentController {
                                                                $rec = reset($trData->regTableItems_data);
                                                                $rec['uid'] = $cmd == 'new' ? uniqid('NEW', TRUE) : $theUid;
                                                                if ($cmd == 'new') {
-                                                                       $rec['pid'] = $theUid == 'prev' ? $thePrevUid : $theUid;
+                                                                       $rec['pid'] = $theUid == 'prev' ? (int)$thePrevUid : (int)$theUid;
                                                                }
                                                                $this->elementsData[] = array(
                                                                        'table' => $table,
@@ -904,7 +904,7 @@ class EditDocumentController {
                                                                        $panel = $this->tceforms->wrapTotal($panel, $rec, $table);
                                                                        // Setting the pid value for new records:
                                                                        if ($cmd == 'new') {
-                                                                               $panel .= '<input type="hidden" name="data[' . $table . '][' . $rec['uid'] . '][pid]" value="' . $rec['pid'] . '" />';
+                                                                               $panel .= '<input type="hidden" name="data[' . htmlspecialchars($table) . '][' . htmlspecialchars($rec['uid']) . '][pid]" value="' . (int)$rec['pid'] . '" />';
                                                                                $this->newC++;
                                                                        }
                                                                        // Display "is-locked" message:
index d46e6f4..1b422e8 100644 (file)
@@ -109,8 +109,16 @@ class SuggestElement {
                // Replace "-" with ucwords for the JS object name
                $jsObj = str_replace(' ', '', ucwords(str_replace(array('-', '.'), ' ', GeneralUtility::strtolower($suggestId))));
                $this->TCEformsObj->additionalJS_post[] = '
-                       var ' . $jsObj . ' = new TCEForms.Suggest("' . $fieldname . '", "' . $table . '", "' . $field . '", "' . $row['uid'] . '", ' . $row['pid'] . ', ' . $minChars . ', "' . $type . '", ' . GeneralUtility::quoteJSvalue($jsRow) . ');' . LF
-                               . $jsObj . '.defaultValue = "' . GeneralUtility::slashJS($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.findRecord')) . '";' . LF;
+                       var ' . $jsObj . ' = new TCEForms.Suggest('
+                               . GeneralUtility::quoteJSvalue($fieldname) . ', '
+                               . GeneralUtility::quoteJSvalue($table) . ', '
+                               . GeneralUtility::quoteJSvalue($field) . ', '
+                               . GeneralUtility::quoteJSvalue($row['uid']) . ', '
+                               . (int)$row['pid'] . ', '
+                               . (int)$minChars . ', '
+                               . GeneralUtility::quoteJSvalue($type) . ', '
+                               . GeneralUtility::quoteJSvalue($jsRow) . ');' . LF
+                               . $jsObj . '.defaultValue = ' . GeneralUtility::quoteJSvalue($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.findRecord')) . ';' . LF;
                return $selector;
        }
 
index 19ffbc5..2e91694 100644 (file)
@@ -625,7 +625,11 @@ function jumpToUrl(URL) {
                } else {
                        $mMN = '';
                }
-               $onClick = 'top.ShortcutManager.createShortcut(' . GeneralUtility::quoteJSvalue($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.makeBookmark')) . ', ' . '\'' . $backPath . '\', ' . '\'' . rawurlencode($modName) . '\', ' . '\'' . rawurlencode(($pathInfo['path'] . '?' . $storeUrl)) . $mMN . '\'' . ');return false;';
+               $onClick = 'top.ShortcutManager.createShortcut('
+                       . GeneralUtility::quoteJSvalue($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.makeBookmark')) . ', '
+                       . GeneralUtility::quoteJSvalue($backPath) . ', '
+                       . GeneralUtility::quoteJSvalue(rawurlencode($modName)) . ', '
+                       . GeneralUtility::quoteJSvalue(rawurlencode($pathInfo['path'] . '?' . $storeUrl) . $mMN) . ');return false;';
                $sIcon = '<a href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.makeBookmark', TRUE) . '">' . IconUtility::getSpriteIcon('actions-system-shortcut-new') . '</a>';
                return $sIcon;
        }
index b2a6564..8c8ded7 100644 (file)
@@ -1127,7 +1127,7 @@ class DatabaseRecordList extends \TYPO3\CMS\Recordlist\RecordList\AbstractDataba
                                        }
 
                                        $titleOrig = BackendUtility::getRecordTitle($table, $row, FALSE, TRUE);
-                                       $title = GeneralUtility::slashJS(GeneralUtility::fixed_lgd_cs($titleOrig, $this->fixedL), 1);
+                                       $title = GeneralUtility::fixed_lgd_cs($titleOrig, $this->fixedL);
                                        $warningText = GeneralUtility::quoteJSvalue(
                                                $GLOBALS['LANG']->getLL($actionName . 'Warning') . ' "' . $title . '" ' . $refCountMsg
                                        );
index 7e4d18e..c647f0d 100644 (file)
@@ -293,7 +293,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                // BEGIN accumulation of header JavaScript:
                $JScode = '';
                $JScode .= '
-                       var plugin = window.parent.RTEarea["' . $this->editorNo . '"].editor.getPlugin("TYPO3Link");
+                       var plugin = window.parent.RTEarea[' . GeneralUtility::quoteJSvalue($this->editorNo) . '].editor.getPlugin("TYPO3Link");
                        var HTMLArea = window.parent.HTMLArea;
                        var add_href=' . GeneralUtility::quoteJSvalue($this->curUrlArray['href'] ? '&curUrl[href]=' . rawurlencode($this->curUrlArray['href']) : '') . ';
                        var add_target=' . GeneralUtility::quoteJSvalue($this->setTarget ? '&curUrl[target]=' . rawurlencode($this->setTarget) : '') . ';
index 6f63db8..29e68c8 100644 (file)
@@ -1321,7 +1321,7 @@ class RteHtmlAreaBase extends \TYPO3\CMS\Backend\Rte\AbstractRte {
         * @todo Define visibility
         */
        public function setSaveRTE($RTEcounter, $formName, $textareaId, $textareaName) {
-               return 'if (RTEarea["' . $textareaId . '"]) { document.' . $formName . '["' . $textareaName . '"].value = RTEarea["' . $textareaId . '"].editor.getHTML(); } else { OK = 0; };';
+               return 'if (RTEarea[' . GeneralUtility::quoteJSvalue($textareaId) . ']) { document.' . $formName . '[' . GeneralUtility::quoteJSvalue($textareaName) . '].value = RTEarea[' . GeneralUtility::quoteJSvalue($textareaId) . '].editor.getHTML(); } else { OK = 0; };';
        }
 
        /**
@@ -1335,7 +1335,7 @@ class RteHtmlAreaBase extends \TYPO3\CMS\Backend\Rte\AbstractRte {
         * @todo Define visibility
         */
        public function setDeleteRTE($RTEcounter, $formName, $textareaId) {
-               return 'if (RTEarea["' . $textareaId . '"]) { RTEarea["' . $textareaId . '"].deleted = true;}';
+               return 'if (RTEarea[' . GeneralUtility::quoteJSvalue($textareaId) . ']) { RTEarea[' . GeneralUtility::quoteJSvalue($textareaId) . '].deleted = true;}';
        }
 
        /**
index ce0d9cb..674d148 100644 (file)
@@ -268,7 +268,7 @@ class SelectImage extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
        <title>Untitled</title>
        <script type="text/javascript">
        /*<![CDATA[*/
-               var plugin = window.parent.RTEarea["' . $this->editorNo . '"].editor.getPlugin("TYPO3Image");
+               var plugin = window.parent.RTEarea[' . GeneralUtility::quoteJSvalue($this->editorNo) . '].editor.getPlugin("TYPO3Image");
                function insertImage(file,width,height,alt,title,additionalParams) {
                        plugin.insertImage(\'<img src="\'+file+\'" width="\'+parseInt(width)+\'" height="\'+parseInt(height)+\'"\'' . ($this->defaultClass ? '+\' class="' . $this->defaultClass . '"\'' : '') . '+(alt?\' alt="\'+alt+\'"\':\'\')+(title?\' title="\'+title+\'"\':\'\')+(additionalParams?\' \'+additionalParams:\'\')+\' />\');
                }
@@ -316,14 +316,14 @@ class SelectImage extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                        $lockPlainHeight = $lockPlainWidth || $plainImageMode == 'lockRatio' || $plainImageMode == 'lockRatioWhenSmaller' ? 'true' : 'false';
                }
                $JScode = '
-                       var plugin = window.parent.RTEarea["' . $editorNo . '"].editor.getPlugin("TYPO3Image");
+                       var plugin = window.parent.RTEarea[' . GeneralUtility::quoteJSvalue($editorNo) . '].editor.getPlugin("TYPO3Image");
                        var HTMLArea = window.parent.HTMLArea;
 
                        HTMLArea.TYPO3Image.insertElement = function (table, uid, type, filename, filePath, fileExt, fileIcon) {
-                               return jumpToUrl(' . GeneralUtility::quoteJSvalue($this->getThisScript() . 'editorNo=') . ' + \'' . $editorNo . '\' + \'&insertImage=\' + filePath + \'&table=\' + table + \'&uid=\' + uid + \'&type=\' + type + \'bparams=\' + \'' . $this->bparams . '\');
+                               return jumpToUrl(' . GeneralUtility::quoteJSvalue($this->getThisScript() . 'editorNo=') . ' + ' . GeneralUtility::quoteJSvalue($editorNo) . ' + \'&insertImage=\' + filePath + \'&table=\' + table + \'&uid=\' + uid + \'&type=\' + type + \'bparams=\' + ' . GeneralUtility::quoteJSvalue($this->bparams) . ');
                        }
                        function insertElement(table, uid, type, fileName, filePath, fileExt, fileIcon, action, close) {
-                               return jumpToUrl(' . GeneralUtility::quoteJSvalue($this->getThisScript() . 'editorNo=') . ' + \'' . $editorNo . '\' + \'&insertImage=\' + filePath + \'&table=\' + table + \'&uid=\' + uid + \'&type=\' + type + \'bparams=\' + \'' . $this->bparams . '\');
+                               return jumpToUrl(' . GeneralUtility::quoteJSvalue($this->getThisScript() . 'editorNo=') . ' + ' . GeneralUtility::quoteJSvalue($editorNo) . ' + \'&insertImage=\' + filePath + \'&table=\' + table + \'&uid=\' + uid + \'&type=\' + type + \'bparams=\' + ' . GeneralUtility::quoteJSvalue($this->bparams) . ');
                        }
                        function initEventListeners() {
                                if (Ext.isWebKit) {
index da11430..9ba52fb 100644 (file)
@@ -76,7 +76,7 @@ class User {
                <input type="hidden" name="returnUrl" value="' . htmlspecialchars(\TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('REQUEST_URI')) . '" />
                ';
                $JScode = '
-                       var plugin = window.parent.RTEarea["' . $this->editorNo . '"].editor.getPlugin("UserElements");
+                       var plugin = window.parent.RTEarea[' . GeneralUtility::quoteJSvalue($this->editorNo) . '].editor.getPlugin("UserElements");
                        var HTMLArea = window.parent.HTMLArea;
                        var editor = plugin.editor;