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 <!ENTITY % htmlpurifier.current SYSTEM
"current.ent"> %htmlpurifier.current;
6 <html xmlns=
"http://www.w3.org/1999/xhtml"
7 xmlns:
xi=
"http://www.w3.org/2001/XInclude"
8 xmlns:
xc=
"urn:xhtml-compiler"
9 xmlns:
rss=
"urn:xhtml-compiler:RSSGenerator"
10 xmlns:
svn=
"urn:xhtml-compiler:Subversion"
11 svn:
head-url=
"$HeadURL$"
12 svn:
revision=
"$Revision$"
14 xml:
lang=
"en" lang=
"en">
16 <title>HTML Purifier - Filter your HTML the standards-compliant way!
</title>
17 <xi:include href=
"common-meta.xml" xpointer=
"xpointer(/*/node())" />
18 <link rel=
"stylesheet" href=
"index.css" type=
"text/css" />
19 <meta name=
"description"
20 content=
"HTML filter that guards against XSS and ensures standards-compliant output." />
22 content=
"HTMLPurifier, HTML Purifier, HTML, filter, filtering, standards, compliant, w3c, XSS, PHP, security, library, open source, LGPL, whitelist" />
23 <link rel=
"alternate" type=
"application/rss+xml"
24 title=
"News - HTML Purifier" href=
"news.rss"
25 rss:
for=
"news-container"
26 rss:
description=
"Recent news and updates on HTML Purifier" />
27 <script defer=
"defer" type=
"text/javascript" src=
"del.icio.us.js" xc:
absolute=
"src"></script>
28 <script defer=
"defer" type=
"text/javascript" src=
"switch2post.js" xc:
absolute=
"src"></script>
34 <span class=
"html">HTML
</span>
35 <span class=
"purifier">Purifier
</span>
39 Standards-Compliant HTML Filtering
47 <li><a href=
"#News">News
</a></li>
48 <li><a href=
"#Plugins">Plugins
</a></li>
49 <li><a href=
"#Demo">Demo
</a></li>
50 <li><strong><a href=
"#Download">Download
</a></strong></li>
51 <li><a href=
"#Resources">Resources
</a></li>
52 <li><a href=
"http://htmlpurifier.org/phorum/">Forum
</a></li>
53 <li><a href=
"#Contact">Contact
</a></li>
59 <div id=
"summary-safe">
62 HTML Purifier defeats XSS with an audited whitelist
65 <div id=
"summary-clean">
68 HTML Purifier ensures standards-compliant output
71 <div id=
"summary-open">
74 HTML Purifier is open-source and highly customizable
80 <p><strong>HTML Purifier
</strong> is a standards-compliant
81 <abbr>HTML
</abbr> filter library written in
82 <abbr>PHP
</abbr>. HTML Purifier will not only remove all malicious
83 code (better known as
<abbr>XSS
</abbr>) with a thoroughly audited,
84 secure
<em>yet
</em> permissive
<strong><a
85 href=
"live/smoketests/printDefinition.php">whitelist
</a></strong>,
86 it will also make sure your documents are
87 <strong>standards compliant
</strong>, something only achievable with a
88 comprehensive knowledge of
<abbr>W3C
</abbr>'s specifications.
89 Tired of using BBCode due to the current landscape of deficient or
90 insecure
<abbr>HTML
</abbr> filters? Have a
91 <strong><acronym>WYSIWYG
</acronym></strong> editor but never been able to use it? Looking
92 for high-quality, standards-compliant, open-source components for that
93 application you're building? HTML Purifier is for you!
</p>
95 <blockquote class=
"fancy">
97 I'd just like to say we use HTML Purifier in
<a href=
"http://www.iris.ac/">IRIS
</a> for
98 filtering emails against XSS attacks and we've been more than impressed.
100 <div class=
"origin">— Chris Corbyn,
<em>Senior IRIS Developer
</em></div>
103 <div id=
"intro-download">
105 <div id=
"download-files">
106 <div id=
"download-php4" class=
"dl-box">
107 <a href=
"&url.dl.zip;">HTML Purifier &htmlpurifier.current.version;
</a>
108 <span class=
"file-type">zip
</span>
110 <div id=
"download-php5" class=
"dl-box">
111 <a href=
"&url.dl-strict.zip;">HTML Purifier &htmlpurifier.current.version; for PHP
5</a>
112 <span class=
"file-type">zip
</span>
115 <div id=
"download-others">
116 <a href=
"#Download">Other downloads
</a>
124 <h2 id=
"Background">Background
</h2>
126 <p>There are a number of open-source
<abbr>HTML
</abbr> filtering solutions out
127 there on the web already
128 (i.e.
<acronym>PEAR
</acronym>'s
129 <a href=
"http://pear.php.net/package/HTML_Safe">HTML_Safe
</a>,
130 <a href=
"http://sourceforge.net/projects/kses">kses
</a>
132 <a href=
"http://simon.incutio.com/archive/2003/02/23/safeHtmlChecker">
133 SafeHtmlChecker.class.php
</a>). What sets HTML Purifier apart from them?
134 Aren't all of these choices
<q>secure
</q>?
</p>
136 <p>When it comes to
<abbr>HTML
</abbr>,
<strong>attention to
137 detail
</strong> is key. Does the library demonstrate an in-depth
138 knowledge of the
<abbr>DTD
</abbr> that defines
139 <abbr>HTML
</abbr>? Does it perform its filtering off a robust
140 whitelist rather than a usually out-dated blacklist? Does it go through
141 the care to check every single attribute in the document for validity?
142 Does it actually understand tag markup, or pay lip-service with a series
143 of deficient regexes and str_replace's?
</p>
145 <p>Somewhere along the way, all of HTML Purifier's predecessors fall
146 flat. HTML_Safe dooms itself to attacks of the future by using a
147 blacklist. Configurable filters like kses and PHP Input Filter still
148 cannot validate the contents inside attributes. With all these gaps in
149 coverage, none of the usual libraries come close to achieving
150 <strong>standards-compliance
</strong>. There is a user-unfriendly,
151 draconic
<abbr>XML
</abbr>-based filter called Safe HTML Checker,
152 but even it forgets that
<code><a
></code> tags cannot be nested
153 within each other!
</p>
155 <p><strong>Know thy enemy.
</strong> Wily hackers have a huge arsenal of
156 <abbr>XSS
</abbr> hidden within the depths of the
157 <abbr>HTML
</abbr> specification. HTML Purifier takes its
158 effectiveness from the fact that it will decompose the whole document
159 into tokens, and rigorously process the tokens by removing
160 non-whitelisted elements, transforming bad practice tags like font into
161 span, properly checking the nesting of tags and their children and
162 validating all attributes according to their
<abbr>RFC
</abbr>s.
163 HTML Purifier's comprehensive algorithms are complemented by a
164 <strong>breadth of knowledge
</strong>, ensuring that richly formatted
165 documents pass through unstripped.
</p>
167 <p>To my knowledge, there is nothing else in the wild that offers
168 protection from
<abbr>XSS
</abbr>, standards-compliance, and the
169 corrective processing of poorly formed
<abbr>HTML
</abbr>
170 simultaneously. Don't take my word for it though:
171 do your research. Investigate the other libraries, and decide for
172 yourself who you would prefer to be the
<strong>gatekeeper
</strong> to
175 <p>To find out more, you can read the
176 <a href=
"comparison.html"><strong>Comparison
</strong></a>
177 for a play-by-play analysis of the major filter libraries currently
180 <blockquote class=
"fancy">
182 [Y]ou save my day by allowing me not to write another damned HTML parser.
185 — Joseph Halter,
<em>Technical Director at Akira Web
</em>
190 <h2 id=
"News">News
</h2>
192 <div id=
"news-container" class=
"news">
194 <div class=
"item" id=
"news-1.6.1-released">
195 <h3 class=
"title">HTML Purifier
1.6.1 released
</h3>
196 <div class=
"date">Sun,
05 May
2007 18:
14:
11 EDT
</div>
199 <p>The
1.6.1 release, code-named
<q>Ach! We missed something! Run!
</q>, completes
200 HTML Purifier's roster of attribute transformations. It also implements
201 a number of minor features (such as better font transformations, smarter
202 <abbr>HTML
</abbr> parsing, the
<abbr>CSS
</abbr> property 'white-space'
203 and
<abbr>XHTML
</abbr> 1.1), a few bug
204 fixes (most notably fixed
<code>__autoload
</code> compatibility issues)
206 of refactoring.
1.6 was for things that absolutely could not wait: this
207 release, developed in a more leisurely pace, fills in the gaps.
</p>
210 href=
"http://htmlpurifier.org/svnroot/htmlpurifier/tags/1.6.1/NEWS">News
</a>
211 for a complete changelog.
</p>
215 <div class=
"item" id=
"news-updated-pear">
216 <h3 class=
"title">Updated
<acronym>PEAR
</acronym> package
</h3>
217 <div class=
"date">Mon,
30 April
2007 17:
49:
00 EDT
</div>
220 <p>Recently, a packaging problem with the
<acronym>PEAR
</acronym>
221 version of HTML Purifier was pointed out to me by David Schmierer. This
222 bug would cause HTML Purifier to fail converting
<abbr>HTML
</abbr> entities such
223 as
&nbsp;. The
1.6.0 release was amended accordingly and re-released.
224 If you are using the
<acronym>PEAR
</acronym> release, use:
</p>
225 <pre>pear install --force hp/HTMLPurifier
</pre>
226 <p>...to force an update. Users who manually downloaded the library
227 and installed do
<em>not
</em> have to do anything.
</p>
231 <div class=
"item" id=
"news-relocated">
232 <h3 class=
"title">We have relocated
</h3>
233 <div class=
"date">Sun,
22 April
2007 17:
35:
59 EDT
</div>
236 <p>We have relocated from
<code>hp.jpsband.org
</code> to
237 <code>htmlpurifier.org
</code>. Please update your links and bookmarks
238 accordingly. Permanent redirects are in place, so old links will
239 continue to work for a while. However, some pages have changed
240 locations in the shuffle:
</p>
242 <li><code>live/docs/examples/demo.php
</code> is now
<a href=
"demo.php">demo.php
</a></li>
243 <li><code>live/docs/
</code> is now
<a href=
"docs/">docs/
</a></li>
244 <li><code>v/viewvc.cgi/
</code> is now
<a href=
"viewvc.cgi">viewvc.cgi/
</a></li>
246 <p>Also,
<acronym>PEAR
</acronym> users will need to uninstall their
247 old copy of HTML Purifier, remove the old channel, and then discover
248 and install at the new domain. This set of commands should do the
251 pear uninstall hp/HTMLPurifier
252 pear channel-delete hp.jpsband.org
253 pear channel-discover htmlpurifier.org
254 pear install hp/HTMLPurifier
256 <p>Thank you all for your cooperation. If there are any blips, please
257 report them to the
<a
258 href=
"http://htmlpurifier.org/phorum/list.php?2">general forums
</a> or
259 my new email address,
260 <a href=
"mailto:admin@htmlpurifier.org">admin@htmlpurifier.org
</a></p>
264 <div class=
"item" id=
"news-svn-and-misc">
265 <h3 class=
"title"><abbr>SVN
</abbr> viewer and migration
</h3>
266 <div class=
"date">Tue,
17 April
2007 20:
08:
11 EDT
</div>
269 <p><a href=
"http://htmlpurifier.org/viewvc.cgi/htmlpurifier/trunk/">ViewVC
</a>
270 for viewing our
<abbr>SVN
</abbr> repository and
<abbr>RSS
</abbr> changelog feeds for most of our
271 <abbr>HTML
</abbr> pages (for example, the changelog for this page
272 is at
<a href=
"index.rss">index.rss
</a>) were rolled out a few weeks
273 ago. Feel free to check them out.
</p>
274 <p>Also, I've purchased the
<code>htmlpurifier.org
</code> domain
275 so this website will be migrating to that address soon. I'm not in any
276 particular hurry to get the migration done, but I hope to see some
277 other changes in the website as well when the move is made.
<code>;-)
</code></p>
281 <div class=
"item" id=
"news-pro-php-podcast">
282 <h3 class=
"title">Pro:PHP Podcast mention
</h3>
283 <div class=
"date">Mon,
09 April
2007 23:
23:
44 EDT
</div>
287 <a href=
"http://podcast.phparch.com/main/index.php/main">Pro::PHP
</a>
288 podcast for mentioning HTML Purifier on their
289 <a href=
"http://podcast.phparch.com/main/index.php/episodes:20070405">April
290 5,
2007 show
</a>. I've always been a fan of their informative
291 podcasts, and was delighted to discover that
292 they had decided to include HTML Purifier on the program list
293 (even though it was at the very end).
296 <p>Against my better judgment, I have a few clarifications I'd like
297 to make about the podcast:
</p>
300 <li>While HTML Purifier can use Tidy, it's completely optional.
301 Tidy is exploited for pretty-printed
<abbr>HTML
</abbr>.
</li>
302 <li>We do use the
<abbr>XSS
</abbr> cheatsheet for
303 <a href=
"live/smoketests/xssAttacks.php">testing
304 the library
</a>, but I actually did not know about the cheat-sheet
305 until the library was well under development.
</li>
306 <li>Yes, the top domain is actually a school band website that
307 I'm borrowing hosting from. I'm playing around with getting
308 a dedicated domain at htmlpurifier.org.
</li>
311 <p>Once again, thanks for mentioning the library, perhaps someday
312 I'll do a screencast going through some of HTML Purifier's major
317 <div class=
"item" id=
"news-1.6.0-released">
318 <h3 class=
"title">HTML Purifier
1.6.0 released
</h3>
319 <div class=
"date">Sun,
01 April
2007 23:
40:
59 EDT
</div>
322 <p>Sorry, no April Fool's joke this year. To compensate, we have
323 the
1.6.0 <q>Long Overdue
</q> release. This version contains support
324 for a number of deprecated attributes HTML Purifier should have
325 had from the very beginning, including the name, bgcolor, border,
326 width and height attributes. The
<abbr>CSS
</abbr> property 'height',
327 rel and rev attributes and ID blacklist regexps are also available.
328 In addition, HTML Purifier will give a friendly error message
329 when you try to enable an element or attribute that doesn't exist.
</p>
331 <p>All in all, this is a fairly compact release, but it does
332 address some common requests brought up in the Forums, so I suggest
333 you upgrade anyway. You can check
<a
334 href=
"http://htmlpurifier.org/svnroot/htmlpurifier/tags/1.6.0/NEWS">News
</a>
335 for a complete changelog, but there's not much else.
</p>
339 </div> <!-- end news-container -->
341 <h2 id=
"Plugins">Plugins
</h2>
343 <p>HTML Purifier is a great library to integrate with existing
344 <abbr>CMS
</abbr>es and other applications or
<acronym>WYSIWYG
</acronym>
345 editors. Currently, we have plugins for:
</p>
348 <li><a href=
"http://bart.motd.be/projects/html-purifier-drupal-module">Drupal HTML Purifier Module
</a> (beta) by Bart Jansens
</li>
349 <li><a href=
"http://htmlpurifier.org/svnroot/htmlpurifier/trunk/plugins/modx.txt">MODx Content Management System
</a></li>
352 <blockquote class=
"fancy">
354 This plugin is on top of my favorite list[.] I am going to heavily
355 depend on it since my clients insist on having
<acronym>WYSIWYG
</acronym> and I insist on
356 having pages that validate and are semantically sound.
359 — David Molliere,
<em>MODx Marketing
& Design Team
</em>
363 <p>Plugins for other major applications gladly accepted!
</p>
366 <h2 id=
"Demo">Demo
</h2>
368 <p>Enter your
<abbr>HTML
</abbr> and see how it will be filtered!
</p>
369 <form id=
"filter" action=
"demo.php?post" method=
"post">
371 <legend>HTML Purifier Input
</legend>
372 <textarea name=
"html" cols=
"50" rows=
"10" id=
"html"></textarea>
373 <div><abbr>XHTML
</abbr> 1.0 Strict output?
<input type=
"checkbox" value=
"1" name=
"strict" /></div>
375 <input type=
"submit" value=
"Submit" name=
"submit" class=
"button" />
380 <p>...or try these sample inputs:
</p>
383 <li><a href=
"demo.php?get&html=%3Cimg+src%3D%22javascript%3Aevil%28%29%3B%22+onload%3D%22evil%28%29%3B%22+%2F%3E">Malicious code removed
</a></li>
384 <li><a href=
"demo.php?html=%3Cb%3EBold&submit=Submit">Missing end tags fixed
</a></li>
385 <li><a href=
"demo.php?html=%3Cb%3EInline+%3Cdel%3Econtext+%3Cdiv%3ENo+block+allowed%3C%2Fdiv%3E%3C%2Fdel%3E%3C%2Fb%3E&submit=Submit">Illegal nesting fixed
</a></li>
386 <li><a href=
"demo.php?html=%3Ccenter%3ECentered%3C%2Fcenter%3E&strict=1&submit=Submit">Deprecated tags converted
</a></li>
387 <li><a href=
"demo.php?html=%3Cspan+style%3D%22color%3A%23COW%3Bfloat%3Aaround%3Btext-decoration%3Ablink%3B%22%3EText%3C%2Fspan%3E&submit=Submit"><abbr>CSS
</abbr> validated
</a></li>
388 <li><a href=
"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&submit=Submit">Rich formatting preserved
</a></li>
391 <h2 id=
"Download">Download
</h2>
393 <p>The current version is
394 <strong>&htmlpurifier.current.version;
</strong>, released on
395 &htmlpurifier.current.release-date;. Pick your distribution:
</p>
398 <li><a class=
"download" href=
"&url.dl.tar.gz;">HTML Purifier &htmlpurifier.current.version; (.tar.gz)
</a> [
<a href=
"&url.dl.tar.gz.sig;">sig
</a>]
</li>
399 <li><a class=
"download" href=
"&url.dl.zip;">HTML Purifier &htmlpurifier.current.version; (.zip)
</a> [
<a href=
"&url.dl.zip.sig;">sig
</a>]
</li>
400 <li><a class=
"download" href=
"&url.dl-strict.tar.gz;">HTML Purifier &htmlpurifier.current.version; PHP5-strict (.tar.gz)
</a> [
<a href=
"&url.dl-strict.tar.gz.sig;">sig
</a>]
</li>
401 <li><a class=
"download" href=
"&url.dl-strict.zip;">HTML Purifier &htmlpurifier.current.version; PHP5-strict (.zip)
</a> [
<a href=
"&url.dl-strict.zip.sig;">sig
</a>]
</li>
404 <p>The
<abbr>PHP
</abbr>5-strict version is exactly the same
405 as the regular version with a few tweaks
406 to prevent it from complaining with
407 <a href=
"http://php.net/manual/en/ref.errorfunc.php#e-strict">E_STRICT
</a>
408 warnings.This library is open-source, licensed under the
409 <a href=
"http://www.gnu.org/licenses/lgpl.html"><abbr>LGPL
</abbr> v2.1+
</a>.
</p>
411 <p>HTML Purifier is also available as a
<acronym>PEAR
</acronym> package.
412 You can install it by executing:
</p>
414 <pre class=
"command">pear channel-discover htmlpurifier.org
415 pear install hp/HTMLPurifier
</pre>
417 <p>You can also grab the latest developmental code from our Subversion
418 repository. Simply execute this command:
</p>
420 <pre class=
"command long">svn co http://htmlpurifier.org/svnroot/htmlpurifier/trunk ./
</pre>
422 <p>...or
<a href=
"http://htmlpurifier.org/svnroot/htmlpurifier/trunk/">browse
423 anonymously
</a> at that address. Previous releases can be obtained by browsing
424 the
<a href=
"releases/">release directory
</a>
425 or checking code out of the
426 <a href=
"http://htmlpurifier.org/svnroot/htmlpurifier/tags/">tags/
427 directory
</a>. You can also use
428 <a href=
"http://htmlpurifier.org/viewvc.cgi/htmlpurifier/trunk/">ViewVC to view the repository
</a>.
</p>
430 <p><acronym>SHA-
1</acronym> checksums:
</p>
433 5589abda6370b58cc2d538c084b79f4994671f9b htmlpurifier-
1.6.1-strict.tar.gz
434 280832537bbc9aa28763ce1141c5f5a60c8c1048 htmlpurifier-
1.6.1-strict.zip
435 fee6d108a50af5949906478c8c557c383f8893fe htmlpurifier-
1.6.1.tar.gz
436 4391ab11fd62c1ff009ffd1089470ad2dcdc0671 htmlpurifier-
1.6.1.zip
439 <p>There are also
<tt>.sig
</tt> files which you can use to cryptographically verify
440 that the release is from me, Edward Z. Yang. You can find
441 my
<a href=
"http://www.thewritingpot.com/gpgpubkey.asc">public key
442 here (
0x869C48DA)
</a>. My key's fingerprint is:
443 <tt>3FA8 E9A9
7385 B691 A6FC B3CB A933 BE7D
869C
48DA
</tt>.
</p>
445 <p>Verify with these commands:
</p>
447 <pre class=
"command">gpg --verify
<strong>$filename
</strong>.sig
</pre>
449 <p>You can be notified of new releases by a low-traffic announce list. Subscribe
452 <form method=
"post" action=
"http://scripts.dreamhost.com/add_list.cgi">
453 <input type=
"hidden" name=
"list" value=
"admin@htmlpurifier.org" />
454 <input type=
"hidden" name=
"domain" value=
"htmlpurifier.org" />
455 <input type=
"hidden" name=
"emailit" value=
"1" />
456 <div>Name:
<input name=
"name" /> E-mail:
<input name=
"email" /></div>
457 <div><input type=
"submit" name=
"submit" value=
"Suscribe to Announcement List" />
458 <input type=
"submit" name=
"unsub" value=
"Unsubscribe" /></div>
461 <h2 id=
"Resources">Resources
</h2>
463 <li><strong><a href=
"docs/">End-User
464 Documentation
</a></strong> — In-depth documents on how to get
465 the most out of HTML Purifier.
</li>
466 <li><del>Mantis Bugtracker
— Found a bug? Report
467 it here!
</del> Temporarily disabled
</li>
468 <li><a href=
"http://htmlpurifier.org/phorum/">Support Forum
</a> — Talk about all things
470 <li><a href=
"live/smoketests/printDefinition.php">Print
471 Definition
</a> — If you want to actually see what HTML Purifier's
472 filtering rules are, look no further than to this page. You can even
473 experiment with the configuration to see how things respond to different
475 <li><a href=
"live/smoketests/xssAttacks.php"><abbr>XSS
</abbr>
476 Attacks Smoketest
</a> — Tests how well HTML Purifier fares
477 against RSnake's famous cheatsheet of
<abbr>XSS
</abbr> attacks.
</li>
478 <li><a href=
"live/TODO">Roadmap
</a>
479 — Subject to lots of delays, but it's a glimpse of the future
</li>
480 <li><a href=
"live/art/">Artwork
</a>
481 — Extra media goodies.
</li>
482 <li><a href=
"live/configdoc/plain.html">Configuration
483 documentation
</a> — See the
<code>INSTALL
</code> document on how to
484 configure your HTML Purifier installation.
</li>
485 <li><a href=
"http://htmlpurifier.org/doxygen/html/">Doxygen-generated
486 Documentation
</a> — No class left undocumented! Cross-referenced
487 code! A must-read for any prospective HTML Purifier hacker.
488 (close by,
<a href=
"http://htmlpurifier.org/phpdoc/">PHPDoc-generated
489 Documentation.
</a>)
</li>
492 <h2 id=
"Propaganda">Spread the Word!
</h2>
494 <p>Help spread awareness about HTML Purifier by:
</p>
498 href=
"http://del.icio.us/post?v=4&noui&url=http://htmlpurifier.org/&title=HTML%20Purifier%20-%20Filter%20your%20HTML%20the%20standards-compliant%20way!"
499 id=
"delicious">Bookmarking this website
</a> on your
<strong>del.icio.us
</strong> account, and/or
</li>
501 <div>Including this little
<strong>label
</strong> on your website:
502 <a href=
"http://htmlpurifier.org/"><img
503 src=
"live/art/powered.png"
504 alt=
"Powered by HTML Purifier" border=
"0" /></a>, with this code:
506 <pre class=
"long"><a href=
"http://htmlpurifier.org/
"><img
507 src=
"http://htmlpurifier.org/live/art/powered.png
"
508 alt=
"Powered by HTML Purifier
" border=
"0" /
></a
></pre>
512 <h2 id=
"Contact">Contact
</h2>
514 <p>You can send me an email at
515 <a href=
"mailto:admin@htmlpurifier.org">admin@htmlpurifier.org
</a>.
516 However, I prefer that you use the forums for asking general support
517 questions (response time will be the same, I promise!)
518 Any emails I receive will be considered public: if I think a
519 solution I thought up to help you would be particularly useful to others,
520 expect it to show up on the website.
</p>