diff --git a/public/app/core/utils/text.ts b/public/app/core/utils/text.ts
index 6db844e736e..43193efde3d 100644
--- a/public/app/core/utils/text.ts
+++ b/public/app/core/utils/text.ts
@@ -101,3 +101,11 @@ export function sanitize(unsanitizedString: string): string {
export function hasAnsiCodes(input: string): boolean {
return /\u001b\[\d{1,2}m/.test(input);
}
+
+export function escapeHtml(str: string): string {
+ return String(str)
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"');
+}
diff --git a/public/app/features/panel/panel_ctrl.ts b/public/app/features/panel/panel_ctrl.ts
index 2eff65f13d8..ec28a08ccfb 100644
--- a/public/app/features/panel/panel_ctrl.ts
+++ b/public/app/features/panel/panel_ctrl.ts
@@ -1,5 +1,6 @@
import _ from 'lodash';
import Remarkable from 'remarkable';
+import { sanitize, escapeHtml } from 'app/core/utils/text';
import config from 'app/core/config';
import { profiler } from 'app/core/core';
@@ -254,30 +255,31 @@ export class PanelCtrl {
}
const linkSrv: LinkSrv = this.$injector.get('linkSrv');
- const sanitize: any = this.$injector.get('$sanitize');
const templateSrv: TemplateSrv = this.$injector.get('templateSrv');
const interpolatedMarkdown = templateSrv.replace(markdown, this.panel.scopedVars);
let html = '
';
- html += new Remarkable().render(interpolatedMarkdown);
+ const md = new Remarkable().render(interpolatedMarkdown);
+ html += config.disableSanitizeHtml ? md : sanitize(md);
if (this.panel.links && this.panel.links.length > 0) {
html += '
';
for (const link of this.panel.links) {
const info = linkSrv.getPanelLinkAnchorInfo(link, this.panel.scopedVars);
+
html +=
'';
}
html += '
';
}
html += '
';
- return sanitize(html);
+ return html;
}
}
diff --git a/public/app/plugins/panel/text/module.ts b/public/app/plugins/panel/text/module.ts
index abea5b39426..8916b813515 100644
--- a/public/app/plugins/panel/text/module.ts
+++ b/public/app/plugins/panel/text/module.ts
@@ -1,7 +1,7 @@
import _ from 'lodash';
import { PanelCtrl } from 'app/plugins/sdk';
import Remarkable from 'remarkable';
-import { sanitize } from 'app/core/utils/text';
+import { sanitize, escapeHtml } from 'app/core/utils/text';
import config from 'app/core/config';
import { auto, ISCEService } from 'angular';
import { TemplateSrv } from 'app/features/templating/template_srv';
@@ -77,12 +77,8 @@ export class TextPanelCtrl extends PanelCtrl {
}
renderText(content: string) {
- content = content
- .replace(/&/g, '&')
- .replace(/>/g, '>')
- .replace(/');
- this.updateContent(content);
+ const safeContent = escapeHtml(content).replace(/\n/g, '
');
+ this.updateContent(safeContent);
}
renderMarkdown(content: string) {