From 2189a9430fb9a7d4c8548c7612508cdf2c176397 Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Fri, 27 Apr 2012 17:44:49 -0400 Subject: [PATCH] Support for safe external scripts via explicit whitelist. Signed-off-by: Edward Z. Yang --- configdoc/usage.xml | 12 +++++-- library/HTMLPurifier.includes.php | 1 + library/HTMLPurifier.safe-includes.php | 1 + library/HTMLPurifier/ConfigSchema/schema.ser | Bin 14690 -> 14784 bytes .../ConfigSchema/schema/HTML.SafeScripting.txt | 10 ++++++ library/HTMLPurifier/HTMLModule/SafeScripting.php | 37 +++++++++++++++++++++ library/HTMLPurifier/HTMLModuleManager.php | 3 ++ .../HTMLPurifier/HTMLModule/SafeScriptingTest.php | 33 ++++++++++++++++++ 8 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt create mode 100644 library/HTMLPurifier/HTMLModule/SafeScripting.php create mode 100644 tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php diff --git a/configdoc/usage.xml b/configdoc/usage.xml index dc79d45f..050d3384 100644 --- a/configdoc/usage.xml +++ b/configdoc/usage.xml @@ -209,16 +209,24 @@ 228 - + 231 + + 17 + - + 234 + + + 237 + + 26 diff --git a/library/HTMLPurifier.includes.php b/library/HTMLPurifier.includes.php index 0ceff6a9..7feecefe 100644 --- a/library/HTMLPurifier.includes.php +++ b/library/HTMLPurifier.includes.php @@ -165,6 +165,7 @@ require 'HTMLPurifier/HTMLModule/Proprietary.php'; require 'HTMLPurifier/HTMLModule/Ruby.php'; require 'HTMLPurifier/HTMLModule/SafeEmbed.php'; require 'HTMLPurifier/HTMLModule/SafeObject.php'; +require 'HTMLPurifier/HTMLModule/SafeScripting.php'; require 'HTMLPurifier/HTMLModule/Scripting.php'; require 'HTMLPurifier/HTMLModule/StyleAttribute.php'; require 'HTMLPurifier/HTMLModule/Tables.php'; diff --git a/library/HTMLPurifier.safe-includes.php b/library/HTMLPurifier.safe-includes.php index d49b196c..e23a81a7 100644 --- a/library/HTMLPurifier.safe-includes.php +++ b/library/HTMLPurifier.safe-includes.php @@ -159,6 +159,7 @@ require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php'; require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php'; require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php'; require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php'; +require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php'; require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php'; require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php'; require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php'; diff --git a/library/HTMLPurifier/ConfigSchema/schema.ser b/library/HTMLPurifier/ConfigSchema/schema.ser index b106bcf798a893df8b98c41068b5fc014d4af770..32a02c4c53bbc1c587e0a3c66800764a1f763323 100644 GIT binary patch delta 133 zcwT!{bf9>GIiuO;|AOmzWi70fJVJbZ^nw%9QiGF=G7CyF^U{^96Rixas%tl|mcPV2 fd7GdIv8tI_7%exiR}K=8!l5$L%3||h<5X4vd*?1( delta 45 wcwReD{HSPxIiu-jd7<^Zo8QTwXP$gb&;!a}{7#;Q(PHy^ + Whether or not to permit script tags to external scripts in documents. + Inline scripting is not allowed, and the script must match an explicit whitelist. +

+--# vim: et sw=4 sts=4 diff --git a/library/HTMLPurifier/HTMLModule/SafeScripting.php b/library/HTMLPurifier/HTMLModule/SafeScripting.php new file mode 100644 index 00000000..e32a6b6c --- /dev/null +++ b/library/HTMLPurifier/HTMLModule/SafeScripting.php @@ -0,0 +1,37 @@ +get('HTML.SafeScripting'); + $script = $this->addElement( + 'script', + 'Inline', + 'Empty', + null, + array( + // While technically not required by the spec, we're forcing + // it to this value. + 'type' => 'Enum#text/javascript', + 'src*' => new HTMLPurifier_AttrDef_Enum(array_keys($allowed)) + ) + ); + $script->attr_transform_pre[] = + $script->attr_transform_post[] = new HTMLPurifier_AttrTransform_ScriptRequired(); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/library/HTMLPurifier/HTMLModuleManager.php b/library/HTMLPurifier/HTMLModuleManager.php index 7a06fc02..21530868 100644 --- a/library/HTMLPurifier/HTMLModuleManager.php +++ b/library/HTMLPurifier/HTMLModuleManager.php @@ -228,6 +228,9 @@ class HTMLPurifier_HTMLModuleManager if ($config->get('HTML.SafeEmbed')) { $modules[] = 'SafeEmbed'; } + if ($config->get('HTML.SafeScripting') !== array()) { + $modules[] = 'SafeScripting'; + } if ($config->get('HTML.Nofollow')) { $modules[] = 'Nofollow'; } diff --git a/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php b/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php new file mode 100644 index 00000000..98b6212f --- /dev/null +++ b/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php @@ -0,0 +1,33 @@ +config->set('HTML.SafeScripting', array('http://localhost/foo.js')); + } + + function testMinimal() { + $this->assertResult( + '', + '' + ); + } + + function testGood() { + $this->assertResult( + '