diff --git a/IPython/html/static/base/js/security.js b/IPython/html/static/base/js/security.js new file mode 100644 index 0000000..583ba0f --- /dev/null +++ b/IPython/html/static/base/js/security.js @@ -0,0 +1,52 @@ +//---------------------------------------------------------------------------- +// Copyright (C) 2014 The IPython Development Team +// +// Distributed under the terms of the BSD License. The full license is in +// the file COPYING, distributed as part of this software. +//---------------------------------------------------------------------------- + +//============================================================================ +// Utilities +//============================================================================ +IPython.namespace('IPython.security'); + +IPython.security = (function (IPython) { + "use strict"; + + var utils = IPython.utils; + + var is_safe = function (html) { + // 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_attrs = ['style']; + var wrapped_html = '
'+html+'
'; + var e = $(wrapped_html); + var safe = true; + // Detect black listed tags + $.map(black_tags, function (tag, index) { + if (e.find(tag).length > 0) { + safe = false; + } + }); + // Detect black listed attributes + $.map(black_attrs, function (attr, index) { + if (e.find('['+attr+']').length > 0) { + safe = false; + } + }); + e.find('*').each(function (index) { + $.map(utils.get_attr_names($(this)), function (attr, index) { + if (attr.match('^on')) {safe = false;} + }); + }) + return safe; + } + + return { + is_safe: is_safe + }; + +}(IPython)); + diff --git a/IPython/html/static/base/js/utils.js b/IPython/html/static/base/js/utils.js index cfd138b..3b59a10 100644 --- a/IPython/html/static/base/js/utils.js +++ b/IPython/html/static/base/js/utils.js @@ -488,6 +488,15 @@ IPython.utils = (function (IPython) { } } + var get_attr_names = function (e) { + // Get the names of all the HTML attributes of the element e. + var el = $(e)[0]; + var arr = []; + for (var i=0, attrs=el.attributes, l=attrs.length; i>>>>>> 8e23f06... Adding security.js with 1st attempt at is_safe. /** * Construct a new TextCell, codemirror mode is by default 'htmlmixed', and cell type is 'text' diff --git a/IPython/html/templates/notebook.html b/IPython/html/templates/notebook.html index 104d4e3..687a288 100644 --- a/IPython/html/templates/notebook.html +++ b/IPython/html/templates/notebook.html @@ -318,6 +318,7 @@ class="notebook_app" +