<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>sorgalla.com &#187; Zend_Filter</title>
	<atom:link href="http://sorgalla.com/tag/zend_filter/feed/" rel="self" type="application/rss+xml" />
	<link>http://sorgalla.com</link>
	<description>PHP, Zend Framework, Datenbanken und was sonst noch so anfällt.</description>
	<lastBuildDate>Tue, 05 Jul 2011 07:20:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>HTMLPurifier mit dem Zend Framework nutzen</title>
		<link>http://sorgalla.com/2009/12/09/htmlpurifier-mit-dem-zend-framework-nutzen/</link>
		<comments>http://sorgalla.com/2009/12/09/htmlpurifier-mit-dem-zend-framework-nutzen/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 14:50:24 +0000</pubDate>
		<dc:creator>jan</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[HTMLPurifier]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XSS]]></category>
		<category><![CDATA[Zend_Filter]]></category>

		<guid isPermaLink="false">http://sorgalla.com/?p=93</guid>
		<description><![CDATA[Pádraic Brady hat in seinem Blog über Zend_Filter_StripTags und seine mögliche missbräuchliche Verwendung als XSS-Filter geschrieben und damit einiges an Aufsehen erregt. Ich selbst bin zufällig kürzlich über die Klasse gestolpert. Ohne sie groß zu testen war mir der Code aber relativ suspekt und ich habe sie nicht verwendet. Stattdessen nutze ich wie bisher HTMLPurifier [...]]]></description>
			<content:encoded><![CDATA[<p>Pádraic Brady hat in seinem <a href="http://blog.astrumfutura.com/archives/425-Zend_Filter_StripTags-Friend,-Foe,-or-Security-Nightmare.html">Blog über Zend_Filter_StripTags</a> und seine mögliche missbräuchliche Verwendung als XSS-Filter geschrieben und damit einiges an Aufsehen erregt. Ich selbst bin zufällig kürzlich über die Klasse gestolpert. Ohne sie groß zu testen war mir der Code aber relativ suspekt und ich habe sie nicht verwendet.</p>
<p>Stattdessen nutze ich wie bisher <a href="http://htmlpurifier.org">HTMLPurifier</a> (wird übrigens auch von Pádraic in seinem Artikel empfohlen).</p>
<blockquote><p>HTML Purifier is a standards-compliant HTML filter library written in PHP. HTML Purifier will not only remove all malicious code (better known as XSS) with a thoroughly audited, secure yet permissive whitelist, it will also make sure your documents are standards compliant, something only achievable with a comprehensive knowledge of W3C&#8217;s specifications. Tired of using BBCode due to the current landscape of deficient or insecure HTML filters? Have a WYSIWYG editor but never been able to use it? Looking for high-quality, standards-compliant, open-source components for that application you&#8217;re building? HTML Purifier is for you!</p></blockquote>
<p>Glücklicherweise lässt sich HTMLPurifier sehr leicht in das Zend Framework integrieren.<br />
<span id="more-93"></span></p>
<h3>Installation von HTMLPurifier</h3>
<p>Am einfachsten lässt sich HTMLPurifier über PEAR installieren:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pear channel-discover htmlpurifier.org
$ pear <span style="color: #c20cb9; font-weight: bold;">install</span> hp<span style="color: #000000; font-weight: bold;">/</span>HTMLPurifier</pre></div></div>

<p>Alternativ kann man sich die Bibliothek auch <a href="http://htmlpurifier.org/download">herunterladen</a> und im <code>library</code>-Ordner (Parallen zum <code>Zend</code>-Ordner) installieren.</p>
<h3>Filtern mit HTMLPurifier</h3>
<p>Um HTMLPurifier in Zend Framework-Projekten nutzen zu können, erstellen wir uns einen Filter der <code>Zend_Filter_Interface</code> implementiert.</p>
<p>Wir erstellen uns den Filter in <code>library/App/Filter/HtmlPurifier.php</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * @see Zend_Filter_Interface
 */</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Zend/Filter/Interface.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @category App
 * @package App_Filter
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> App_Filter_HtmlPurifier implements Zend_Filter_Interface
<span style="color: #009900;">&#123;</span>
    <span style="color: #009933; font-style: italic;">/**
     * The HTMLPurifier instance
     *
     * @var HTMLPurifier
     */</span>
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_instance</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Constructor
     *
     * @param mixed $config
     * @return void
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTMLPurifier_Bootstrap'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'HTMLPurifier/Bootstrap.php'</span><span style="color: #339933;">;</span>
            <span style="color: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTMLPurifier_Bootstrap'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'autoload'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_instance <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HTMLPurifier<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Defined by Zend_Filter_Interface
     *
     * Returns the string $value, purified by HTMLPurifier
     *
     * @param string $value
     * @return string
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filter<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_instance<span style="color: #339933;">-&gt;</span><span style="color: #004000;">purify</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Die einfachste Variante um HTML zu filtern ist nun:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$filter</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> App_Filter_HtmlPurifier<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cleanHtml</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$filter</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dirtyHtml</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Variable <code>$config</code>, die wir dem Konstruktor übergeben, kann dabei ein <code>HTMLPurifier_Config</code>-Objekt, ein Array oder der Pfad zu einer .ini-Datei sein. Mehr Informationen dazu findet man in der <a href="http://htmlpurifier.org/live/INSTALL">INSTALL-Datei </a>von HTMLPurifier.</p>
<p>Warum aber HTMLPurifier in einem Filter verstecken? Wir könnten doch auch direkt das HTMLPurifier-Objekt nutzen? Der Vorteil ist, dass wir so den Filter in andere Komponenten des Zend Frameworks integrieren können.</p>
<p>Als erstes kommt uns da natürlich Zend_Form in den Sinn. Man kann so den Filter für seine Formular-Elemente nutzen, z. B. für Textfelder in die HTML-Code eingetragen werden kann um den Markup valide zu machen oder um nur bestimmte Tags zu erlauben.</p>
<p>Als Beispiel hier ein Kommentar-Textfeld in dem nur <code>&lt;b></code>,  <code>&lt;strong></code> und  <code>&lt;a></code>-Tags erlaubt sind. Bei den  <code>&lt;b></code> und  <code>&lt;strong></code>-Tags sind keine Attribute erlaubt, beim  <code>&lt;a></code>-Tag nur das  <code>href</code>-Attribut.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addElementPrefixPath</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'App_Filter'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'App/Filter'</span><span style="color: #339933;">,</span> Zend_Form_Element<span style="color: #339933;">::</span><span style="color: #004000;">FILTER</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addElement</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'textarea'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'comment_text'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'label'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Kommentar'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'filters'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HtmlPurifier'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTML.Allowed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'b,strong,a[href]'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>HTMLPurifier akzeptiert eine Vielzahl von Konfigurations-Optionen. Ein Blick in die <a href="http://htmlpurifier.org/live/configdoc/plain.html">Dokumentation</a> hilft.</p>
<p>Somit haben wir den ersten Teil von &#8220;Filter input, Escape output&#8221; erledigt. Im <a href="/2009/12/12/htmlpurifier-mit-dem-zend-framework-nutzen-teil-2/">2. Teil</a> werden wir dann einen Blick auf die Implementierung eines Zend_View_Helpers werfen mit dem wir Variablen in View-Skripten entsprechend filtern können.</p>
<h3>Links zum Thema</h3>
<ul>
<li><a href="http://htmlpurifier.org">HTMLPurifier</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.filter.html">Zend_Filter</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.filters">Zend_Form Filter</a></li>
</ul>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" class="tt" href="http://twitter.com/intent/tweet?text=HTMLPurifier+mit+dem+Zend+Framework+nutzen+http%3A%2F%2Fsorgalla.com%2F%3Fp%3D93+%2Fby+%40jansor" title="Post to Twitter"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://sorgalla.com/2009/12/09/htmlpurifier-mit-dem-zend-framework-nutzen/&amp;title=HTMLPurifier+mit+dem+Zend+Framework+nutzen" title="Post to Delicious"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://sorgalla.com/2009/12/09/htmlpurifier-mit-dem-zend-framework-nutzen/&amp;title=HTMLPurifier+mit+dem+Zend+Framework+nutzen" title="Post to Digg"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/digg/tt-digg.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://sorgalla.com/2009/12/09/htmlpurifier-mit-dem-zend-framework-nutzen/&amp;t=HTMLPurifier+mit+dem+Zend+Framework+nutzen" title="Post to Facebook"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://sorgalla.com/2009/12/09/htmlpurifier-mit-dem-zend-framework-nutzen/&amp;title=HTMLPurifier+mit+dem+Zend+Framework+nutzen" title="Post to Reddit"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/reddit/tt-reddit.png" alt="Post to Reddit" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://sorgalla.com/2009/12/09/htmlpurifier-mit-dem-zend-framework-nutzen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[HTMLPurifier mit dem Zend Framework nutzen]]></series:name>
	</item>
	</channel>
</rss>

