1 [[!template id=plugin name=htmlscrubber core=1 author="[[Joey]]"]]
4 This plugin is enabled by default. It sanitizes the html on pages it renders
5 to avoid XSS attacks and the like.
7 It excludes all html tags and attributes except for those that are
8 whitelisted using the same lists as used by Mark Pilgrim's Universal Feed
9 Parser, documented at <http://feedparser.org/docs/html-sanitization.html>.
10 Notably it strips `style` and `link` tags, and the `style` attribute.
12 All attributes that can be used to specify an url are checked to make sure
13 that the url is in a known, safe scheme, and to block embedded javascript
16 It uses the [[!cpan HTML::Scrubber]] perl module to perform its html
17 sanitisation, and this perl module also deals with various entity encoding
20 While I believe that this makes ikiwiki as resistant to malicious html
21 content as anything else on the web, I cannot guarantee that it will
22 actually protect every user of every browser from every browser security
23 hole, badly designed feature, etc. I can provide NO WARRANTY, like it says
24 in ikiwiki's [[GPL]] license.
26 The web's security model is *fundamentally broken*; ikiwiki's html
27 sanitisation is only a patch on the underlying gaping hole that is your web
30 Note that enabling or disabling the htmlscrubber plugin also affects some
31 other HTML-related functionality, such as whether [[meta]] allows
32 potentially unsafe HTML tags.
34 The `htmlscrubber_skip` configuration setting can be used to skip scrubbing
35 of some pages. Set it to a [[PageSpec]], such as "!*/Discussion", and pages
36 matching that can have all the evil CSS, JavsScript, and unsafe html
37 elements you like. One safe way to use this is to use [[lockedit]] to lock
38 those pages, so only admins can edit them.
42 Some examples of embedded javascript that won't be let through when this
45 * script tag test <script>window.location='http://example.org';</script>
46 * <span style="background: url(javascript:window.location='http://example.org/')">CSS script test</span>
47 * <span style="any: expression(window.location='http://example.org/')">entity-encoded CSS script test</span>
48 * <span style="any: expression(window.location='http://example.org/')">entity-encoded CSS script test</span>
49 * <a href="javascript:alert('foo')">click me</a>