diff --git a/IPython/html/static/base/js/security.js b/IPython/html/static/base/js/security.js index 583ba0f..648cf03 100644 --- a/IPython/html/static/base/js/security.js +++ b/IPython/html/static/base/js/security.js @@ -19,24 +19,29 @@ IPython.security = (function (IPython) { // Is the html string safe against JavaScript based attacks. This // detects 1) black listed tags, 2) blacklisted attributes, 3) all // event attributes (onhover, onclick, etc.). - var black_tags = ['script', 'style']; + var black_tags = ['script', 'style', 'meta', 'iframe', 'embed']; var black_attrs = ['style']; var wrapped_html = '
'+html+'
'; - var e = $(wrapped_html); + // First try to parse the HTML. All invalid HTML is unsafe. + try { + var bad_elem = $(wrapped_html); + } catch (e) { + return false; + } var safe = true; // Detect black listed tags $.map(black_tags, function (tag, index) { - if (e.find(tag).length > 0) { + if (bad_elem.find(tag).length > 0) { safe = false; } }); // Detect black listed attributes $.map(black_attrs, function (attr, index) { - if (e.find('['+attr+']').length > 0) { + if (bad_elem.find('['+attr+']').length > 0) { safe = false; } }); - e.find('*').each(function (index) { + bad_elem.find('*').each(function (index) { $.map(utils.get_attr_names($(this)), function (attr, index) { if (attr.match('^on')) {safe = false;} }); diff --git a/IPython/html/tests/casperjs/test_cases/security.js b/IPython/html/tests/casperjs/test_cases/security.js new file mode 100644 index 0000000..5aa0b55 --- /dev/null +++ b/IPython/html/tests/casperjs/test_cases/security.js @@ -0,0 +1,35 @@ +safe_tests = [ + "

Hi there

", + '

Hi There!

', + '
Hi There
' +]; + +unsafe_tests = [ + "", + '999', + '999', + '">', + '', + '<', + '