147 lines
3.3 KiB
Plaintext
Raw Normal View History

2020-06-30 12:50:28 +02:00
include::../description.adoc[]
include::../ask-yourself.adoc[]
include::../recommended.adoc[]
== Sensitive Code Example
https://www.npmjs.com/package/mustache[mustache.js] template engine:
2020-06-30 12:50:28 +02:00
----
let Mustache = require("mustache");
Mustache.escape = function(text) {return text;}; // Sensitive
2020-06-30 12:50:28 +02:00
let rendered = Mustache.render(template, { name: inputName });
----
https://www.npmjs.com/package/handlebars[handlebars.js] template engine:
2020-06-30 12:50:28 +02:00
----
const Handlebars = require('handlebars');
let source = "<p>attack {{name}}</p>";
let template = Handlebars.compile(source, { noEscape: true }); // Sensitive
----
https://www.npmjs.com/package/markdown-it[markdown-it] markup language parser:
2020-06-30 12:50:28 +02:00
----
const markdownIt = require('markdown-it');
let md = markdownIt({
html: true // Sensitive
});
let result = md.render('# <b>attack</b>');
----
https://www.npmjs.com/package/marked[marked] markup language parser:
2020-06-30 12:50:28 +02:00
----
const marked = require('marked');
marked.setOptions({
renderer: new marked.Renderer(),
sanitize: false // Sensitive
});
console.log(marked("# test <b>attack/b>"));
----
https://www.npmjs.com/package/kramed[kramed] markup language parser:
2020-06-30 12:50:28 +02:00
----
let kramed = require('kramed');
var options = {
renderer: new kramed.Renderer({
sanitize: false // Sensitive
})
};
2020-06-30 12:50:28 +02:00
----
== Compliant Solution
https://www.npmjs.com/package/mustache[mustache.js] template engine:
2022-02-04 17:28:24 +01:00
[source,javascript]
2020-06-30 12:50:28 +02:00
----
let Mustache = require("mustache");
let rendered = Mustache.render(template, { name: inputName }); // Compliant autoescaping is on by default
----
https://www.npmjs.com/package/handlebars[handlebars.js] template engine:
2022-02-04 17:28:24 +01:00
[source,javascript]
2020-06-30 12:50:28 +02:00
----
const Handlebars = require('handlebars');
let source = "<p>attack {{name}}</p>";
let data = { "name": "<b>Alan</b>" };
let template = Handlebars.compile(source); // Compliant by default noEscape is set to false
----
https://www.npmjs.com/package/markdown-it[markdown-it] markup language parser:
2022-02-04 17:28:24 +01:00
[source,javascript]
2020-06-30 12:50:28 +02:00
----
let md = require('markdown-it')(); // Compliant by default html is set to false
let result = md.render('# <b>attack</b>');
----
https://www.npmjs.com/package/marked[marked] markup language parser:
2022-02-04 17:28:24 +01:00
[source,javascript]
2020-06-30 12:50:28 +02:00
----
const marked = require('marked');
marked.setOptions({
renderer: new marked.Renderer()
}); // Compliant by default sanitize is set to true
console.log(marked("# test <b>attack/b>"));
----
https://www.npmjs.com/package/kramed[kramed] markup language parser:
2022-02-04 17:28:24 +01:00
[source,javascript]
2020-06-30 12:50:28 +02:00
----
let kramed = require('kramed');
let options = {
renderer: new kramed.Renderer({
sanitize: true // Compliant
})
};
console.log(kramed('Attack [xss?](javascript:alert("xss")).', options));
----
include::../see.adoc[]
ifdef::env-github,rspecator-view[]
'''
== Implementation Specification
(visible only on this page)
include::../message.adoc[]
'''
== Comments And Links
(visible only on this page)
=== on 14 May 2019, 22:07:46 Lars Svensson wrote:
Reference:
https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml
=== on 10 Sep 2019, 08:28:46 Alexandre Gigleux wrote:
Angular case should also be covered by this rule:
* \https://docs.angularjs.org/api/ng/service/$sce#trustAsHtml
* \https://angular.io/api/platform-browser/DomSanitizer#bypassSecurityTrustHtml
include::../comments-and-links.adoc[]
endif::env-github,rspecator-view[]