From e7849fc7f927a65177898710ac6ba1902636f902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Dziewo=C5=84ski?= Date: Wed, 21 Oct 2015 14:24:17 +0200 Subject: [PATCH] SECURITY: mediawiki.js: Escape HTML in mw.message( ... ).parse() This basically makes it equivalent to .escaped() and not .text(). Does not affect the mediawiki.jqueryMsg version, which still accepts whitelisted HTML tags. Bug: T115888 Change-Id: I6513dfb480024309e1594abc6f07bbd3b0c5a10e --- resources/src/mediawiki.base/mediawiki.base.js | 7 ++++++- .../mediawiki/mediawiki.jqueryMsg.test.js | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/resources/src/mediawiki.base/mediawiki.base.js b/resources/src/mediawiki.base/mediawiki.base.js index 2a1edf558c..331ccff5ab 100644 --- a/resources/src/mediawiki.base/mediawiki.base.js +++ b/resources/src/mediawiki.base/mediawiki.base.js @@ -117,7 +117,12 @@ ) { text = '(' + this.key + '$*)'; } - return mw.format.apply( null, [ text ].concat( this.parameters ) ); + text = mw.format.apply( null, [ text ].concat( this.parameters ) ); + if ( this.format === 'parse' ) { + // We don't know how to parse anything, so escape it all + text = mw.html.escape( text ); + } + return text; }, /** diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js index e6b933d35b..eeebaae4e5 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js @@ -758,6 +758,24 @@ mw.jqueryMsg.getMessageFunction = oldGMF; } ); + // Tests that HTML in message parameters is escaped, + // whether the message looks like wikitext or not. + QUnit.test( 'mw.Message.prototype.parser monkey-patch HTML-escape', function ( assert ) { + mw.messages.set( '1x-wikitext', '$1' ); + assert.htmlEqual( + mw.message( '1x-wikitext', '' ).parse(), + '<script>alert( "1x-wikitext test" )</script>', + 'Message parameters are escaped if message contains wikitext' + ); + + mw.messages.set( '1x-plain', '$1' ); + assert.htmlEqual( + mw.message( '1x-plain', '' ).parse(), + '<script>alert( "1x-plain test" )</script>', + 'Message parameters are still escaped if message contains no wikitext' + ); + } ); + formatnumTests = [ { lang: 'en', -- 2.25.1