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つの列、content
とhtml
を使用しました。 content
の列には、ユーザーが送信したテキストが格納されます。レコードを保存するときは、PHP Markdownでcontent
を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);
}
}
あなたが例を与えることができます:
ここに私のHTMLPurifierフィルタでありますZend FrameworkでMarkDownをどのように実装しましたか?ビューヘルパーをどこに配置しましたか? – UnderDog
@UnderDog - 私はビューヘルパーを使用していませんでした。私はいくつかの実装の詳細を含むように私の答えを更新しました。 – Sonny