Dud commit.
[htmlpurifier-web.git] / index.xhtml
blobb9b96fa9c9c986ac58f0f716ac8a0401c18ad0f7
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 class="lead"><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 class="lead">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 <a href="comparison.html"><img src="compare.png" class="compare-button" alt="Compare HTML Purifier with other filters" /></a>
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-rss-feed">
141 <h3 class="title"><abbr>RSS</abbr> feed!</h3>
142 <div class="date">Sat, 17 March 2007 5:42:12 EDT</div>
144 <div class="body">
145 <p class="lead">We have a shiny new <abbr>RSS</abbr> feed
146 at <a href="news.rss">news.rss</a>, which is hooked up to this
147 news feed. Subscribe for release notifications as well as random
148 news about HTML Purifier.</p>
149 </div>
150 </div>
152 <div class="item" id="news-status-on-api">
153 <h3 class="title">Status on 1.5 and the Advanced <abbr>API</abbr></h3>
154 <div class="date">Wed, 14 March 2007 5:31:46 EDT</div>
156 <div class="body">
157 <p class="lead">Quick update on the status of version 1.5. The flagship
158 new feature of this release is to be an advanced system for selecting
159 and creating elements and attributes. You can view the <a
160 href="http://hp.jpsband.org/live/docs/dev-advanced-api.html">projected
161 advanced <abbr>API</abbr> here</a>.</p>
163 <p>If you actually took the time out to scan the document, you may notice
164 that its incomplete. This is a very big problem. I am slowly grinding
165 away at the details, but any suggestions and comments would be
166 greatly appreciated. You can post anything you want to see in the
167 <a href="http://hp.jpsband.org/phorum/list.php?2">general forums</a>.</p>
168 </div>
169 </div>
171 <div class="item" id="news-utf8-tutorial">
172 <h3 class="title"><abbr>UTF-8</abbr> Tutorial</h3>
173 <div class="date">Sat, 27 Jan 2007 13:30:56 EST</div>
175 <div class="body">
176 <p class="lead">Here's a tutorial on <a
177 href="http://hp.jpsband.org/live/docs/enduser-utf8.html">HTML Purifier
178 and <abbr>UTF-8</abbr> character encoding issues</a>. It discusses
179 how to figure out your character encoding, why you should
180 <abbr>UTF-8</abbr>, and how to migrate (should you choose to do
181 so). </p>
182 </div>
183 </div>
185 <div class="item" id="news-1.4.1-released">
186 <h3 class="title">HTML Purifier 1.4.1 released</h3>
187 <div class="date">Sun, 21 Jan 2007 17:18:01 EST</div>
189 <div class="body">
190 <blockquote>This release supersedes the 1.4.0 release
191 on the same day. </blockquote>
193 <p class="lead">1.4.1 major feature release available today.
194 The goodies: </p>
196 <ul>
197 <li><strong><abbr>PHP</abbr>5 E_STRICT mode
198 supported.</strong> See download section for alternate
199 package.</li>
200 <li><strong>CSS properties 'list-style-image', 'background-image',
201 'background-repeat', 'background-attachment' and
202 'background-position' implemented</strong>. </li>
203 <li>You can now use %Core.EscapeNonASCIICharacters to workaround
204 HTML Purifier's tendency to remove all characters that an
205 encoding does not support. This does not apply to users who
206 have stayed with <abbr>UTF-8</abbr>. </li>
207 <li>YouTube preservation code is now part of the core. You can see
208 an example at <a
209 href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/smoketests/preserveYouTube.php">smoketests/preserveYouTube.php</a>.
210 </li>
211 <li>You can now create a configuration object from an
212 <abbr>INI</abbr> file using
213 <code>HTMLPurifier_Config::create( $ini_filename );</code> </li>
214 </ul>
216 <p class="lead">There were also a one fixed bug, where HTML Purifier
217 would stop working if <abbr>PHP</abbr>5 did not have
218 <acronym>DOM</acronym> installed. See <a
219 href="http://hp.jpsband.org/svnroot/htmlpurifier/tags/1.4.1/NEWS">News</a>
220 for a complete changelog. </p>
222 <p>Future work will cover implementing deprecated attributes and letting
223 users preserve them rather than transform them into the
224 <abbr>CSS</abbr> equivalents as well as error logging and
225 <abbr>XSS</abbr> attempt detection. </p>
226 </div>
227 </div>
229 <div class="item" id="news-teracc-review">
230 <h3 class="title">Japanese Review</h3>
231 <div class="date">Sun, 07 Jan 2007 13:55:01 EST</div>
233 <div class="body">
234 <p class="lead">Japanese users may want to check out
235 <a href="http://d.hatena.ne.jp/teracc/20070105">teracc's post on HTML
236 Purifier.</a> Provides a very good overview of the library, especially
237 if English is not your best language. </p>
239 <p>teracc raises some very important objections about the library,
240 including the inability of HTML Purifier to accept table attributes
241 designating things like color and width, tabindex and accesskey for
242 a tags, and the background-image <abbr>CSS</abbr> key. HTML
243 Purifier also cannot accept non-<acronym>ASCII</acronym> characters
244 in font-names. </p>
246 <p>The two main disadvantages, the post concludes, are that HTML
247 Purifier ignores non-standard <abbr>HTML</abbr> rather than
248 refusing them (as well as the fact that it really isn't validating to
249 the specification, it's using a more restrictive specification) and
250 that <abbr>CPU</abbr>/memory usage by the library is high. </p>
252 <p>These notes are all correct. Here are some replies: </p>
254 <ul>
255 <li>Table attributes: they're deprecated, so they're not terribly
256 high priority for me to implement, but I understand they are
257 commonly used and will move to implement them. </li>
258 <li>tabindex and accesskey: dangerous user interface
259 attributes that I specifically decided not to allow. If anyone
260 an convince me why they'd be a good idea I'll consider
261 implementing them. </li>
262 <li><del>background-image: never got around to implementing it,
263 now that resource <abbr>URI</abbr> restrictions are
264 possible, this is something I'll add.</del> Implemented with
265 1.4.0. </li>
266 <li>Non-ASCII characters not allowed in font names: Never thought this
267 would be a problem! In terms of web accessibility, picking these
268 sorts of fonts probably wouldn't be a good idea since most people
269 wouldn't have them, but I'll see what I can do. </li>
270 <li>Ignoring versus refusing: I'm not exactly I understood what teracc
271 was saying here. This would fall into the realm of XSS-detection,
272 which has been requested before and is something I've been
273 playing around with. </li>
274 <li>Not validating to the specification: Of course I can't validate
275 to it directly, that would be insecure. I'll clarify this in the
276 documentation. </li>
277 <li><abbr>CPU</abbr>/Memory usage high: Precisely why you
278 need to cache HTML Purifier's output. </li>
279 </ul>
280 </div>
281 </div>
283 </div> <!-- end news-container -->
285 <h2 id="Plugins">Plugins</h2>
287 <p class="lead">HTML Purifier is a great library to integrate with existing
288 <abbr>CMS</abbr>es and other applications or <acronym>WYSIWYG</acronym> editors. Currently, we have plugins
289 for:</p>
291 <ul>
292 <li><a href="http://bart.motd.be/projects/html-purifier-drupal-module">Drupal HTML Purifier Module</a> (beta) by Bart Jansens</li>
293 <li><a href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/plugins/modx.txt">MODx Content Management System</a></li>
294 </ul>
296 <blockquote class="fancy">
297 <div class="quote">
298 This plugin is on top of my favorite list[.] I am going to heavily
299 depend on it since my clients insist on having <acronym>WYSIWYG</acronym> and I insist on
300 having pages that validate and are semantically sound.
301 </div>
302 <div class="origin">
303 &mdash; David Molliere, <em>MODx Marketing &amp; Design Team</em>
304 </div>
305 </blockquote>
307 <p class="lead">Plugins for other major applications gladly accepted!</p>
310 <h2 id="Demo">Demo</h2>
312 <p class="lead">Enter your <abbr>HTML</abbr> and see how it will be filtered!</p>
313 <form id="filter" action="http://hp.jpsband.org/live/docs/examples/demo.php?post" method="post">
314 <fieldset>
315 <legend>HTML Purifier Input</legend>
316 <textarea name="html" cols="50" rows="10" id="html"></textarea>
317 <div><abbr>XHTML</abbr> 1.0 Strict output? <input type="checkbox" value="1" name="strict" /></div>
318 <div>
319 <input type="submit" value="Submit" name="submit" class="button" />
320 </div>
321 </fieldset>
322 </form>
324 <p class="lead">...or try these sample inputs:</p>
326 <ul>
327 <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>
328 <li><a href="http://hp.jpsband.org/live/docs/examples/demo.php?html=%3Cb%3EBold&amp;submit=Submit">Missing end tags fixed</a></li>
329 <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>
330 <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>
331 <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>
332 <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>
333 </ul>
335 <h2 id="Download">Download</h2>
337 <p class="lead">The current version is
338 <strong>1.4.1</strong>. Pick your distribution:</p>
340 <ul>
341 <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>
342 <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>
343 <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>
344 <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>
345 </ul>
347 <p class="lead">The <abbr>PHP</abbr>5-strict version is exactly the same
348 as the regular version with a few tweaks
349 to prevent it from complaining about
350 E_STRICT warnings.This library is open-source, licensed under the
351 <a href="http://www.gnu.org/licenses/lgpl.html"><abbr>LGPL</abbr> v2.1+</a>.</p>
353 <p>You can also grab the latest developmental code from our Subversion
354 repository. Simply execute this command:</p>
356 <pre class="command">svn co http://hp.jpsband.org/svnroot/htmlpurifier/trunk ./</pre>
358 <p>...or <a href="http://hp.jpsband.org/svnroot/htmlpurifier/trunk/">browse
359 anonymously</a> at that address. Previous releases can be obtained by browsing
360 the <a href="releases/">release directory</a>
361 or checking code out of the
362 <a href="http://hp.jpsband.org/svnroot/htmlpurifier/tags/">tags/
363 directory</a>.</p>
365 <p><acronym>SHA-1</acronym> checksums:</p>
367 <pre>
368 c82945de51555a9c8bd6352561977cfa029f2054 htmlpurifier-1.4.1.tar.gz
369 de67ac0768e634d79e14426c77acacee58e2a7c4 htmlpurifier-1.4.1.zip
370 6f2f127b830801b3720991ea382c34470407ecf0 htmlpurifier-1.4.1-strict.tar.gz
371 070542122837c18818a1cb5e46de19fd3a576bc6 htmlpurifier-1.4.1-strict.zip
372 </pre>
374 <p>There are also <tt>.sig</tt> files which you can use to cryptographically verify
375 that the release is from me, Edward Z. Yang. You can find
376 my <a href="http://www.thewritingpot.com/gpgpubkey.asc">public key
377 here (0x869C48DA)</a>. My key's fingerprint is:
378 <tt>3FA8 E9A9 7385 B691 A6FC B3CB A933 BE7D 869C 48DA</tt>.</p>
380 <p>Verify with these commands:</p>
382 <pre class="command">gpg --verify <strong>$filename</strong>.sig</pre>
384 <p class="lead">You can be notified of new releases by a low-traffic announce list. Subscribe
385 here:</p>
387 <form method="post" action="http://scripts.dreamhost.com/add_list.cgi">
388 <input type="hidden" name="list" value="htmlpurifier@jpsband.org" />
389 <input type="hidden" name="domain" value="jpsband.org" />
390 <input type="hidden" name="emailit" value="1" />
391 <div>Name: <input name="name" /> E-mail: <input name="email" /></div>
392 <div><input type="submit" name="submit" value="Suscribe to Announcement List" />
393 <input type="submit" name="unsub" value="Unsubscribe" /></div>
394 </form>
396 <h2 id="Resources">Resources</h2>
397 <ul>
398 <li><strong><a href="http://hp.jpsband.org/live/docs/">End-User
399 Documentation</a></strong> &mdash; In-depth documents on how to get
400 the most out of HTML Purifier.</li>
401 <li><a href="mantis/">Mantis Bugtracker</a> &mdash; Found a bug? Report
402 it here!</li>
403 <li><a href="phorum/">Support Forum</a> &mdash; Talk about all things
404 HTML Purifier.</li>
405 <li><a href="http://hp.jpsband.org/live/smoketests/printDefinition.php">Print
406 Definition</a> &mdash; If you want to actually see what HTML Purifier's
407 filtering rules are, look no further than to this page. You can even
408 experiment with the configuration to see how things respond to different
409 directives.</li>
410 <li><a href="http://hp.jpsband.org/live/smoketests/xssAttacks.php"><abbr>XSS</abbr>
411 Attacks Smoketest</a> &mdash; Tests how well HTML Purifier fares
412 against RSnake's famous cheatsheet of <abbr>XSS</abbr> attacks.</li>
413 <li><a href="http://hp.jpsband.org/live/TODO">Roadmap</a>
414 &mdash; Subject to lots of delays, but it's a glimpse of the future</li>
415 <li><a href="http://hp.jpsband.org/live/art/">Artwork</a>
416 &mdash; Extra media goodies.</li>
417 <li><a href="http://hp.jpsband.org/live/configdoc/plain.html">Configuration
418 documentation</a> &mdash; See the <code>INSTALL</code> document on how to
419 configure your HTML Purifier installation.</li>
420 <li><a href="http://hp.jpsband.org/doxygen/html/">Doxygen-generated
421 Documentation</a> &mdash; No class left undocumented! Cross-referenced
422 code! A must-read for any prospective HTML Purifier hacker.
423 (close by, <a href="http://hp.jpsband.org/phpdoc/">PHPDoc-generated
424 Documentation.</a>)</li>
425 </ul>
427 <h2 id="Propaganda">Spread the Word!</h2>
429 <p class="lead">Help spread awareness about HTML Purifier by:</p>
431 <ul>
432 <li><a
433 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!"
434 id="delicious">Bookmarking this website</a> on your <strong>del.icio.us</strong> account, and/or</li>
435 <li>
436 <div>Including this little <strong>label</strong> on your website:
437 <a href="http://hp.jpsband.org/"><img
438 src="http://hp.jpsband.org/live/art/powered.png"
439 alt="Powered by HTML Purifier" border="0" /></a>, with this code:
440 </div>
441 <pre>&lt;a href=&quot;http://hp.jpsband.org/&quot;&gt;&lt;img
442 src=&quot;http://hp.jpsband.org/live/art/powered.png&quot;
443 alt=&quot;Powered by HTML Purifier&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</pre>
444 </li>
445 </ul>
447 <h2 id="Contact">Contact</h2>
449 <p class="lead">You can send me an email at
450 <a href="mailto:htmlpurifier@jpsband.org">htmlpurifier@jpsband.org</a>.
451 However, I prefer that you use the forums for asking general support
452 questions (response time will be the same, I promise!)
453 Any emails I receive will be considered public: if I think a
454 solution I thought up to help you would be particularly useful to others,
455 expect it to show up on the website.</p>
457 </div>
459 </body>
460 </html>