diff --git a/lib/render/html.js b/lib/render/html.js index 4dc2fb58..bef65a66 100644 --- a/lib/render/html.js +++ b/lib/render/html.js @@ -3,7 +3,7 @@ import { escapeXml } from "../common.js"; import Renderer from "./renderer.js"; -var reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i; +var reUnsafeProtocol = /^(?:javascript|vbscript|file|data):/i; var reSafeDataProtocol = /^data:image\/(?:png|gif|jpeg|webp)/i; var potentiallyUnsafe = function(url) { diff --git a/test/test.js b/test/test.js index 34d1546d..53d40270 100755 --- a/test/test.js +++ b/test/test.js @@ -314,6 +314,71 @@ for (var j = 0; j < cases.length; j++) { } cursor.write("\n"); +// safe mode +cursor.write("Safe mode:\n"); + +var writerSafe = new commonmark.HtmlRenderer({ safe: true }); + +var safeCases = [ + { + name: "leading javascript: link is blocked", + input: "[link](javascript:alert(1))\n", + expected: "
\n" + }, + { + name: "leading JAVASCRIPT: link is blocked", + input: "[link](JAVASCRIPT:alert(1))\n", + expected: "\n" + }, + { + name: "leading vbscript: link is blocked", + input: "[link](vbscript:msgbox(1))\n", + expected: "\n" + }, + { + name: "leading file: link is blocked", + input: "[link](file:///etc/passwd)\n", + expected: "\n" + }, + { + name: "leading data:text/html image is blocked", + input: "\n", + expected: '