Switch links to revision logs, because linking directly to the source may be a snapsh...
[htmlpurifier-web.git] / index.xhtml
blob1c6c36acc437e80d6577a5f31796ed0cd3109eaf
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:xi="http://www.w3.org/2001/XInclude"
6 xmlns:xc="urn:xhtml-compiler"
7 xmlns:rss="urn:xhtml-compiler:RSSGenerator"
8 xml:lang="en" lang="en">
9 <head>
10 <title>HTML Purifier - Filter your HTML the standards-compliant way!</title>
11 <xi:include href="common-meta.xml" xpointer="xpointer(/*/node())" />
12 <link rel="stylesheet" href="index.css" type="text/css" />
13 <meta name="description"
14 content="HTML filter that guards against XSS and ensures standards-compliant output." />
15 <meta name="keywords"
16 content="HTMLPurifier, HTML Purifier, HTML, filter, filtering, standards, compliant, w3c, XSS, PHP, security, library, open source, LGPL, whitelist" />
17 <link rel="alternate" type="application/rss+xml"
18 title="News - HTML Purifier" href="news.rss"
19 rss:for="news-container"
20 rss:description="Recent news and updates on HTML Purifier" />
21 </head>
22 <body>
24 <img src="logo.png" id="logo" alt="HTML Purifier" />
25 <h1 id="header"><span class="html">HTML</span>
26 <span class="purifier">Purifier</span></h1>
28 <div id="navigation">
29 <h2>Navigation</h2>
30 <ol>
31 <li><a href="#News">News</a></li>
32 <li><a href="#Plugins">Plugins</a></li>
33 <li><a href="#Demo">Demo</a></li>
34 <li><strong><a href="#Download">Download</a></strong></li>
35 <li><a href="#Resources">Resources</a></li>
36 <li><a href="phorum/">Forum</a></li>
37 <li><a href="#Contact">Contact</a></li>
38 </ol>
39 </div>
41 <div id="content">
43 <a href="#Download"><img src="download.png" class="download-button" alt="Download HTML Purifier" /></a>
45 <p><strong>HTML Purifier</strong> is a standards-compliant
46 <abbr>HTML</abbr> filter library written in
47 <abbr>PHP</abbr>. HTML Purifier will not only remove all malicious
48 code (better known as <abbr>XSS</abbr>) with a thoroughly audited,
49 secure <em>yet</em> permissive <strong><a
50 href="http://hp.jpsband.org/live/smoketests/printDefinition.php">whitelist</a></strong>,
51 it will also make sure your documents are
52 <strong>standards compliant</strong>, something only achievable with a
53 comprehensive knowledge of <abbr>W3C</abbr>'s specifications.
54 Tired of using BBCode due to the current landscape of deficient or
55 insecure <abbr>HTML</abbr> filters? Have a
56 <strong><acronym>WYSIWYG</acronym></strong> editor but never been able to use it? Looking
57 for high-quality, standards-compliant, open-source components for that
58 application you're building? HTML Purifier is for you!</p>
60 <blockquote class="fancy">
61 <div class="quote">
62 I'd just like to say we use HTML Purifier in <a href="http://www.iris.ac/">IRIS</a> for
63 filtering emails against XSS attacks and we've been more than impressed.
64 </div>
65 <div class="origin">&mdash; Chris Corbyn, <em>Senior IRIS Developer</em></div>
66 </blockquote>
68 <h2 id="Background">Background</h2>
70 <p>There are a number of open-source <abbr>HTML</abbr> filtering solutions out
71 there on the web already
72 (i.e. <acronym>PEAR</acronym>'s
73 <a href="http://pear.php.net/package/HTML_Safe">HTML_Safe</a>,
74 <a href="http://sourceforge.net/projects/kses">kses</a>
75 and
76 <a href="http://simon.incutio.com/archive/2003/02/23/safeHtmlChecker">
77 SafeHtmlChecker.class.php</a>). What sets HTML Purifier apart from them?
78 Aren't all of these choices <q>secure</q>?</p>
80 <p>When it comes to <abbr>HTML</abbr>, <strong>attention to
81 detail</strong> is key. Does the library demonstrate an in-depth
82 knowledge of the <abbr>DTD</abbr> that defines
83 <abbr>HTML</abbr>? Does it perform its filtering off a robust
84 whitelist rather than a usually out-dated blacklist? Does it go through
85 the care to check every single attribute in the document for validity?
86 Does it actually understand tag markup, or pay lip-service with a series
87 of deficient regexes and str_replace's?</p>
89 <p>Somewhere along the way, all of HTML Purifier's predecessors fall
90 flat. HTML_Safe dooms itself to attacks of the future by using a
91 blacklist. Configurable filters like kses and PHP Input Filter still
92 cannot validate the contents inside attributes. With all these gaps in
93 coverage, none of the usual libraries come close to achieving
94 <strong>standards-compliance</strong>. There is a user-unfriendly,
95 draconic <abbr>XML</abbr>-based filter called Safe HTML Checker,
96 but even it forgets that <code>&lt;a&gt;</code> tags cannot be nested
97 within each other!</p>
99 <p><strong>Know thy enemy.</strong> Wily hackers have a huge arsenal of
100 <abbr>XSS</abbr> hidden within the depths of the
101 <abbr>HTML</abbr> specification. HTML Purifier takes its
102 effectiveness from the fact that it will decompose the whole document
103 into tokens, and rigorously process the tokens by removing
104 non-whitelisted elements, transforming bad practice tags like font into
105 span, properly checking the nesting of tags and their children and
106 validating all attributes according to their <abbr>RFC</abbr>s.
107 HTML Purifier's comprehensive algorithms are complemented by a
108 <strong>breadth of knowledge</strong>, ensuring that richly formatted
109 documents pass through unstripped.</p>
111 <p><a href="comparison.html"><img src="compare.png" class="compare-button" alt="Compare HTML Purifier with other filters" /></a></p>
113 <p>To my knowledge, there is nothing else in the wild that offers
114 protection from <abbr>XSS</abbr>, standards-compliance, and the
115 corrective processing of poorly formed <abbr>HTML</abbr>
116 simultaneously. Don't take my word for it though:
117 do your research. Investigate the other libraries, and decide for
118 yourself who you would prefer to be the <strong>gatekeeper</strong> to
119 your system.</p>
121 <p>To find out more, you can read the
122 <a href="comparison.html"><strong>Comparison</strong></a>
123 for a play-by-play analysis of the major filter libraries currently
124 out there.</p>
126 <blockquote class="fancy">
127 <div class="quote">
128 [Y]ou save my day by allowing me not to write another damned HTML parser.
129 </div>
130 <div class="origin">
131 &mdash; Joseph Halter, <em>Technical Director at Akira Web</em>
132 </div>
133 </blockquote>
136 <h2 id="News">News</h2>
138 <div id="news-container" class="news">
140 <div class="item" id="news-keep-me-updated">
141 <h3 class="title">A note to you distributors</h3>
142 <div class="date">Wed, 28 March 2007 21:05:12 EDT</div>
144 <div class="body">
145 <p>Yes, <strong>TikiWiki</strong> and <strong>PHProjekt</strong>,
146 I'm looking at you. I am absolutely delighted that these two fairly
147 popular and robust open-source projects are using my library.
148 However, I am not at all pleased at the fact that you have not
149 been keeping up to date with HTML Purifier releases.</p>
150 <ul>
151 <li>TikiWiki: <a href="http://tikiwiki.cvs.sourceforge.net/tikiwiki/tiki/lib/HTMLPurifier.php?view=log">1.3.0</a></li>
152 <li>PHProjekt: <a href="http://thinkforge.org/plugins/scmcvs/cvsweb.php/phprojekt50/lib/html/library/HTMLPurifier.php?cvsroot=phprojekt5">1.3.2</a></li>
153 </ul>
154 <p>I entreat yea, please sign up for the announcement list and
155 keep my library up-to-date! It's not difficult, I keep backwards
156 compatibility, and it makes your users happy! Especially that
157 <acronym>DOM</acronym> <abbr>XML</abbr> bug, which seems was
158 far more serious than I originally thought it was. That is all.</p>
159 </div>
160 </div>
162 <div class="item" id="news-pear-channel">
163 <h3 class="title"><acronym>PEAR</acronym> channel available</h3>
164 <div class="date">Sat, 24 March 2007 20:27:42 EDT</div>
166 <div class="body">
167 <p>At the prompting of Lars Olesen, HTML Purifier now
168 has its very own <acronym>PEAR</acronym> channel. This means that
169 installing HTML Purifier is as simple as:</p>
170 <pre class="command">pear channel-discover hp.jpsband.org
171 pear install hp/HTMLPurifier</pre>
172 </div>
173 </div>
175 <div class="item" id="news-1.5.0-released">
176 <h3 class="title">HTML Purifier 1.5.0 released</h3>
177 <div class="date">Fri, 23 March 2007 22:42:12 EDT</div>
179 <div class="body">
180 <p>The 1.5.0 major bugfix
181 release is available today. There have been some major internal
182 refactoring efforts, but these changes are invisible to you.</p>
184 <p>Entrepid souls wanting to test out the new
185 <code>HTMLModuleManager</code> class can check out the
186 <code>HTMLModule</code>s. Also, I will personally assist anyone
187 who has modified <code>HTMLDefinition.php</code>. <strong>If you
188 have patched any files, please consult the Support forums before
189 upgrading.</strong></p>
191 <p>And now, the goodies:</p>
193 <ul>
194 <li><strong><abbr>XHTML</abbr> 1.1-style modularization of
195 <code>HTMLDefinition</code>.</strong> Instead of one monster,
196 huge <code>HTMLDefinition</code> class, the file has been
197 partitioned into modular bits organized into categories
198 like <q>Hypertext</q>, <q>Lists</q> and <q>Tables</q>. The
199 design of these modules makes it possible to arbitrarily
200 add your own elements without ever having to patch a core
201 file. However, the interface is unintuitive, not
202 documented, and definitely going to change. Keep your eyes
203 on this one.</li>
204 <li>Rudimentary internationalization system implemented. It's
205 not used yet, but will become the foundation of a projected
206 error reporting feature HTML Purifier will be getting soon.</li>
207 <li><code>x</code> subtag now allowed in language codes.</li>
208 <li>Buggy chameleon support for <code>ins</code> and <code>del</code>
209 fixed.</li>
210 <li>Element by element AllowedAttribute declaration now possible
211 for global attributes. Instead of <code>*.class</code>, you can write
212 <code>span.class</code> (the old syntax still works, and enables
213 the attribute for all elements).</li>
214 <li>Fatal error when <abbr>PHP</abbr>4 <acronym>DOM</acronym>
215 <abbr>XML</abbr> extension was loaded now fixed. <strong>Update:</strong>
216 It seems that a lot of users run into this problem, as I know at least
217 five cases. Upgrade to 1.5.0 and it will be fixed, I promise!</li>
218 <li>Youtube filter regexp now multiline.</li>
219 </ul>
220 <p>...as well as an assortment of some code refactoring (all
221 bugfixes are covered above). See <a
222 href="http://hp.jpsband.org/svnroot/htmlpurifier/tags/1.5.0/NEWS">News</a>
223 for a complete changelog.</p>
224 </div>
225 </div>
228 <div class="item" id="news-rss-feed">
229 <h3 class="title"><abbr>RSS</abbr> feed!</h3>
230 <div class="date">Sat, 17 March 2007 5:42:12 EDT</div>
232 <div class="body">
233 <p>We have a shiny new <abbr>RSS</abbr> feed
234 at <a href="news.rss">news.rss</a>, which is hooked up to this
235 news feed. Subscribe for release notifications as well as random
236 news about HTML Purifier.</p>
237 </div>
238 </div>
240 <div class="item" id="news-status-on-api">
241 <h3 class="title">Status on 1.5 and the Advanced <abbr>API</abbr></h3>
242 <div class="date">Wed, 14 March 2007 5:31:46 EDT</div>
244 <div class="body">
245 <p>Quick update on the status of version 1.5. The flagship
246 new feature of this release is to be an advanced system for selecting
247 and creating elements and attributes. You can view the <a
248 href="http://hp.jpsband.org/live/docs/dev-advanced-api.html">projected
249 advanced <abbr>API</abbr> here</a>.</p>
251 <p>If you actually took the time out to scan the document, you may notice
252 that its incomplete. This is a very big problem. I am slowly grinding
253 away at the details, but any suggestions and comments would be
254 greatly appreciated. You can post anything you want to see in the
255 <a href="http://hp.jpsband.org/phorum/list.php?2">general forums</a>.</p>
256 </div>
257 </div>
259 <div class="item" id="news-utf8-tutorial">
260 <h3 class="title"><abbr>UTF-8</abbr> Tutorial</h3>
261 <div class="date">Sat, 27 Jan 2007 13:30:56 EST</div>
263 <div class="body">
264 <p>Here's a tutorial on <a
265 href="http://hp.jpsband.org/live/docs/enduser-utf8.html">HTML Purifier
266 and <abbr>UTF-8</abbr> character encoding issues</a>. It discusses
267 how to figure out your character encoding, why you should
268 <abbr>UTF-8</abbr>, and how to migrate (should you choose to do
269 so). </p>
270 </div>
271 </div>
273 </div> <!-- end news-container -->
275 <h2 id="Plugins">Plugins</h2>
277 <p>HTML Purifier is a great library to integrate with existing
278 <abbr>CMS</abbr>es and other applications or <acronym>WYSIWYG</acronym> editors. Currently, we have plugins
279 for:</p>
281 <ul>
282 <li><a href="http://bart.motd.be/projects/html-purifier-drupal-module">Drupal HTML Purifier Module</a> (beta) by Bart Jansens</li>
283 <li><a href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/plugins/modx.txt">MODx Content Management System</a></li>
284 </ul>
286 <blockquote class="fancy">
287 <div class="quote">
288 This plugin is on top of my favorite list[.] I am going to heavily
289 depend on it since my clients insist on having <acronym>WYSIWYG</acronym> and I insist on
290 having pages that validate and are semantically sound.
291 </div>
292 <div class="origin">
293 &mdash; David Molliere, <em>MODx Marketing &amp; Design Team</em>
294 </div>
295 </blockquote>
297 <p>Plugins for other major applications gladly accepted!</p>
300 <h2 id="Demo">Demo</h2>
302 <p>Enter your <abbr>HTML</abbr> and see how it will be filtered!</p>
303 <form id="filter" action="http://hp.jpsband.org/live/docs/examples/demo.php?post" method="post">
304 <fieldset>
305 <legend>HTML Purifier Input</legend>
306 <textarea name="html" cols="50" rows="10" id="html"></textarea>
307 <div><abbr>XHTML</abbr> 1.0 Strict output? <input type="checkbox" value="1" name="strict" /></div>
308 <div>
309 <input type="submit" value="Submit" name="submit" class="button" />
310 </div>
311 </fieldset>
312 </form>
314 <p>...or try these sample inputs:</p>
316 <ul>
317 <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>
318 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?html=%3Cb%3EBold&amp;submit=Submit">Missing end tags fixed</a></li>
319 <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>
320 <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>
321 <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"><abbr>CSS</abbr> validated</a></li>
322 <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>
323 </ul>
325 <h2 id="Download">Download</h2>
327 <p>The current version is
328 <strong>1.5.0</strong>. Pick your distribution:</p>
330 <ul>
331 <li><a class="download" href="releases/htmlpurifier-1.5.0.tar.gz">HTML Purifier 1.5.0 (.tar.gz)</a> [<a href="releases/htmlpurifier-1.5.0.tar.gz.sig">sig</a>]</li>
332 <li><a class="download" href="releases/htmlpurifier-1.5.0.zip">HTML Purifier 1.5.0 (.zip)</a> [<a href="releases/htmlpurifier-1.5.0.zip.sig">sig</a>]</li>
333 <li><a class="download" href="releases/htmlpurifier-1.5.0-strict.tar.gz">HTML Purifier 1.5.0 PHP5-strict (.tar.gz)</a> [<a href="releases/htmlpurifier-1.5.0-strict.tar.gz.sig">sig</a>]</li>
334 <li><a class="download" href="releases/htmlpurifier-1.5.0-strict.zip">HTML Purifier 1.5.0 PHP5-strict (.zip)</a> [<a href="releases/htmlpurifier-1.5.0-strict.zip.sig">sig</a>]</li>
335 </ul>
337 <p>The <abbr>PHP</abbr>5-strict version is exactly the same
338 as the regular version with a few tweaks
339 to prevent it from complaining with
340 <a href="http://php.net/manual/en/ref.errorfunc.php#e-strict">E_STRICT</a>
341 warnings.This library is open-source, licensed under the
342 <a href="http://www.gnu.org/licenses/lgpl.html"><abbr>LGPL</abbr> v2.1+</a>.</p>
344 <p>HTML Purifier is also available as a <acronym>PEAR</acronym> package.
345 You can install it by executing:</p>
347 <pre class="command">pear channel-discover hp.jpsband.org
348 pear install hp/HTMLPurifier</pre>
350 <p>You can also grab the latest developmental code from our Subversion
351 repository. Simply execute this command:</p>
353 <pre class="command">svn co http://hp.jpsband.org/svnroot/htmlpurifier/trunk ./</pre>
355 <p>...or <a href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/">browse
356 anonymously</a> at that address. Previous releases can be obtained by browsing
357 the <a href="releases/">release directory</a>
358 or checking code out of the
359 <a href="http://hp.jpsband.org/svnroot/htmlpurifier/tags/">tags/
360 directory</a>.</p>
362 <p><acronym>SHA-1</acronym> checksums:</p>
364 <pre>
365 ec0c9cd1f24840a93cc3785e109dad925d8acd8c htmlpurifier-1.5.0-strict.tar.gz
366 c3f48848a33345cfdb01ec61db7dc5e28e4fbef8 htmlpurifier-1.5.0-strict.zip
367 d48dc62acfb26605428e49b4275e8f689cf04439 htmlpurifier-1.5.0.tar.gz
368 e687a1ff0008d0303e9ec964704accdc59ed96ef htmlpurifier-1.5.0.zip
369 </pre>
371 <p>There are also <tt>.sig</tt> files which you can use to cryptographically verify
372 that the release is from me, Edward Z. Yang. You can find
373 my <a href="http://www.thewritingpot.com/gpgpubkey.asc">public key
374 here (0x869C48DA)</a>. My key's fingerprint is:
375 <tt>3FA8 E9A9 7385 B691 A6FC B3CB A933 BE7D 869C 48DA</tt>.</p>
377 <p>Verify with these commands:</p>
379 <pre class="command">gpg --verify <strong>$filename</strong>.sig</pre>
381 <p>You can be notified of new releases by a low-traffic announce list. Subscribe
382 here:</p>
384 <form method="post" action="http://scripts.dreamhost.com/add_list.cgi">
385 <input type="hidden" name="list" value="htmlpurifier@jpsband.org" />
386 <input type="hidden" name="domain" value="jpsband.org" />
387 <input type="hidden" name="emailit" value="1" />
388 <div>Name: <input name="name" /> E-mail: <input name="email" /></div>
389 <div><input type="submit" name="submit" value="Suscribe to Announcement List" />
390 <input type="submit" name="unsub" value="Unsubscribe" /></div>
391 </form>
393 <h2 id="Resources">Resources</h2>
394 <ul>
395 <li><strong><a href="http://hp.jpsband.org/live/docs/">End-User
396 Documentation</a></strong> &mdash; In-depth documents on how to get
397 the most out of HTML Purifier.</li>
398 <li><a href="mantis/">Mantis Bugtracker</a> &mdash; Found a bug? Report
399 it here!</li>
400 <li><a href="phorum/">Support Forum</a> &mdash; Talk about all things
401 HTML Purifier.</li>
402 <li><a href="http://hp.jpsband.org/live/smoketests/printDefinition.php">Print
403 Definition</a> &mdash; If you want to actually see what HTML Purifier's
404 filtering rules are, look no further than to this page. You can even
405 experiment with the configuration to see how things respond to different
406 directives.</li>
407 <li><a href="http://hp.jpsband.org/live/smoketests/xssAttacks.php"><abbr>XSS</abbr>
408 Attacks Smoketest</a> &mdash; Tests how well HTML Purifier fares
409 against RSnake's famous cheatsheet of <abbr>XSS</abbr> attacks.</li>
410 <li><a href="http://hp.jpsband.org/live/TODO">Roadmap</a>
411 &mdash; Subject to lots of delays, but it's a glimpse of the future</li>
412 <li><a href="http://hp.jpsband.org/live/art/">Artwork</a>
413 &mdash; Extra media goodies.</li>
414 <li><a href="http://hp.jpsband.org/live/configdoc/plain.html">Configuration
415 documentation</a> &mdash; See the <code>INSTALL</code> document on how to
416 configure your HTML Purifier installation.</li>
417 <li><a href="http://hp.jpsband.org/doxygen/html/">Doxygen-generated
418 Documentation</a> &mdash; No class left undocumented! Cross-referenced
419 code! A must-read for any prospective HTML Purifier hacker.
420 (close by, <a href="http://hp.jpsband.org/phpdoc/">PHPDoc-generated
421 Documentation.</a>)</li>
422 </ul>
424 <h2 id="Propaganda">Spread the Word!</h2>
426 <p>Help spread awareness about HTML Purifier by:</p>
428 <ul>
429 <li><a
430 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!"
431 id="delicious">Bookmarking this website</a> on your <strong>del.icio.us</strong> account, and/or</li>
432 <li>
433 <div>Including this little <strong>label</strong> on your website:
434 <a href="http://hp.jpsband.org/"><img
435 src="http://hp.jpsband.org/live/art/powered.png"
436 alt="Powered by HTML Purifier" border="0" /></a>, with this code:
437 </div>
438 <pre>&lt;a href=&quot;http://hp.jpsband.org/&quot;&gt;&lt;img
439 src=&quot;http://hp.jpsband.org/live/art/powered.png&quot;
440 alt=&quot;Powered by HTML Purifier&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</pre>
441 </li>
442 </ul>
444 <h2 id="Contact">Contact</h2>
446 <p>You can send me an email at
447 <a href="mailto:htmlpurifier@jpsband.org">htmlpurifier@jpsband.org</a>.
448 However, I prefer that you use the forums for asking general support
449 questions (response time will be the same, I promise!)
450 Any emails I receive will be considered public: if I think a
451 solution I thought up to help you would be particularly useful to others,
452 expect it to show up on the website.</p>
454 </div>
456 </body>
457 </html>