Zend框架输入/输出XSS过滤:剥离标签,纺织,BBCode

时间:2011-10-13 19:51:45

标签: xss bbcode htmlpurifier textile zend-filter-strip-tags

在我的CMS应用程序中,管理用户可以通过由HTMLPurifier过滤的WYSIWYG编辑器添加HTML内容。我现在想要添加留言板功能。我计划使用不带白名单的Zend StripTags Filter删除所有HTML,然后使用Zend的BBCodeTextile解析器提供丰富的标记。

这是我的问题:

  1. 如果我没有白名单,XSS可以通过StripTags吗?
  2. 添加BBCode或Textile作为输出解析器是否重新引入了XSS的可能性?

1 个答案:

答案 0 :(得分:2)

阅读a post about Markdown here on SOanother article linked in an answer to that post之后,似乎将XSS重新引入文档不仅可行,而且微不足道。为了安全起见,我需要通过HTMLPurifier作为输出过滤器链中的最终步骤运行内容。因为我关注HTMLPurifier作为输出过滤器的效果,所以我正在考虑使用Wibble

这仍然是第一个问题没有答案,但在我的情况下,这一步将是不必要的。


我发现在尝试使用它们时,Zend的BBCode和纺织品都是非常粗暴的。我改为使用PHP Markdown。此外,Wibble似乎还没有准备好生产。

我在数据库中使用了两列:contenthtmlcontent列包含用户提交的文本。保存记录时,我将content转换为带有PHP Markdown的HTML,将其传递给HTMLPurifier,然后将该值保存到html列。我没有按照这种方式转换每一种观点。


实施细则

我将PHP Markdown放在这里:library/markdown.php。在我的活动记录模型中,使用Zend_Db_Table_Row_Abstract,我使用_insert()_update()挂钩在保存记录之前处理值:

// prepare html based on the content
require_once 'markdown.php';
$flt = new My_Filter_HtmlPurifier();
$this->html = $flt->filter(Markdown($this->content));

以下是我的HTMLPurifier过滤器:

/**
 * Based on examples from http://blog.astrumfutura.com/archives/365-Example-Zend-Framework-Blog-Application-Tutorial-Part-8-Creating-and-Editing-Blog-Entries-with-a-dash-of-HTMLPurifier.html
 */
require_once 'HTMLPurifier.includes.php';
require_once 'HTMLPurifier.autoload.php';

class My_Filter_HtmlPurifier implements Zend_Filter_Interface
{
    /** @var HTMLPurifier */
    protected $_htmlPurifier;

    public function __construct($options = null)
    {
        // set up configuration
        $config = HTMLPurifier_Config::createDefault();
        $config->set('HTML.DefinitionID', 'My HTML Purifier Filter');
        $config->set('HTML.DefinitionRev', 3); // increment when configuration changes
//        $config->set('Cache.DefinitionImpl', null); // comment out after finalizing the config

        // Doctype
        $config->set('HTML.Doctype', 'XHTML 1.0 Transitional');

        // Add support for object (flash) tags
        $config->set('HTML.SafeObject', true);
        $config->set('Output.FlashCompat', true); // IE Support

        // Custom Filters
        // Add support for iframes - YouTube, Vimeo...
        $config->set('Filter.Custom', array(new HTMLPurifier_Filter_MyIframe()));

        // Add support for anchor targets
        $config->set('Attr.AllowedFrameTargets', array('_blank', '_self', '_target', '_top'));

        // configure caching
        $cachePath = CUST_APP_PATH . '/../cache/htmlpurifier';
        if (!is_dir($cachePath)) {
            mkdir($cachePath, 0700, true);
        }
        $cachePath = realpath($cachePath);
        $config->set('Cache.SerializerPath', $cachePath);

        // allow for passed-in options
        if (!is_null($options)) {
            //$config = HTMLPurifier_Config::createDefault();
            foreach ($options as $option) {
                $config->set($option[0], $option[1], $option[2]);
            }
        }

        // create the local instance
        $this->_htmlPurifier = new HTMLPurifier($config);
    }

    public function filter($value)
    {
        return $this->_htmlPurifier->purify($value);
    }
}