Test commit.
[htmlpurifier-web.git] / index.xhtml
blob496324114dfb292e637b29e3669b27531640adcd
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml"
5 xmlns:rss="urn:xhtml-compiler:RSSGenerator"
6 xml:lang="en" lang="en">
7 <head>
8 <title>HTML Purifier - Filter your HTML the standards-compliant way!</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
10 <meta name="description" content="HTML filter that guards against XSS and ensures standards-compliant output." />
11 <meta name="keywords" content="HTMLPurifier, HTML Purifier, HTML, filter, filtering, standards, compliant, w3c, XSS, PHP, security, library, open source, LGPL, whitelist" />
12 <meta name="author" content="Edward Z. Yang" />
13 <link rel="icon" href="favicon.ico" type="image/x-icon" />
14 <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
15 <link rel="stylesheet" href="style.css" type="text/css" />
16 <link rel="alternate" type="application/rss+xml"
17 title="News - HTML Purifier" href="news.rss"
18 rss:for="news-container"
19 rss:description="Recent news and updates on HTML Purifier" />
20 <!--[if lt IE 7.]><script defer="defer" type="text/javascript" src="pngfix.js"></script><![endif]-->
21 <script defer="defer" type="text/javascript" src="del.icio.us.js"></script>
22 <script defer="defer" type="text/javascript" src="switch2post.js"></script>
23 </head>
24 <body>
26 <img src="logo.png" id="logo" alt="HTML Purifier" />
27 <h1 id="header"><span class="html">HTML</span>
28 <span class="purifier">Purifier</span></h1>
30 <div id="navigation">
31 <h2>Navigation</h2>
32 <ol>
33 <li><a href="#News">News</a></li>
34 <li><a href="#Plugins">Plugins</a></li>
35 <li><a href="#Demo">Demo</a></li>
36 <li><strong><a href="#Download">Download</a></strong></li>
37 <li><a href="#Resources">Resources</a></li>
38 <li><a href="phorum/">Forum</a></li>
39 <li><a href="#Contact">Contact</a></li>
40 </ol>
41 </div>
43 <div id="content">
45 <a href="#Download"><img src="download.png" class="download-button" alt="Download HTML Purifier" /></a>
47 <p class="lead"><strong>HTML Purifier</strong> is a standards-compliant
48 <acronym>HTML</acronym> filter library written in
49 <acronym>PHP</acronym>. HTML Purifier will not only remove all malicious
50 code (better known as <acronym>XSS</acronym>) with a thoroughly audited,
51 secure <em>yet</em> permissive <strong><a
52 href="http://hp.jpsband.org/live/smoketests/printDefinition.php">whitelist</a></strong>,
53 it will also make sure your documents are
54 <strong>standards compliant</strong>, something only achievable with a
55 comprehensive knowledge of <acronym>W3C</acronym>'s specifications.
56 Tired of using BBCode due to the current landscape of deficient or
57 insecure <acronym>HTML</acronym> filters? Have a
58 <strong>WYSIWYG</strong> editor but never been able to use it? Looking
59 for high-quality, standards-compliant, open-source components for that
60 application you're building? HTML Purifier is for you!</p>
62 <blockquote class="fancy">
63 <div class="quote">
64 I'd just like to say we use HTML Purifier in <a href="http://www.iris.ac/">IRIS</a> for
65 filtering emails against XSS attacks and we've been more than impressed.
66 </div>
67 <div class="origin">&mdash; Chris Corbyn, <em>Senior IRIS Developer</em></div>
68 </blockquote>
70 <h2 id="Background">Background</h2>
72 <p class="lead">There are a number of open-source <acronym>HTML</acronym> filtering solutions out
73 there on the web already
74 (i.e. <acronym>PEAR</acronym>'s
75 <a href="http://pear.php.net/package/HTML_Safe">HTML_Safe</a>,
76 <a href="http://sourceforge.net/projects/kses">kses</a>
77 and
78 <a href="http://simon.incutio.com/archive/2003/02/23/safeHtmlChecker">
79 SafeHtmlChecker.class.php</a>). What sets HTML Purifier apart from them?
80 Aren't all of these choices <q>secure</q>?</p>
82 <p>When it comes to <acronym>HTML</acronym>, <strong>attention to
83 detail</strong> is key. Does the library demonstrate an in-depth
84 knowledge of the <acronym>DTD</acronym> that defines
85 <acronym>HTML</acronym>? Does it perform its filtering off a robust
86 whitelist rather than a usually out-dated blacklist? Does it go through
87 the care to check every single attribute in the document for validity?
88 Does it actually understand tag markup, or pay lip-service with a series
89 of deficient regexes and str_replace's?</p>
91 <p>Somewhere along the way, all of HTML Purifier's predecessors fall
92 flat. HTML_Safe dooms itself to attacks of the future by using a
93 blacklist. Configurable filters like kses and PHP Input Filter still
94 cannot validate the contents inside attributes. With all these gaps in
95 coverage, none of the usual libraries come close to achieving
96 <strong>standards-compliance</strong>. There is a user-unfriendly,
97 draconic <acronym>XML</acronym>-based filter called Safe HTML Checker,
98 but even it forgets that <code>&lt;a&gt;</code> tags cannot be nested
99 within each other!</p>
101 <p><strong>Know thy enemy.</strong> Wily hackers have a huge arsenal of
102 <acronym>XSS</acronym> hidden within the depths of the
103 <acronym>HTML</acronym> specification. HTML Purifier takes its
104 effectiveness from the fact that it will decompose the whole document
105 into tokens, and rigorously process the tokens by removing
106 non-whitelisted elements, transforming bad practice tags like font into
107 span, properly checking the nesting of tags and their children and
108 validating all attributes according to their <acronym>RFC</acronym>s.
109 HTML Purifier's comprehensive algorithms are complemented by a
110 <strong>breadth of knowledge</strong>, ensuring that richly formatted
111 documents pass through unstripped.</p>
113 <a href="comparison.html"><img src="compare.png" class="compare-button" alt="Compare HTML Purifier with other filters" /></a>
115 <p>To my knowledge, there is nothing else in the wild that offers
116 protection from <acronym>XSS</acronym>, standards-compliance, and the
117 corrective processing of poorly formed <acronym>HTML</acronym>
118 simultaneously. Don't take my word for it though:
119 do your research. Investigate the other libraries, and decide for
120 yourself who you would prefer to be the <strong>gatekeeper</strong> to
121 your system.</p>
123 <p>To find out more, you can read the
124 <a href="comparison.html"><strong>Comparison</strong></a>
125 for a play-by-play analysis of the major filter libraries currently
126 out there.</p>
128 <blockquote class="fancy">
129 <div class="quote">
130 [Y]ou save my day by allowing me not to write another damned HTML parser.
131 </div>
132 <div class="origin">
133 &mdash; Joseph Halter, <em>Technical Director at Akira Web</em>
134 </div>
135 </blockquote>
138 <h2 id="News">News</h2>
140 <div id="news-container" class="news">
142 <div class="item" id="news-rss-feed">
143 <h3 class="title"><acronym>RSS</acronym> feed!</h3>
144 <div class="date">Sat, 17 March 2007 5:42:12 EDT</div>
146 <div class="body">
147 <p class="lead">We have a shiny new <acronym>RSS</acronym> feed
148 at <a href="news.rss">news.rss</a>, which is hooked up to this
149 news feed. Subscribe for release notifications as well as random
150 news about HTML Purifier.</p>
151 </div>
152 </div>
154 <div class="item" id="news-status-on-api">
155 <h3 class="title">Status on 1.5 and the Advanced <acronym>API</acronym></h3>
156 <div class="date">Wed, 14 March 2007 5:31:46 EDT</div>
158 <div class="body">
159 <p class="lead">Quick update on the status of version 1.5. The flagship
160 new feature of this release is to be an advanced system for selecting
161 and creating elements and attributes. You can view the <a
162 href="http://hp.jpsband.org/live/docs/dev-advanced-api.html">projected
163 advanced <acronym>API</acronym> here</a>.</p>
165 <p>If you actually took the time out to scan the document, you may notice
166 that its incomplete. This is a very big problem. I am slowly grinding
167 away at the details, but any suggestions and comments would be
168 greatly appreciated. You can post anything you want to see in the
169 <a href="http://hp.jpsband.org/phorum/list.php?2">general forums</a>.</p>
170 </div>
171 </div>
173 <div class="item" id="news-utf8-tutorial">
174 <h3 class="title"><acronym>UTF-8</acronym> Tutorial</h3>
175 <div class="date">Sat, 27 Jan 2007 13:30:56 EST</div>
177 <div class="body">
178 <p class="lead">Here's a tutorial on <a
179 href="http://hp.jpsband.org/live/docs/enduser-utf8.html">HTML Purifier
180 and <acronym>UTF-8</acronym> character encoding issues</a>. It discusses
181 how to figure out your character encoding, why you should
182 <acronym>UTF-8</acronym>, and how to migrate (should you choose to do
183 so). </p>
184 </div>
185 </div>
187 <div class="item" id="news-1.4.1-released">
188 <h3 class="title">HTML Purifier 1.4.1 released</h3>
189 <div class="date">Sun, 21 Jan 2007 17:18:01 EST</div>
191 <div class="body">
192 <blockquote>This release supersedes the 1.4.0 release
193 on the same day. </blockquote>
195 <p class="lead">1.4.1 major feature release available today.
196 The goodies: </p>
198 <ul>
199 <li><strong><acronym>PHP</acronym>5 E_STRICT mode
200 supported.</strong> See download section for alternate
201 package.</li>
202 <li><strong>CSS properties 'list-style-image', 'background-image',
203 'background-repeat', 'background-attachment' and
204 'background-position' implemented</strong>. </li>
205 <li>You can now use %Core.EscapeNonASCIICharacters to workaround
206 HTML Purifier's tendency to remove all characters that an
207 encoding does not support. This does not apply to users who
208 have stayed with <acronym>UTF-8</acronym>. </li>
209 <li>YouTube preservation code is now part of the core. You can see
210 an example at <a
211 href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/smoketests/preserveYouTube.php">smoketests/preserveYouTube.php</a>.
212 </li>
213 <li>You can now create a configuration object from an
214 <acronym>INI</acronym> file using
215 <code>HTMLPurifier_Config::create( $ini_filename );</code> </li>
216 </ul>
218 <p class="lead">There were also a one fixed bug, where HTML Purifier
219 would stop working if <acronym>PHP</acronym>5 did not have
220 <acronym>DOM</acronym> installed. See <a
221 href="http://hp.jpsband.org/svnroot/htmlpurifier/tags/1.4.1/NEWS">News</a>
222 for a complete changelog. </p>
224 <p>Future work will cover implementing deprecated attributes and letting
225 users preserve them rather than transform them into the
226 <acronym>CSS</acronym> equivalents as well as error logging and
227 <acronym>XSS</acronym> attempt detection. </p>
228 </div>
229 </div>
231 <div class="item" id="news-teracc-review">
232 <h3 class="title">Japanese Review</h3>
233 <div class="date">Sun, 07 Jan 2007 13:55:01 EST</div>
235 <div class="body">
236 <p class="lead">Japanese users may want to check out
237 <a href="http://d.hatena.ne.jp/teracc/20070105">teracc's post on HTML
238 Purifier.</a> Provides a very good overview of the library, especially
239 if English is not your best language. </p>
241 <p>teracc raises some very important objections about the library,
242 including the inability of HTML Purifier to accept table attributes
243 designating things like color and width, tabindex and accesskey for
244 a tags, and the background-image <acronym>CSS</acronym> key. HTML
245 Purifier also cannot accept non-<acronym>ASCII</acronym> characters
246 in font-names. </p>
248 <p>The two main disadvantages, the post concludes, are that HTML
249 Purifier ignores non-standard <acronym>HTML</acronym> rather than
250 refusing them (as well as the fact that it really isn't validating to
251 the specification, it's using a more restrictive specification) and
252 that <acronym>CPU</acronym>/memory usage by the library is high. </p>
254 <p>These notes are all correct. Here are some replies: </p>
256 <ul>
257 <li>Table attributes: they're deprecated, so they're not terribly
258 high priority for me to implement, but I understand they are
259 commonly used and will move to implement them. </li>
260 <li>tabindex and accesskey: dangerous <acronym>UI</acronym>
261 attributes that I specifically decided not to allow. If anyone
262 an convince me why they'd be a good idea I'll consider
263 implementing them. </li>
264 <li><del>background-image: never got around to implementing it,
265 now that resource <acronym>URI</acronym> restrictions are
266 possible, this is something I'll add.</del> Implemented with
267 1.4.0. </li>
268 <li>Non-ASCII characters not allowed in font names: Never thought this
269 would be a problem! In terms of web accessibility, picking these
270 sorts of fonts probably wouldn't be a good idea since most people
271 wouldn't have them, but I'll see what I can do. </li>
272 <li>Ignoring versus refusing: I'm not exactly I understood what teracc
273 was saying here. This would fall into the realm of XSS-detection,
274 which has been requested before and is something I've been
275 playing around with. </li>
276 <li>Not validating to the specification: Of course I can't validate
277 to it directly, that would be insecure. I'll clarify this in the
278 documentation. </li>
279 <li><acronym>CPU</acronym>/Memory usage high: Precisely why you
280 need to cache HTML Purifier's output. </li>
281 </ul>
282 </div>
283 </div>
285 </div> <!-- end news-container -->
287 <h2 id="Plugins">Plugins</h2>
289 <p class="lead">HTML Purifier is a great library to integrate with existing
290 <acronym>CMS</acronym>es and other applications or <acronym>WYSIWYG</acronym> editors. Currently, we have plugins
291 for:</p>
293 <ul>
294 <li><a href="http://bart.motd.be/projects/html-purifier-drupal-module">Drupal HTML Purifier Module</a> (beta) by Bart Jansens</li>
295 <li><a href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/plugins/modx.txt">MODx Content Management System</a></li>
296 </ul>
298 <blockquote class="fancy">
299 <div class="quote">
300 This plugin is on top of my favorite list[.] I am going to heavily
301 depend on it since my clients insist on having <acronym>WYSIWYG</acronym> and I insist on
302 having pages that validate and are semantically sound.
303 </div>
304 <div class="origin">
305 &mdash; David Molliere, <em>MODx Marketing &amp; Design Team</em>
306 </div>
307 </blockquote>
309 <p class="lead">Plugins for other major applications gladly accepted!</p>
312 <h2 id="Demo">Demo</h2>
314 <p class="lead">Enter your <acronym>HTML</acronym> and see how it will be filtered!</p>
315 <form id="filter" action="http://hp.jpsband.org/live/docs/examples/demo.php?post" method="post">
316 <fieldset>
317 <legend>HTML Purifier Input</legend>
318 <textarea name="html" cols="50" rows="10" id="html"></textarea>
319 <div><acronym>XHTML</acronym> 1.0 Strict output? <input type="checkbox" value="1" name="strict" /></div>
320 <div>
321 <input type="submit" value="Submit" name="submit" class="button" />
322 </div>
323 </fieldset>
324 </form>
326 <p class="lead">...or try these sample inputs:</p>
328 <ul>
329 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?get&amp;html=%3Cimg+src%3D%22javascript%3Aevil%28%29%3B%22+onload%3D%22evil%28%29%3B%22+%2F%3E">Malicious code removed</a></li>
330 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?html=%3Cb%3EBold&amp;submit=Submit">Missing end tags fixed</a></li>
331 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?html=%3Cb%3EInline+%3Cdel%3Econtext+%3Cdiv%3ENo+block+allowed%3C%2Fdiv%3E%3C%2Fdel%3E%3C%2Fb%3E&amp;submit=Submit">Illegal nesting fixed</a></li>
332 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?html=%3Ccenter%3ECentered%3C%2Fcenter%3E&amp;strict=1&amp;submit=Submit">Deprecated tags converted</a></li>
333 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?html=%3Cspan+style%3D%22color%3A%23COW%3Bfloat%3Aaround%3Btext-decoration%3Ablink%3B%22%3EText%3C%2Fspan%3E&amp;submit=Submit"><acronym>CSS</acronym> validated</a></li>
334 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?html=%3Ctable%3E%0D%0A++%3Ccaption%3E%0D%0A++++Cool+table%0D%0A++%3C%2Fcaption%3E%0D%0A++%3Ctfoot%3E%0D%0A++++%3Ctr%3E%0D%0A++++++%3Cth%3EI+can+do+so+much%21%3C%2Fth%3E%0D%0A++++%3C%2Ftr%3E%0D%0A++%3C%2Ftfoot%3E%0D%0A++%3Ctr%3E%0D%0A++++%3Ctd+style%3D%22font-size%3A16pt%3B%0D%0A++++++color%3A%23F00%3Bfont-family%3Asans-serif%3B%0D%0A++++++text-align%3Acenter%3B%22%3EWow%3C%2Ftd%3E%0D%0A++%3C%2Ftr%3E%0D%0A%3C%2Ftable%3E&amp;submit=Submit">Rich formatting preserved</a></li>
335 </ul>
337 <h2 id="Download">Download</h2>
339 <p class="lead">The current version is
340 <strong>1.4.1</strong>. Pick your distribution:</p>
342 <ul>
343 <li><a class="download" href="releases/htmlpurifier-1.4.1.tar.gz">HTML Purifier 1.4.1 (.tar.gz)</a> [<a href="releases/htmlpurifier-1.4.1.tar.gz.sig">sig</a>]</li>
344 <li><a class="download" href="releases/htmlpurifier-1.4.1.zip">HTML Purifier 1.4.1 (.zip)</a> [<a href="releases/htmlpurifier-1.4.1.zip.sig">sig</a>]</li>
345 <li><a class="download" href="releases/htmlpurifier-1.4.1-strict.tar.gz">HTML Purifier 1.4.1 PHP5-strict (.tar.gz)</a> [<a href="releases/htmlpurifier-1.4.1-strict.tar.gz.sig">sig</a>]</li>
346 <li><a class="download" href="releases/htmlpurifier-1.4.1-strict.zip">HTML Purifier 1.4.1 PHP5-strict (.zip)</a> [<a href="releases/htmlpurifier-1.4.1-strict.zip.sig">sig</a>]</li>
347 </ul>
349 <p class="lead">The <acronym>PHP</acronym>5-strict version is exactly the same
350 as the regular version with a few tweaks
351 to prevent it from complaining about
352 E_STRICT warnings.This library is open-source, licensed under the
353 <a href="http://www.gnu.org/licenses/lgpl.html"><acronym>LGPL</acronym> v2.1+</a>.</p>
355 <p>You can also grab the latest developmental code from our Subversion
356 repository. Simply execute this command:</p>
358 <pre class="command">svn co http://hp.jpsband.org/svnroot/htmlpurifier/trunk ./</pre>
360 <p>...or <a href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/">browse
361 anonymously</a> at that address. Previous releases can be obtained by browsing
362 the <a href="releases/">release directory</a>
363 or checking code out of the
364 <a href="http://hp.jpsband.org/svnroot/htmlpurifier/tags/">tags/
365 directory</a>.</p>
367 <p><acronym>SHA-1</acronym> checksums:</p>
369 <pre>
370 c82945de51555a9c8bd6352561977cfa029f2054 htmlpurifier-1.4.1.tar.gz
371 de67ac0768e634d79e14426c77acacee58e2a7c4 htmlpurifier-1.4.1.zip
372 6f2f127b830801b3720991ea382c34470407ecf0 htmlpurifier-1.4.1-strict.tar.gz
373 070542122837c18818a1cb5e46de19fd3a576bc6 htmlpurifier-1.4.1-strict.zip
374 </pre>
376 <p>There are also <tt>.sig</tt> files which you can use to cryptographically verify
377 that the release is from me, Edward Z. Yang. You can find
378 my <a href="http://www.thewritingpot.com/gpgpubkey.asc">public key
379 here (0x869C48DA)</a>. My key's fingerprint is:
380 <tt>3FA8 E9A9 7385 B691 A6FC B3CB A933 BE7D 869C 48DA</tt>.</p>
382 <p>Verify with these commands:</p>
384 <pre class="command">gpg --verify <strong>$filename</strong>.sig</pre>
386 <p class="lead">You can be notified of new releases by a low-traffic announce list. Subscribe
387 here:</p>
389 <form method="post" action="http://scripts.dreamhost.com/add_list.cgi">
390 <input type="hidden" name="list" value="htmlpurifier@jpsband.org" />
391 <input type="hidden" name="domain" value="jpsband.org" />
392 <input type="hidden" name="emailit" value="1" />
393 <div>Name: <input name="name" /> E-mail: <input name="email" /></div>
394 <div><input type="submit" name="submit" value="Suscribe to Announcement List" />
395 <input type="submit" name="unsub" value="Unsubscribe" /></div>
396 </form>
398 <h2 id="Resources">Resources</h2>
399 <ul>
400 <li><strong><a href="http://hp.jpsband.org/live/docs/">End-User
401 Documentation</a></strong> &mdash; In-depth documents on how to get
402 the most out of HTML Purifier.</li>
403 <li><a href="mantis/">Mantis Bugtracker</a> &mdash; Found a bug? Report
404 it here!</li>
405 <li><a href="phorum/">Support Forum</a> &mdash; Talk about all things
406 HTML Purifier.</li>
407 <li><a href="http://hp.jpsband.org/live/smoketests/printDefinition.php">Print
408 Definition</a> &mdash; If you want to actually see what HTML Purifier's
409 filtering rules are, look no further than to this page. You can even
410 experiment with the configuration to see how things respond to different
411 directives.</li>
412 <li><a href="http://hp.jpsband.org/live/smoketests/xssAttacks.php"><acronym>XSS</acronym>
413 Attacks Smoketest</a> &mdash; Tests how well HTML Purifier fares
414 against RSnake's famous cheatsheet of <acronym>XSS</acronym> attacks.</li>
415 <li><a href="http://hp.jpsband.org/live/TODO">Roadmap</a>
416 &mdash; Subject to lots of delays, but it's a glimpse of the future</li>
417 <li><a href="http://hp.jpsband.org/live/art/">Artwork</a>
418 &mdash; Extra media goodies.</li>
419 <li><a href="http://hp.jpsband.org/live/configdoc/plain.html">Configuration
420 documentation</a> &mdash; See the <code>INSTALL</code> document on how to
421 configure your HTML Purifier installation.</li>
422 <li><a href="http://hp.jpsband.org/doxygen/html/">Doxygen-generated
423 Documentation</a> &mdash; No class left undocumented! Cross-referenced
424 code! A must-read for any prospective HTML Purifier hacker.
425 (close by, <a href="http://hp.jpsband.org/phpdoc/">PHPDoc-generated
426 Documentation.</a>)</li>
427 </ul>
429 <h2 id="Propaganda">Spread the Word!</h2>
431 <p class="lead">Help spread awareness about HTML Purifier by:</p>
433 <ul>
434 <li><a
435 href="http://del.icio.us/post?v=4&amp;noui&amp;url=http://hp.jpsband.org/&amp;title=HTML%20Purifier%20-%20Filter%20your%20HTML%20the%20standards-compliant%20way!"
436 id="delicious">Bookmarking this website</a> on your <strong>del.icio.us</strong> account, and/or</li>
437 <li>
438 <div>Including this little <strong>label</strong> on your website:
439 <a href="http://hp.jpsband.org/"><img
440 src="http://hp.jpsband.org/live/art/powered.png"
441 alt="Powered by HTML Purifier" border="0" /></a>, with this code:
442 </div>
443 <pre>&lt;a href=&quot;http://hp.jpsband.org/&quot;&gt;&lt;img
444 src=&quot;http://hp.jpsband.org/live/art/powered.png&quot;
445 alt=&quot;Powered by HTML Purifier&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</pre>
446 </li>
447 </ul>
449 <h2 id="Contact">Contact</h2>
451 <p class="lead">You can send me an email at
452 <a href="mailto:htmlpurifier@jpsband.org">htmlpurifier@jpsband.org</a>.
453 However, I prefer that you use the forums for asking general support
454 questions (response time will be the same, I promise!)
455 Any emails I receive will be considered public: if I think a
456 solution I thought up to help you would be particularly useful to others,
457 expect it to show up on the website.</p>
459 </div>
461 </body>
462 </html>