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',
+ '">',
+ '',
+ '<',
+ '