[SECURITY] Prevent XSS in ElementBrowser 97/47597/2
authorMarkus Klein <markus.klein@typo3.org>
Tue, 12 Apr 2016 09:09:44 +0000 (11:09 +0200)
committerOliver Hader <oliver.hader@typo3.org>
Tue, 12 Apr 2016 09:09:46 +0000 (11:09 +0200)
Resolves: #51908
Releases: 6.2
Security-Commit: 716f84105ecba3202280a9c35893818c4dd078a0
Security-Bulletins: TYPO3-CORE-SA-2016-009, 010, 011, 012
Change-Id: I5a13860aca41b4401325d3a3f6f025e051f63010
Reviewed-on: https://review.typo3.org/47597
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
typo3/sysext/backend/Classes/RecordList/ElementBrowserRecordList.php
typo3/sysext/recordlist/Classes/Browser/ElementBrowser.php
typo3/sysext/rtehtmlarea/Classes/BrowseLinks.php
typo3/sysext/rtehtmlarea/Classes/SelectImage.php

index 6039d22..01c029d 100644 (file)
@@ -71,7 +71,7 @@ class ElementBrowserRecordList extends \TYPO3\CMS\Recordlist\RecordList\Database
         * @todo Define visibility
         */
        public function ext_addP() {
-               $str = '&act=' . $GLOBALS['SOBE']->browser->act . '&mode=' . $GLOBALS['SOBE']->browser->mode . '&expandPage=' . $GLOBALS['SOBE']->browser->expandPage . '&bparams=' . rawurlencode($GLOBALS['SOBE']->browser->bparams);
+               $str = '&act=' . rawurlencode($GLOBALS['SOBE']->browser->act) . '&mode=' . rawurlencode($GLOBALS['SOBE']->browser->mode) . '&expandPage=' . rawurlencode($GLOBALS['SOBE']->browser->expandPage) . '&bparams=' . rawurlencode($GLOBALS['SOBE']->browser->bparams);
                return $str;
        }
 
@@ -93,7 +93,7 @@ class ElementBrowserRecordList extends \TYPO3\CMS\Recordlist\RecordList\Database
                }
                $title = BackendUtility::getRecordTitle($table, $row, FALSE, TRUE);
                $ficon = IconUtility::getIcon($table, $row);
-               $aOnClick = 'return insertElement(\'' . $table . '\', \'' . $row['uid'] . '\', \'db\', ' . GeneralUtility::quoteJSvalue($title) . ', \'\', \'\', \'' . $ficon . '\');';
+               $aOnClick = 'return insertElement(' . GeneralUtility::quoteJSvalue($table) . ', \'' . $row['uid'] . '\', \'db\', ' . GeneralUtility::quoteJSvalue($title) . ', \'\', \'\', \'' . $ficon . '\');';
                $ATag = '<a href="#" onclick="' . $aOnClick . '">';
                $ATag_alt = substr($ATag, 0, -4) . ',\'\',1);">';
                $ATag_e = '</a>';
index 54ee6d1..f8f9778 100644 (file)
@@ -500,23 +500,23 @@ class ElementBrowser {
 
                        function browse_links_setTarget(target) {       //
                                cur_target=target;
-                               add_target="&curUrl[target]="+escape(target);
+                               add_target="&curUrl[target]="+encodeURIComponent(target);
                        }
                        function browse_links_setClass(cssClass) {   //
                                cur_class = cssClass;
-                               add_class = "&curUrl[class]=" + escape(cssClass);
+                               add_class = "&curUrl[class]=" + encodeURIComponent(cssClass);
                        }
                        function browse_links_setTitle(title) { //
                                cur_title=title;
-                               add_title="&curUrl[title]="+escape(title);
+                               add_title="&curUrl[title]="+encodeURIComponent(title);
                        }
                        function browse_links_setValue(value) { //
                                cur_href=value;
-                               add_href="&curUrl[href]="+value;
+                               add_href="&curUrl[href]="+encodeURIComponent(value);
                        }
                        function browse_links_setParams(params) {       //
                                cur_params=params;
-                               add_params="&curUrl[params]="+escape(params);
+                               add_params="&curUrl[params]="+encodeURIComponent(params);
                        }
                ';
                // Functions used, if the link selector is in wizard mode (= TCEforms fields)
@@ -573,8 +573,8 @@ class ElementBrowser {
                                }
                                function checkReference() {     //
                                        if (window.opener && window.opener.document && window.opener.document.' . $this->P['formName']
-                                               . ' && window.opener.document.' . $this->P['formName'] . '["' . $this->P['itemName'] . '"] ) {
-                                               return window.opener.document.' . $this->P['formName'] . '["' . $this->P['itemName'] . '"];
+                                               . ' && window.opener.document.' . $this->P['formName'] . '[' . GeneralUtility::quoteJSvalue($this->P['itemName']) . '] ) {
+                                               return window.opener.document.' . $this->P['formName'] . '[' . GeneralUtility::quoteJSvalue($this->P['itemName']) . '];
                                        } else {
                                                close();
                                        }
@@ -618,12 +618,12 @@ class ElementBrowser {
                        // Functions used, if the link selector is in RTE mode:
                        $JScode .= '
                                function link_typo3Page(id,anchor) {    //
-                                       var theLink = \'' . $this->siteURL . '?id=\'+id+(anchor?anchor:"");
+                                       var theLink = ' . GeneralUtility::quoteJSvalue($this->siteURL) . '+\'?id=\'+id+(anchor?anchor:"");
                                        self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
                                        return false;
                                }
                                function link_folder(folder) {  //
-                                       var theLink = \'' . $this->siteURL . '\'+folder;
+                                       var theLink = ' . GeneralUtility::quoteJSvalue($this->siteURL) . '+folder;
                                        self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
                                        return false;
                                }
@@ -645,8 +645,8 @@ class ElementBrowser {
                                if (URL.charAt(0) === \'?\') {
                                        URL = ' . GeneralUtility::quoteJSvalue($this->getThisScript()) . ' + URL.substring(1);
                                }
-                               var add_act = URL.indexOf("act=")==-1 ? "&act=' . $this->act . '" : "";
-                               var add_mode = URL.indexOf("mode=")==-1 ? "&mode=' . $this->mode . '" : "";
+                               var add_act = URL.indexOf("act=")==-1 ? "&act="+' . GeneralUtility::quoteJSvalue($this->act) . ' : "";
+                               var add_mode = URL.indexOf("mode=")==-1 ? "&mode="+' . GeneralUtility::quoteJSvalue($this->mode) . ' : "";
                                var theLocation = URL + add_act + add_mode + add_href + add_target + add_class + add_title + add_params'
                                        . ($addPassOnParams ? '+' . GeneralUtility::quoteJSvalue($addPassOnParams) : '')
                                        . '+(typeof(anchor)=="string"?anchor:"");
@@ -661,14 +661,13 @@ class ElementBrowser {
                 */
                $pArr = explode('|', $this->bparams);
                // This is JavaScript especially for the TBE Element Browser!
-               $formFieldName = 'data[' . $pArr[0] . '][' . $pArr[1] . '][' . $pArr[2] . ']';
                // insertElement - Call check function (e.g. for uniqueness handling):
                $JScodeCheck = '';
                if ($pArr[4] && $pArr[5]) {
                        $JScodeCheck = '
                                        // Call a check function in the opener window (e.g. for uniqueness handling):
                                if (parent.window.opener) {
-                                       var res = parent.window.opener.' . $pArr[5] . '("' . addslashes($pArr[4]) . '",table,uid,type);
+                                       var res = parent.window.opener.' . $pArr[5] . '(' . GeneralUtility::quoteJSvalue($pArr[4]) . ',table,uid,type);
                                        if (!res.passed) {
                                                if (res.message) alert(res.message);
                                                performAction = false;
@@ -685,7 +684,7 @@ class ElementBrowser {
                        $JScodeHelper = '
                                                // Call helper function to manage data in the opener window:
                                        if (parent.window.opener) {
-                                               parent.window.opener.' . $pArr[6] . '("' . addslashes($pArr[4]) . '",table,uid,type,"' . addslashes($pArr[0]) . '");
+                                               parent.window.opener.' . $pArr[6] . '(' . GeneralUtility::quoteJSvalue($pArr[4]) . ',table,uid,type,' . GeneralUtility::quoteJSvalue($pArr[0]) . ');
                                        } else {
                                                alert("Error - reference to main window is not set properly!");
                                                parent.close();
@@ -698,7 +697,7 @@ class ElementBrowser {
                        // Call user defined action function:
                        $JScodeAction = '
                                        if (parent.window.opener) {
-                                               parent.window.opener.' . $pArr[7] . '("' . addslashes($pArr[4]) . '",table,uid,type);
+                                               parent.window.opener.' . $pArr[7] . '(' . GeneralUtility::quoteJSvalue($pArr[4]) . ',table,uid,type);
                                                if (close) { focusOpenerAndClose(close); }
                                        } else {
                                                alert("Error - reference to main window is not set properly!");
@@ -708,7 +707,7 @@ class ElementBrowser {
                        $JScodeActionMultiple = '
                                                // Call helper function to manage data in the opener window:
                                        if (parent.window.opener) {
-                                               parent.window.opener.' . $pArr[7] . 'Multiple("' . addslashes($pArr[4]) . '",table,uid,type,"'
+                                               parent.window.opener.' . $pArr[7] . 'Multiple(' . GeneralUtility::quoteJSvalue($pArr[4]) . ',table,uid,type,"'
                                                . addslashes($pArr[0]) . '");
                                        } else {
                                                alert("Error - reference to main window is not set properly!");
@@ -722,14 +721,17 @@ class ElementBrowser {
                } else {
                        $JScodeAction = '
                                        if (setReferences()) {
-                                               parent.window.opener.group_change("add","' . $pArr[0] . '","' . $pArr[1] . '","' . $pArr[2]
-                                                       . '",elRef,targetDoc);
+                                               parent.window.opener.group_change("add",'
+                                                       . GeneralUtility::quoteJSvalue($pArr[0]) . ','
+                                                       . GeneralUtility::quoteJSvalue($pArr[1]) . ','
+                                                       . GeneralUtility::quoteJSvalue($pArr[2]) . ',elRef,targetDoc);
                                        } else {
                                                alert("Error - reference to main window is not set properly!");
                                        }
                                        focusOpenerAndClose(close);
                        ';
                }
+               $formFieldName = 'data[' . $pArr[0] . '][' . $pArr[1] . '][' . $pArr[2] . ']';
                $JScode .= '
                        var elRef="";
                        var targetDoc="";
@@ -744,9 +746,9 @@ class ElementBrowser {
                        }
                        function setReferences() {      //
                                if (parent.window.opener && parent.window.opener.content && parent.window.opener.content.document.editform'
-                                       . '&& parent.window.opener.content.document.editform["' . $formFieldName . '"]) {
+                                       . '&& parent.window.opener.content.document.editform[' . GeneralUtility::quoteJSvalue($formFieldName) . ']) {
                                        targetDoc = parent.window.opener.content.document;
-                                       elRef = targetDoc.editform["' . $formFieldName . '"];
+                                       elRef = targetDoc.editform[' . GeneralUtility::quoteJSvalue($formFieldName) . '];
                                        return true;
                                } else {
                                        return false;
@@ -769,7 +771,7 @@ class ElementBrowser {
                        }
                        function addElement(elName, elValue, altElValue, close) {       //
                                if (parent.window.opener && parent.window.opener.setFormValueFromBrowseWin) {
-                                       parent.window.opener.setFormValueFromBrowseWin("' . $pArr[0] . '",altElValue?altElValue:elValue,elName);
+                                       parent.window.opener.setFormValueFromBrowseWin(' . GeneralUtility::quoteJSvalue($pArr[0]) . ',altElValue?altElValue:elValue,elName);
                                        focusOpenerAndClose(close);
                                } else {
                                        alert("Error - reference to main window is not set properly!");
@@ -1112,7 +1114,7 @@ class ElementBrowser {
                                -->
                                                        <table border="0" cellpadding="1" cellspacing="1" id="typo3-linkSpecial">
                                                                <tr>
-                                                                       <td class="bgColor5" class="c-wCell" valign="top"><strong>'
+                                                                       <td class="bgColor5 c-wCell" valign="top"><strong>'
                                                                                . $GLOBALS['LANG']->getLL('special', TRUE) . '</strong></td>
                                                                </tr>
                                                                ' . implode('', $subcats) . '
@@ -1618,7 +1620,7 @@ class ElementBrowser {
                                // Putting list element HTML together:
                                $out .= '<img' . IconUtility::skinImg($GLOBALS['BACK_PATH'], ('gfx/ol/join' . ($c == $cc ? 'bottom' : '')
                                                . '.gif'), 'width="18" height="16"') . ' alt="" />' . $arrCol
-                                       . '<a href="#" onclick="return link_typo3Page(\'' . $expPageId . '\',\'#' . $row['uid'] . '\');">'
+                                       . '<a href="#" onclick="return link_typo3Page(' . GeneralUtility::quoteJSvalue($expPageId) . ',\'#' . $row['uid'] . '\');">'
                                        . $icon . BackendUtility::getRecordTitle('tt_content', $row, TRUE) . '</a><br />';
                                // Finding internal anchor points:
                                if (GeneralUtility::inList('text,textpic', $row['CType'])) {
@@ -1781,7 +1783,7 @@ class ElementBrowser {
                        $titleLen = (int)$GLOBALS['BE_USER']->uc['titleLen'];
                        $folderIcon = IconUtility::getSpriteIconForResource($folder);
                        $folderIcon .= htmlspecialchars(GeneralUtility::fixed_lgd_cs($folder->getIdentifier(), $titleLen));
-                       $picon = '<a href="#" onclick="return link_folder(\'file:' . $folder->getCombinedIdentifier() . '\');">'
+                       $picon = '<a href="#" onclick="return link_folder(' . GeneralUtility::quoteJSvalue('file:' . $folder->getCombinedIdentifier()) . ');">'
                                . $folderIcon . '</a>';
                        if ($this->curUrlInfo['act'] == 'folder' && $currentIdentifier == $folder->getCombinedIdentifier()) {
                                $out .= '<img'
@@ -1836,7 +1838,7 @@ class ElementBrowser {
                                                        ('gfx/ol/join' . ($c == $totalItems ? 'bottom' : '') . '.gif'),
                                                        'width="18" height="16"'
                                                ) . ' alt="" />' . $arrCol .
-                                       '<a href="#" onclick="return link_folder(\'' . $itemUid . '\');">' .
+                                       '<a href="#" onclick="return link_folder(' . GeneralUtility::quoteJSvalue($itemUid) . ');">' .
                                                $icon .
                                                htmlspecialchars(GeneralUtility::fixed_lgd_cs($fileOrFolderObject->getName(), $titleLen)) .
                                        '</a><br />';
@@ -1911,7 +1913,7 @@ class ElementBrowser {
                                        $fileObject->getProperty('height')
                                );
                                $pDim = $imgInfo[0] . 'x' . $imgInfo[1] . ' pixels';
-                               $clickIcon = '<img src="' . $imageUrl . '" hspace="5" vspace="5" border="1" />';
+                               $clickIcon = '<img src="' . htmlspecialchars($imageUrl) . '" hspace="5" vspace="5" border="1" />';
                        } else {
                                $clickIcon = '';
                                $pDim = '';
@@ -2141,7 +2143,7 @@ class ElementBrowser {
                foreach ($files as $fileObject) {
                        $fileInfo = $fileObject->getStorage()->getFileInfo($fileObject);
                        // URL of image:
-                       $iUrl = GeneralUtility::rawurlencodeFP($fileObject->getPublicUrl(TRUE));
+                       $iUrl = GeneralUtility::rawUrlEncodeFP($fileObject->getPublicUrl(TRUE));
                        // Show only web-images
                        $fileExtension = strtolower($fileObject->getExtension());
                        if (GeneralUtility::inList('gif,jpeg,jpg,png', $fileExtension)) {
@@ -2452,7 +2454,7 @@ class ElementBrowser {
                                Form, for uploading files:
                        -->
                        <form action="' . $GLOBALS['BACK_PATH'] . 'tce_file.php" method="post" name="editform"'
-                       . 'id="typo3-uplFilesForm" enctype="' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'] . '">
+                       . ' id="typo3-uplFilesForm" enctype="' . htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype']) . '">
                                <table border="0" cellpadding="0" cellspacing="0" id="typo3-uplFiles">
                                        <tr>
                                                <td>' . $this->barheader($GLOBALS['LANG']->sL(
@@ -2473,7 +2475,7 @@ class ElementBrowser {
                                <input type="hidden" name="file[upload][' . $a . '][data]" value="' . $a . '" /><br />';
                }
                // Make footer of upload form, including the submit button:
-               $redirectValue = $this->getThisScript() . 'act=' . $this->act . '&mode=' . $this->mode
+               $redirectValue = $this->getThisScript() . 'act=' . rawurlencode($this->act) . '&mode=' . rawurlencode($this->mode)
                        . '&expandFolder=' . rawurlencode($folderObject->getCombinedIdentifier())
                        . '&bparams=' . rawurlencode($this->bparams)
                        . (is_array($this->P) ? GeneralUtility::implodeArrayForUrl('P', $this->P) : '');
@@ -2538,7 +2540,7 @@ class ElementBrowser {
                                . '<input type="hidden" name="file[newfolder][' . $a . '][target]" value="'
                                . htmlspecialchars($folderObject->getCombinedIdentifier()) . '" />';
                // Make footer of upload form, including the submit button:
-               $redirectValue = $this->getThisScript() . 'act=' . $this->act . '&mode=' . $this->mode
+               $redirectValue = $this->getThisScript() . 'act=' . rawurlencode($this->act) . '&mode=' . rawurlencode($this->mode)
                        . '&expandFolder=' . rawurlencode($folderObject->getCombinedIdentifier())
                        . '&bparams=' . rawurlencode($this->bparams)
                        . (is_array($this->P) ? GeneralUtility::implodeArrayForUrl('P', $this->P) : '');
index c647f0d..87df6d9 100644 (file)
@@ -235,7 +235,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                }
                                                $classLabel = is_array($this->RTEProperties['classes.']) && is_array($this->RTEProperties['classes.'][$class . '.']) && $this->RTEProperties['classes.'][$class . '.']['name'] ? $this->getPageConfigLabel($this->RTEProperties['classes.'][$class . '.']['name'], 0) : $class;
                                                $classStyle = is_array($this->RTEProperties['classes.']) && is_array($this->RTEProperties['classes.'][$class . '.']) && $this->RTEProperties['classes.'][$class . '.']['value'] ? $this->RTEProperties['classes.'][$class . '.']['value'] : '';
-                                               $this->classesAnchorJSOptions[$anchorType] .= '<option ' . $selected . ' value="' . $class . '"' . ($classStyle ? ' style="' . $classStyle . '"' : '') . '>' . $classLabel . '</option>';
+                                               $this->classesAnchorJSOptions[$anchorType] .= '<option ' . $selected . ' value="' . htmlspecialchars($class) . '"' . ($classStyle ? ' style="' . htmlspecialchars($classStyle) . '"' : '') . '>' . htmlspecialchars($classLabel) . '</option>';
                                        }
                                }
                                if ($this->classesAnchorJSOptions[$anchorType] && !($this->buttonConfig['properties.']['class.']['required'] || $this->buttonConfig[$this->act . '.']['properties.']['class.']['required'])) {
@@ -332,7 +332,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                $JScode .= '
                        function link_typo3Page(id,anchor) {
                                var parameters = (document.ltargetform.query_parameters && document.ltargetform.query_parameters.value) ? (document.ltargetform.query_parameters.value.charAt(0) == "&" ? "" : "&") + document.ltargetform.query_parameters.value : "";
-                               var theLink = \'' . $this->siteURL . '?id=\' + id + parameters + (anchor ? anchor : "");
+                               var theLink = ' . GeneralUtility::quoteJSvalue($this->siteURL . '?id=') . ' + id + parameters + (anchor ? anchor : "");
                                if (document.ltargetform.anchor_title) browse_links_setTitle(document.ltargetform.anchor_title.value);
                                if (document.ltargetform.anchor_class) browse_links_setClass(document.ltargetform.anchor_class.value);
                                if (document.ltargetform.ltarget) browse_links_setTarget(document.ltargetform.ltarget.value);
@@ -343,9 +343,9 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                        }
                        function link_folder(folder) {
                                if (folder && folder.substr(0, 5) == "file:") {
-                                       var theLink = \'' . $this->siteURL . '?file:\' + encodeURIComponent(folder.substr(5));
+                                       var theLink = ' . GeneralUtility::quoteJSvalue($this->siteURL . '?file:') . ' + encodeURIComponent(folder.substr(5));
                                } else {
-                                       var theLink = \'' . $this->siteURL . '?\' + folder;
+                                       var theLink = ' . GeneralUtility::quoteJSvalue($this->siteURL . '?') . ' + folder;
                                }
                                if (document.ltargetform.anchor_title) browse_links_setTitle(document.ltargetform.anchor_title.value);
                                if (document.ltargetform.anchor_class) browse_links_setClass(document.ltargetform.anchor_class.value);
@@ -381,10 +381,10 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                if (URL.charAt(0) === \'?\') {
                                        URL = ' . GeneralUtility::quoteJSvalue($this->getThisScript()) . ' + URL.substring(1);
                                }
-                               var add_editorNo = URL.indexOf("editorNo=")==-1 ? "&editorNo=' . $this->editorNo . '" : "";
-                               var add_contentTypo3Language = URL.indexOf("contentTypo3Language=")==-1 ? "&contentTypo3Language=' . $this->contentTypo3Language . '" : "";
-                               var add_act = URL.indexOf("act=")==-1 ? "&act=' . $this->act . '" : "";
-                               var add_mode = URL.indexOf("mode=")==-1 ? "&mode=' . $this->mode . '" : "";
+                               var add_editorNo = URL.indexOf("editorNo=")==-1 ? "&editorNo=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($this->editorNo)) . ' : "";
+                               var add_contentTypo3Language = URL.indexOf("contentTypo3Language=")==-1 ? "&contentTypo3Language=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($this->contentTypo3Language)) . ' : "";
+                               var add_act = URL.indexOf("act=")==-1 ? "&act=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($this->act)) . ' : "";
+                               var add_mode = URL.indexOf("mode=")==-1 ? "&mode=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($this->mode)) . ' : "";
                                var add_additionalValues = "";
                                if (plugin.pageTSConfiguration && plugin.pageTSConfiguration.additionalAttributes) {
                                        var additionalAttributes = plugin.pageTSConfiguration.additionalAttributes.split(",");
@@ -627,7 +627,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                        // URL + onclick event:
                                                        $onClickEvent = '';
                                                        if (isset($v[$k2i . '.']['target'])) {
-                                                               $onClickEvent .= 'browse_links_setTarget(\'' . $v[($k2i . '.')]['target'] . '\');';
+                                                               $onClickEvent .= 'browse_links_setTarget(' . GeneralUtility::quoteJSvalue($v[($k2i . '.')]['target']) . ');';
                                                        }
                                                        $v[$k2i . '.']['url'] = str_replace('###_URL###', $this->siteURL, $v[$k2i . '.']['url']);
                                                        if (substr($v[$k2i . '.']['url'], 0, 7) == 'http://' || substr($v[$k2i . '.']['url'], 0, 7) == 'mailto:') {
@@ -653,7 +653,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                -->
                                                        <table border="0" cellpadding="1" cellspacing="1" id="typo3-linkSpecial">
                                                                <tr>
-                                                                       <td class="bgColor5" class="c-wCell" valign="top"><strong>' . $GLOBALS['LANG']->getLL('special', TRUE) . '</strong></td>
+                                                                       <td class="bgColor5 c-wCell" valign="top"><strong>' . $GLOBALS['LANG']->getLL('special', TRUE) . '</strong></td>
                                                                </tr>
                                                                ' . implode('', $subcats) . '
                                                        </table>
@@ -773,7 +773,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                <tr>
                                                        <td><label>' . $GLOBALS['LANG']->getLL('linkRelationship', TRUE) . ':</label></td>
                                                        <td colspan="3">
-                                                               <input type="text" name="lrel" value="' . $this->additionalAttributes['rel'] . '"  ' . $this->doc->formWidth(30) . ' />
+                                                               <input type="text" name="lrel" value="' . htmlspecialchars($this->additionalAttributes['rel']) . '"  ' . $this->doc->formWidth(30) . ' />
                                                        </td>
                                                </tr>' : '';
        }
@@ -786,7 +786,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                <tr>
                                                        <td><label>' . $GLOBALS['LANG']->getLL('query_parameters', TRUE) . ':</label></td>
                                                        <td colspan="3">
-                                                               <input type="text" name="query_parameters" value="' . ($this->curUrlInfo['query'] ?: '') . '" ' . $this->doc->formWidth(30) . ' />
+                                                               <input type="text" name="query_parameters" value="' . ($this->curUrlInfo['query'] ? htmlspecialchars($this->curUrlInfo['query']) : '') . '" ' . $this->doc->formWidth(30) . ' />
                                                        </td>
                                                </tr>' : '';
        }
@@ -833,7 +833,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                <tr>
                                                        <td><label>' . $GLOBALS['LANG']->getLL('target_popUpWindow', TRUE) . ':</label></td>
                                                        <td colspan="3">
-                                                               <select name="popup_width" onchange="' . $selectJS . '">
+                                                               <select name="popup_width" onchange="' . htmlspecialchars($selectJS) . '">
                                                                        <option value="0">' . $GLOBALS['LANG']->getLL('target_popUpWindow_width', TRUE) . '</option>
                                                                        <option value="300">300</option>
                                                                        <option value="400">400</option>
@@ -843,7 +843,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                                        <option value="800">800</option>
                                                                </select>
                                                                x
-                                                               <select name="popup_height" onchange="' . $selectJS . '">
+                                                               <select name="popup_height" onchange="' . htmlspecialchars($selectJS) . '">
                                                                        <option value="0">' . $GLOBALS['LANG']->getLL('target_popUpWindow_height', TRUE) . '</option>
                                                                        <option value="200">200</option>
                                                                        <option value="300">300</option>
@@ -870,8 +870,8 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                <tr>
                                                        <td><label>' . $GLOBALS['LANG']->getLL('anchor_class', TRUE) . ':</label></td>
                                                        <td colspan="3">
-                                                               <select name="anchor_class" onchange="' . $this->getClassOnChangeJS() . '">
-                                                                       ' . $this->classesAnchorJSOptions[$this->act] . '
+                                                               <select name="anchor_class" onchange="' . htmlspecialchars($this->getClassOnChangeJS()) . '">
+                                                                       ' . htmlspecialchars($this->classesAnchorJSOptions[$this->act]) . '
                                                                </select>
                                                        </td>
                                                </tr>';
@@ -904,7 +904,7 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                                                browse_links_setTarget(anchorClass[\'target\']);
                                                                        } else if (document.ltargetform.ltarget && document.getElementById(\'ltargetrow\').style.display == \'none\') {
                                                                                        // Reset target to default if field is not displayed and class has no configured target
-                                                                               document.ltargetform.ltarget.value = \'' . ($this->defaultLinkTarget ?: '') . '\';
+                                                                               document.ltargetform.ltarget.value = ' . ($this->defaultLinkTarget ? GeneralUtility::quoteJSvalue($this->defaultLinkTarget) : '""') . ';
                                                                                browse_links_setTarget(document.ltargetform.ltarget.value);
                                                                        }
                                                                        break;
@@ -930,9 +930,9 @@ class BrowseLinks extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                                        <td><label for="rtehtmlarea-browse-links-anchor_title" id="rtehtmlarea-browse-links-title-label">' . $GLOBALS['LANG']->getLL('anchor_title', TRUE) . ':</label></td>
                                                        <td colspan="3">
                                                                <span id="rtehtmlarea-browse-links-title-input" style="display: ' . ($readOnly ? 'none' : 'inline') . ';">
-                                                                       <input type="text" id="rtehtmlarea-browse-links-anchor_title" name="anchor_title" value="' . $title . '" ' . $this->doc->formWidth(30) . ' />
+                                                                       <input type="text" id="rtehtmlarea-browse-links-anchor_title" name="anchor_title" value="' . htmlspecialchars($title) . '" ' . $this->doc->formWidth(30) . ' />
                                                                </span>
-                                                               <span id="rtehtmlarea-browse-links-title-readonly" style="display: ' . ($readOnly ? 'inline' : 'none') . ';">' . $title . '</span>
+                                                               <span id="rtehtmlarea-browse-links-title-readonly" style="display: ' . ($readOnly ? 'inline' : 'none') . ';">' . htmlspecialchars($title) . '</span>
                                                        </td>
                                                </tr>';
        }
index 674d148..ab4853a 100644 (file)
@@ -278,7 +278,7 @@ class SelectImage extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
 <body>
 <script type="text/javascript">
 /*<![CDATA[*/
-       insertImage(' . GeneralUtility::quoteJSvalue($url, 1) . ',' . $width . ',' . $height . ',' . GeneralUtility::quoteJSvalue($altText, 1) . ',' . GeneralUtility::quoteJSvalue($titleText, 1) . ',' . GeneralUtility::quoteJSvalue($additionalParams, 1) . ');
+       insertImage(' . GeneralUtility::quoteJSvalue($url) . ',' . (int)$width . ',' . (int)$height . ',' . GeneralUtility::quoteJSvalue($altText) . ',' . GeneralUtility::quoteJSvalue($titleText) . ',' . GeneralUtility::quoteJSvalue($additionalParams) . ');
 /*]]>*/
 </script>
 </body>
@@ -305,7 +305,7 @@ class SelectImage extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                        $classesImageArray = GeneralUtility::trimExplode(',', $this->buttonConfig['properties.']['class.']['allowedClasses'], TRUE);
                        $classesImageJSOptions = '<option value=""></option>';
                        foreach ($classesImageArray as $class) {
-                               $classesImageJSOptions .= '<option value="' . $class . '">' . $class . '</option>';
+                               $classesImageJSOptions .= '<option value="' . htmlspecialchars($class) . '">' . htmlspecialchars($class) . '</option>';
                        }
                }
                $lockPlainWidth = 'false';
@@ -331,10 +331,10 @@ class SelectImage extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                }
                        }
                        function jumpToUrl(URL,anchor) {
-                               var add_act = URL.indexOf("act=")==-1 ? "&act=' . $act . '" : "";
-                               var add_editorNo = URL.indexOf("editorNo=")==-1 ? "&editorNo=' . $editorNo . '" : "";
-                               var add_sys_language_content = URL.indexOf("sys_language_content=")==-1 ? "&sys_language_content=' . $sys_language_content . '" : "";
-                               var RTEtsConfigParams = "&RTEtsConfigParams=' . rawurlencode($this->RTEtsConfigParams) . '";
+                               var add_act = URL.indexOf("act=")==-1 ? "&act=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($act)) . ' : "";
+                               var add_editorNo = URL.indexOf("editorNo=")==-1 ? "&editorNo=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($editorNo)) . ' : "";
+                               var add_sys_language_content = URL.indexOf("sys_language_content=")==-1 ? "&sys_language_content=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($sys_language_content) . ' : "";
+                               var RTEtsConfigParams = "&RTEtsConfigParams=" + ' . GeneralUtility::quoteJSvalue(rawurlencode($this->RTEtsConfigParams)) . ';
 
                                var cur_width = selectedImageRef ? "&cWidth="+selectedImageRef.style.width : "";
                                var cur_height = selectedImageRef ? "&cHeight="+selectedImageRef.style.height : "";
@@ -344,11 +344,11 @@ class SelectImage extends \TYPO3\CMS\Recordlist\Browser\ElementBrowser {
                                return false;
                        }
                        function insertImage(file,width,height) {
-                               plugin.insertImage(\'<img src="\'+file+\'"' . ($this->defaultClass ? ' class="' . $this->defaultClass . '"' : '') . ' width="\'+parseInt(width)+\'" height="\'+parseInt(height)+\'" />\');
+                               plugin.insertImage(\'<img src="\'+file+\'"' . ($this->defaultClass ? ' class="\' + ' . GeneralUtility::quoteJSvalue(htmlspecialchars($this->defaultClass)) . ' + \'"' : '') . ' width="\'+parseInt(width)+\'" height="\'+parseInt(height)+\'" />\');
                        }
                        function launchView(url) {
                                var thePreviewWindow="";
-                               thePreviewWindow = window.open("' . GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir . 'show_item.php?table="+url,"ShowItem","height=300,width=410,status=0,menubar=0,resizable=0,location=0,directories=0,scrollbars=1,toolbar=0");
+                               thePreviewWindow = window.open(' . GeneralUtility::quoteJSvalue(GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir . 'show_item.php?table=') . ' +url,"ShowItem","height=300,width=410,status=0,menubar=0,resizable=0,location=0,directories=0,scrollbars=1,toolbar=0");
                                if (thePreviewWindow && thePreviewWindow.focus) {
                                        thePreviewWindow.focus();
                                }