From 7e79daf9af37658b627cbb9a263e8ba436dde6ac Mon Sep 17 00:00:00 2001 From: riking Date: Mon, 9 Feb 2015 14:34:05 -0800 Subject: [PATCH 1/2] SECURITY: missed html escaping --- .../discourse/controllers/composer.js.es6 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index b1bf16cf299..b13e46c00d0 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -181,11 +181,11 @@ export default DiscourseController.extend({ // for now handle a very narrow use case // if we are replying to a topic AND not on the topic pop the window up - if(!force && composer.get('replyingToTopic')) { + if (!force && composer.get('replyingToTopic')) { var topic = this.get('topic'); if (!topic || topic.get('id') !== composer.get('topic.id')) { - var message = I18n.t("composer.posting_not_on_topic", {title: this.get('model.topic.title')}); + var message = I18n.t("composer.posting_not_on_topic"); var buttons = [{ "label": I18n.t("composer.cancel"), @@ -193,11 +193,11 @@ export default DiscourseController.extend({ "link": true }]; - if(topic) { + if (topic) { buttons.push({ - "label": I18n.t("composer.reply_here") + "
" + topic.get('title') + "
", + "label": I18n.t("composer.reply_here") + "
" + Handlebars.Utils.escapeExpression(topic.get('title')) + "
", "class": "btn btn-reply-here", - "callback": function(){ + "callback": function() { composer.set('topic', topic); composer.set('post', null); self.save(true); @@ -206,14 +206,14 @@ export default DiscourseController.extend({ } buttons.push({ - "label": I18n.t("composer.reply_original") + "
" + this.get('model.topic.title') + "
", + "label": I18n.t("composer.reply_original") + "
" + Handlebars.Utils.escapeExpression(this.get('model.topic.title')) + "
", "class": "btn-primary btn-reply-on-original", - "callback": function(){ + "callback": function() { self.save(true); } }); - bootbox.dialog(message, buttons, {"classes": "reply-where-modal"}); + bootbox.dialog(message, buttons, { "classes": "reply-where-modal" }); return; } } From 83b51875bb0a229889fb297d7abe2b5eb5de6c64 Mon Sep 17 00:00:00 2001 From: riking Date: Mon, 9 Feb 2015 15:02:49 -0800 Subject: [PATCH 2/2] Use html_escape method instead of gsub --- app/models/topic.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/models/topic.rb b/app/models/topic.rb index 9a0e93d942e..19a3da5902e 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -249,13 +249,7 @@ class Topic < ActiveRecord::Base end def fancy_title - sanitized_title = title.gsub(/['&\"<>]/, { - "'" => ''', - '&' => '&', - '"' => '"', - '<' => '<', - '>' => '>', - }) + sanitized_title = ERB::Util.html_escape(title) return unless sanitized_title return sanitized_title unless SiteSetting.title_fancy_entities?