2011-10-13 5 views
1

CMSアプリケーションでは、管理ユーザはWYSIWYGエディタでHTMLコンテンツを追加できます。このエディタはHTMLPurifierでフィルタリングされます。私は今メッセージボード機能を追加したいと思っています。ホワイトリストなしでZend StripTags Filterを使用してすべてのHTMLを削除し、ZendのBBCodeまたはTextileパーサーを使用して豊富なマークアップを提供する予定です。Zend Framework入力/出力XSSフィルタリング:ストリップタグ、テキスタイル、BBCode

これらは私の質問です:私はホワイトリストを持っていない場合は

  1. XSSはStripTagsを通してそれを作ることはできますか?
  2. 出力パーサとしてBBCodeまたはTextileを追加すると、XSSの可能性が再導入されますか?
+0

あなたが例を与えることができます:

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

ここに私のHTMLPurifierフィルタでありますZend FrameworkでMarkDownをどのように実装しましたか?ビューヘルパーをどこに配置しましたか? – UnderDog

+0

@UnderDog - 私はビューヘルパーを使用していませんでした。私はいくつかの実装の詳細を含むように私の答えを更新しました。 – Sonny

答えて

2

a post about Markdown here on SO、およびanother article linked in an answer to that postを読んだ後、文書にXSSを再導入することができますが、簡単ではないだけであることが表示されます。安全を期すために、私は、をの最終のステップとしてコンテンツ出力のフィルタチェーンで実行する必要があります。私は出力フィルタとしてHTMLPurifierの性能に関心があるので、代わりにWibbleを使用しています。

これはまだ最初の質問に答えられないままですが、私の場合は、その手順は不要です。


私はZendのBBCodeとTextileを使用しようとすると、そのことがわかりました。代わりにPHP Markdownを使用しました。また、Wibbleはまだ準備ができていないようです。

データベースに2つの列、contenthtmlを使用しました。 contentの列には、ユーザーが送信したテキストが格納されます。レコードを保存するときは、PHP MarkdowncontentをHTMLに変換し、HTMLPurifierに渡して、その値をhtml列に保存します。私はそのようにすべての視点を変換するつもりはない。


実装の詳細

は、私がここにPHP Markdownを置く:library/markdown.php。私のアクティブレコードモデルでは、Zend_Db_Table_Row_Abstractを使用して、私はレコードが保存される前の値を処理するために_insert()_update()フックを使用します。

/** 
* 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); 
    } 
} 
関連する問題