🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
HTML Purifier是一个非常强大的库。但是权力带来了更大的责任,即更长的执行时间。请记住,该库并不是对草稿提交的HTML轻描淡写:它正在分解整个事物,严格检查各个部分,然后将其放回原处。 因此,如果事实证明HTML Purifier对于出站筛选而言有点太慢,那么您有几种选择: ## 入站过滤 由用户提交时执行HTML过滤。由于用户已经提交了某些东西,因此在加载时间上多花半秒钟不会造成太大的问题。然后,显示内容是直接从数据库/文件系统输出内容的一种简单方法。这种方法的问题是您的用户丢失了原始文本,并且在进行编辑时将处理过滤后的文本。尽管这可能是一件好事,尤其是如果您使用的是所见即所得的编辑器,但如果用户输入错误,也会导致数据丢失。 示例(非功能性): ~~~ <?php /** * FORM SUBMISSION PAGE * display_error($message) : displays nice error page with message * display_success() : displays a nice success page * display_form() : displays the HTML submission form * database_insert($html) : inserts data into database as new row */ if (!empty($_POST)) { require_once '/path/to/library/HTMLPurifier.auto.php'; require_once 'HTMLPurifier.func.php'; $dirty_html = isset($_POST['html']) ? $_POST['html'] : false; if (!$dirty_html) { display_error('You must write some HTML!'); } $html = HTMLPurifier($dirty_html); database_insert($html); display_success(); // notice that $dirty_html is *not* saved } else { display_form(); } ?> ~~~ ## 缓存过滤后的输出 接受提交的文本并将其原封不动地放入数据库中,然后还生成过滤的版本并将其存储在数据库中。将过滤后的版本提供给读者,将未更改的版本提供给编辑者。如果需要,您可以使缓存无效,并在第一页视图上重新生成缓存的过滤版本。优点?完整的数据保留。缺点?这更加复杂,并且如果其他编辑器使用的是WYSIWYG编辑器,则可以使用XSS进行打开(要解决此问题,他们必须能够使用以纯文本方式提供的\*真正\*原始文本)。 示例(非功能性): ~~~ <?php /** * VIEW PAGE * display_error($message) : displays nice error page with message * cache_get($id) : retrieves HTML from fast cache (db or file) * cache_insert($id, $html) : inserts good HTML into cache system * database_get($id) : retrieves raw HTML from database */ $id = isset($_GET['id']) ? (int) $_GET['id'] : false; if (!$id) { display_error('Must specify ID.'); exit; } $html = cache_get($id); // filesystem or database if ($html === false) { // cache didn't have the HTML, generate it $raw_html = database_get($id); require_once '/path/to/library/HTMLPurifier.auto.php'; require_once 'HTMLPurifier.func.php'; $html = HTMLPurifier($raw_html); cache_insert($id, $html); } echo $html; ?> ~~~ ## 摘要 简而言之,入站过滤是简单的选择,而缓存是健壮的选择(尽管具有更大的存储需求)。 还有第三个选项,与我们已经讨论的两个选项无关:自己配置和优化HTMLPurifier。如果您决定这样做,请务必报告您的结果!特别是如果将HTML Purifier移植到C ++。;-)