Jsahleen has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/183743

Change subject: Security: Prevent XSS (cxserver)
......................................................................

Security: Prevent XSS (cxserver)

* Machine translation responses are now sent as JSON
* '<', '>' and '"' are replaced with html entities
* Must be merged together with the corresponding patch for ContentTranslation

Bug: T85686
Change-Id: Ibb2406c8ff5433ff7a046d7524ea07ed47616b2d
---
M ContentTranslationService.js
1 file changed, 41 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/cxserver 
refs/changes/43/183743/1

diff --git a/ContentTranslationService.js b/ContentTranslationService.js
index ad27e7f..fdb6135 100644
--- a/ContentTranslationService.js
+++ b/ContentTranslationService.js
@@ -61,12 +61,18 @@
                function ( response ) {
                        var segmenter, segmentedContent;
                        try {
-                               logger.profile( 'Fetch page', { title: title, 
sourceLanguage: sourceLanguage } );
+                               logger.profile( 'Fetch page', {
+                                       title: title,
+                                       sourceLanguage: sourceLanguage
+                               } );
                                logger.profile( 'Segment page' );
                                segmenter = new CXSegmenter( response.body, 
sourceLanguage );
                                segmenter.segment();
                                segmentedContent = 
segmenter.getSegmentedContent();
-                               logger.profile( 'Segment page', { title: title, 
sourceLanguage: sourceLanguage } );
+                               logger.profile( 'Segment page', {
+                                       title: title,
+                                       sourceLanguage: sourceLanguage
+                               } );
                        } catch ( error ) {
                                res.send( 500, {
                                        error: '' + error
@@ -92,7 +98,9 @@
 } );
 
 app.get( '/mt/:from/:to/:provider?', function ( req, res ) {
-       res.send( 405, { error: 'Request must be posted' } );
+       res.send( 405, {
+               error: 'Request must be posted'
+       } );
 } );
 
 app.post( '/mt/:from/:to/:provider?', function ( req, res ) {
@@ -104,15 +112,19 @@
                provider = registry.getValidProvider( from, to, 'mt', 
req.params.provider );
 
        if ( !provider ) {
-               res.send( 404, { error: 'Provider not supported' } );
+               res.send( 404, {
+                       error: 'Provider not supported'
+               } );
                logger.info( 'MT provider invalid or missing' );
 
                return;
        }
 
        mtClients = require( __dirname + '/mt/' );
-       if ( mtClients[provider] === undefined ) {
-               res.send( 500, { error: 'Provider not found' } );
+       if ( mtClients[ provider ] === undefined ) {
+               res.send( 500, {
+                       error: 'Provider not found'
+               } );
                logger.error( 'Configured provider ' + provider + ' was not 
found' );
                return;
        }
@@ -126,7 +138,9 @@
                reqLength += data.length;
                if ( reqLength > 50000 ) {
                        // Too long
-                       res.send( 413, { error: 'Content too long' } );
+                       res.send( 413, {
+                               error: 'Content too long'
+                       } );
                        logger.error( 'MT content too long' );
                        return;
                }
@@ -139,11 +153,23 @@
                logger.profile( 'MT' );
                mtClient.translate( from, to, sourceHtml ).then(
                        function ( data ) {
-                               res.send( data );
-                               logger.profile( 'MT', { from: from, to: to } );
+                               // Prevent XSS
+                               data = data
+                                       .replace( /</g, '&lt;' )
+                                       .replace( />/g, '&gt;' )
+                                       .replace( /"/g, '&quot;' );
+                               res.json( {
+                                       contents: data
+                               } );
+                               logger.profile( 'MT', {
+                                       from: from,
+                                       to: to
+                               } );
                        },
                        function ( error ) {
-                               res.send( 500, { error: error } );
+                               res.send( 500, {
+                                       error: error
+                               } );
                                logger.log( 'error', 'MT processing error: 
(%s)', error.toString() );
                        }
                );
@@ -172,7 +198,11 @@
        dictClient.getTranslations( word, from, to ).then(
                function ( data ) {
                        res.send( data );
-                       logger.profile( 'Dictionary lookup', { word: word, 
from: from, to: to } );
+                       logger.profile( 'Dictionary lookup', {
+                               word: word,
+                               from: from,
+                               to: to
+                       } );
                },
                function ( error ) {
                        res.send( 500, {

-- 
To view, visit https://gerrit.wikimedia.org/r/183743
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb2406c8ff5433ff7a046d7524ea07ed47616b2d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/cxserver
Gerrit-Branch: master
Gerrit-Owner: Jsahleen <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to