<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://michaelbertsch.com/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>michaelbertsch.com</title>
 <link>http://michaelbertsch.com</link>
 <description>Private Webseite von Michael Bertsch, über Webdesign, Programmierung, Web Standards, aktuelle Projekte und vieles mehr.</description>
 <language>de-AT</language>
 <copyright>Copyright 2012, Michael Bertsch</copyright>
 <item>
  <title>Ist Servage unsicher?</title>
  <link>http://michaelbertsch.com/blog/ist-servage-unsicher</link>
  <description><![CDATA[ <p>Gerade eben ist mir durch einen Zufall aufgefallen, dass in einigen Dateien auf meinem Webserver vor dem body-Tag ominöse Iframes eingebettet sind und unsichtbare Links auf noch ominösere Seiten vorhanden waren.</p><p>Der erste Gedanke war, dass mein CMS (SquareOne) evtl. Sicherheitslücken enthält, durch die es Angreifern gelang, Dateien auf meinem Webspace zu ändern (habe den Download Link daher sofort entfernt).</p>
<p>Als zweites kam mir in den Sinn, dass das Passwort für den FTP-Server zu schwach gewesen sein könnte (ist mittlerweile geändert, also versucht es erst gar nicht ;-)). Somit wäre es vielleicht möglich gewesen, durch Bruteforce meinen Webspace zu hacken.</p>
<p>Charakteristisch für die geänderten Stellen im Code waren HTML Kommentare mit dem Inhalt text block fishka, jeweils vor- und nach den eingefügten Code Teilen. Nach einer kurzen Google Suche nach diesem Stichwort bin ich auf zwei interessante Seiten gekommen:</p>
<ul>
<li><a href="http://www.befuddled.me.uk/2008/11/site-hacked-daily/">http://www.befuddled.me.uk/2008/11/site-hacked-daily/</a></li>
<li><a href="http://www.cubecartforums.org/index.php?showtopic=6988&pid=33239&st=0">http://www.cubecartforums.org/index.php?showtopic=6988&pid=33239&st=0</a></li>
</ul>
<p>Nach den Kommentaren auf den beiden Seiten soll Servage.net für das Debakel verantwortlich sein. Es sind nämlich nur (oder hauptsächlich) Servage Kunden von diesem Problem betroffen. Es wird vermutet, dass sich jemand Root Zugang zu den Servage Servern verschafft hat und jetzt per Script die index.html/.php Dateien abändert.</p>
<p>Das ganze lässt mich natürlich sehr an der Sicherheit von Servage zweifeln und stärkt nicht gerade mein Vertrauen zu den Provider. Zumal ich gerade festgestellt habe, dass sich am 11.01.2009 jemand mit der IP-Adresse 93.120.141.84 (laut Whois aus Russland) mit meinen Zugangsdaten im Servage Web-ACP angemeldet hat.</p>
<p>Ich werde jetzt jedenfalls sofort den Support von Servage kontaktieren. Mal sehen was sie dazu zu sagen haben.</p>
<p>Antwort vom Support:</p>
<blockquote><p>vielen Dank für Ihr Ticket. Ich möchte mich vielmals für die Unannehmlichkeiten entschuldigen. Seit etwa einem halben Monat setzen wir auf Ihrem Server unser neues, selbst-entwickeltes Betriebsystem ein. Mit der Einführung des neuen Systemes, sollten die größten Sicherheitsprobleme beseitigt worden sein.</p>
<p>In Ihrem Fall ist es sehr wahrscheinlich, dass die Hacker ein unsicheres Skript genutzt haben, um eigenen Code in Ihren Code einzufügen.<br />
Der einzige Weg solche Angriffe zu verhindern, ist die Sicherheit Ihrer Skripte zu überprüfen. Ganz besonders in Passagen, bei denen Formulardateien übermittelt werden.</p>
<p>Bitte stellen Sie auch sicher, dass richtige CHMOD Settings gesetzt wurden. Die Einstellung 777 sollte nur verwendet werden, wenn es absolut notwendig ist.</p></blockquote>
<p>"...sollten die größten Sicherheitsprobleme beseitigt worden sein" - klingt für mich nicht gerade überzeugend. In diesem Fall werde ich wohl abwarten und sehen, ob das Problem wieder auftaucht.
</p>
 ]]></description>
  <pubDate>Tue, 20 Jan 2009 18:08:18 +0100</pubDate>
 </item>
 <item>
  <title>Vista Gadget: SideLaunch</title>
  <link>http://michaelbertsch.com/blog/vista-gadget-sidelaunch</link>
  <description><![CDATA[ <p>Nachdem ich mich jetzt auch endlich überwunden habe und auf Vista umgestiegen bin (bereue es übrigens überhaupt nicht!), hab ich mich auch gleich daran gemacht ein Gadget zu programmieren. Eines der bekanntesten Gadgets für Vista ist wahrscheinlich <a href="http://gallery.live.com/liveItemDetail.aspx?li=4ccdc564-3d94-48a5-82f6-4693940e4ab6&l=1">App Launcher</a>, doch mich konnte es nicht überzeugen. Also habe ich mein eigenes Gadget für diesen Zweck geschrieben.</p><p><img src="http://michaelbertsch.com/files/media/blog/SideLaunch.jpg" alt="SideLaunch Screenshot" /></p>
<p>In Zukunft sind folgende Features geplant:</p>
<ul>
<li>Benutzerdefinierte Reihenfolge der Programme/Ordner (jetzt: alphabetisch)</li>
<li>Verschachtelte Unterordner (niedrige Priorität)</li>
<li>Dynamische Breite einstellbar</li>
<li>Ordner mit benutzerdefiniertem Icon sollen mit Icon angezeigt werden</li>
</ul>
<p>Bekannte Bugs:</p>
<ul>
<li>Bei Verknüpfungen mit einem Icon, das nicht Icon Index 0 hat, wird das erste Icon angezeigt (Sollte jemand eine Lösung dafür haben, kann er sich gerne melden).</li>
</ul>
<p>Es können gerne Code Teile geändert und verbessert werden, solange die Copyright Hinweise erhalten bleiben. Danke!<br />
Also, viel Spaß mit dem Gadget. Ich hoffe der ein oder andere kann es gebrauchen.</p>
<div style="font-size:1.3em;font-weight:bold;text-align:center;"><a href="http://gallery.live.com/liveItemDetail.aspx?li=6e448d69-4151-4e20-89de-3181f2064af5">Download SideLaunch.gadget</a></div>
 ]]></description>
  <pubDate>Sun, 10 Aug 2008 23:42:59 +0200</pubDate>
 </item>
 <item>
  <title>SquareOne CMS Entwicklerversion veröffentlicht</title>
  <link>http://michaelbertsch.com/blog/squareone-cms-entwicklerversion-veroeffentlicht</link>
  <description><![CDATA[ <p>Da mir immer wieder Leute schreiben, die sich für mein CMS interessieren, habe ich mich jetzt dazu entschieden es zu veröffentlichen. Das CMS ist allerdings eher an Entwickler gerichtet, denn es sind schon geringe PHP und MySQL Kenntnisse nötig um es zu installieren und zu nutzen. Außerdem sind einige Teile noch nicht ganz fertiggestellt und ausgereift. Es soll also eher als Inspiration für andere CMS-Entwickler dienen und weniger als Plattform im produktiven Einsatz.</p><p>Bei der Entwicklung standen 4 Punkte im Vordergrund. Es sollte...</p>
<ul>
<li>sicher</li>
<li>erweiterbar</li>
<li>einfach</li>
<li>schnell</li>
</ul>
<p>...sein. Durch diese Zielsetzung entstand auch der Name "SquareOne": <em>vier</em> Grundvorstellungen in <em>einem</em> CMS.</p>
<p><img src="http://michaelbertsch.com/files/media/code/s1.jpg" alt="SquareOne CMS"></p>
<p>Ich hoffe, dass ich mit diesem Schritt einigen CMS-Entwicklern etwas helfen kann.Viel Spaß beim testen!
</p>
 ]]></description>
  <pubDate>Sun, 27 Jan 2008 21:41:10 +0100</pubDate>
 </item>
 <item>
  <title>TinyGallery 1.2 (Sicherheitsupdate)</title>
  <link>http://michaelbertsch.com/blog/tinygallery-1.2-sicherheitsupdate</link>
  <description><![CDATA[ <p>Ein aufmerksamer User, <a href="http://binaervarianz.de">Michael Roßberg</a>, hat mir mitgeteilt, dass die TinyGallery eine Directory-Traversal-Lücke hatte. Deshalb gibt es jetzt eine neue Version.</p><p>Ihr solltet unbedingt updaten, ansonsten wäre es über absolute Pfade möglich, Bilder auf dem gesamten System darzustellen.</p>
<p><a href="http://michaelbertsch.com/files/demo/tinygallery/index.php"><img src="http://michaelbertsch.com/files/media/code/tinygallery.jpg" alt="TinyGallery"></a></p>
<p>Zudem habe ich noch eine kleine Änderung am Seitentitel vorgenommen (wird jetzt immer der aktuelle Ordnername angezeigt).</p>
<p><a href="http://michaelbertsch.com/files/download/tinygallery.zip" class="download">Download</a> <a href="http://michaelbertsch.com/files/demo/tinygallery/index.php" class="demo">Demo</a>
</p>
 ]]></description>
  <pubDate>Thu, 08 Nov 2007 16:11:40 +0100</pubDate>
 </item>
 <item>
  <title>Debian: Neue Netzwerkkarte einrichten</title>
  <link>http://michaelbertsch.com/blog/debian-neue-netzwerkkarte-einrichten</link>
  <description><![CDATA[ <p>Es gibt immer wieder Computerprobleme bei denen man alles Versucht, <del>Google</del> eine Suchmaschine benutzt und trotzdem auf keine Lösung stößt. So erging es mir beim Versuch eine Netzwerkkarte in einem Debian Rechner auszutauschen und die neue in Betrieb zu nehmen. Eigentlich keine große Sache wenn man weiß was zu beachten ist.</p><p>Da ich nach stundenlangem Suchen auf keine Lösung gekommen bin und ich sogar mit dem Gedanken, das System neu aufzusetzen, gespielt habe möchte ich hier festhalten was das Problem ist.</p>
<h3>Situation</h3>
<p>Netzwerkkarte ausgetauscht, Debian gestartet und direkt ein ping versucht. Keine Antwort.</p>
<p>Windows gestartet (2. Betriebssystem) und festgestellt, dass dort das Netzwerk problemlos funktioniert. Was nun?</p>
<h3>Problemlösung</h3>
<p>Bekanntlich werden ja die Netzwerkkarten unter Linux als eth0, eth1, etc. benannt. Wenn jetzt eine Netzwerkkarte ausgetauscht wird sollte (nach meiner Logik) die Karte eth0 bleiben, wenn sie die einzige ist. Das ist aber nicht so.</p>
<p>Sobald eine neue Netzwerkkarte eingebaut ist wird die Karte automatisch als eth1 (oder eth2, usw.) erkannt. Festgestellt werden kann das über den Befehl <em>ifconfig</em> (=Interface config; entspricht ipconfig unter Windows). Wenn bekannt ist wie die Karte heißt muss nur noch in der Datei <em>/etc/network/interfaces</em> festgelegt werden, dass sie auch die primäre Karte ist. einfach überall eth0 in z.B. eth1 ändern.</p>
<p>Dann noch neustarten (den PC oder nur den networking Deamon) und alles sollte wieder funktionieren.
</p>
 ]]></description>
  <pubDate>Sat, 14 Jul 2007 19:50:13 +0200</pubDate>
 </item>
 <item>
  <title>Minimalistische Template-Engine für PHP</title>
  <link>http://michaelbertsch.com/blog/minimalistische-template-engine-fuer-php</link>
  <description><![CDATA[ <p>13 Zeilen PHP-Code kommen natürlich nie an Giganten wie <a href="http://smarty.php.net/">Smarty</a> heran, aber ich bin ja immer für einfache und flexible Lösungen und das ist diese Template-Engine sicher.</p><h3>Die Funktion</h3>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;Render&nbsp;template&nbsp;files<br />&nbsp;*<br />&nbsp;*&nbsp;@param&nbsp;string&nbsp;$template<br />&nbsp;*&nbsp;&nbsp;Name&nbsp;of&nbsp;the&nbsp;template&nbsp;file<br />&nbsp;*&nbsp;@param&nbsp;array&nbsp;$variables<br />&nbsp;*&nbsp;&nbsp;Array&nbsp;of&nbsp;alle&nbsp;variables&nbsp;to&nbsp;set&nbsp;availalbe&nbsp;in&nbsp;the&nbsp;template.<br />&nbsp;*&nbsp;&nbsp;Key&nbsp;=&nbsp;name;&nbsp;Value&nbsp;=&nbsp;content<br />&nbsp;*&nbsp;@copyright<br />&nbsp;*&nbsp;&nbsp;Michael&nbsp;Bertsch&nbsp;(www.michaelbertsch.eu)<br />&nbsp;*/<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">render</span><span style="color: #007700">(</span><span style="color: #0000BB">$template</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$variables&nbsp;</span><span style="color: #007700">=&nbsp;array())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">file_exists</span><span style="color: #007700">(</span><span style="color: #DD0000">'templates/'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$template&nbsp;</span><span style="color: #007700">.</span><span style="color: #DD0000">'.tpl.php'</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Set&nbsp;variables&nbsp;available<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$variables</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">extract</span><span style="color: #007700">(</span><span style="color: #0000BB">$variables</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">EXTR_SKIP</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Start&nbsp;output&nbsp;buffering<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ob_start</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;</span><span style="color: #DD0000">'templates/'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$template&nbsp;</span><span style="color: #007700">.</span><span style="color: #DD0000">'.tpl.php'</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$contents&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ob_get_contents</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ob_end_clean</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$contents</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Die Funktion setzt einen Ordner "templates" voraus, in dem alle Template-Dateien mit der Endung ".tpl.php" abgelegt sind. Also z.B. templates/blog.tpl.php.<br />
Wenn das Template nun existiert werden die Variablen "entpackt", das Template geladen und per <em><a href="http://de.php.net/outcontrol">output buffering</a></em> als string zurück gegeben.</p>
<h3>Ein Beispiel</h3>
<p>Vorab: <em>&lt;?= $var ?&gt;</em> ist nur ein anderer/kürzerer Syntax für <em>&lt;? echo $var ?&gt;</em>.</p>
<p>Das Template sieht folgendermaßen aus:<br />
<code class="php"><span style="color: #000000">&lt;h3&gt;<span style="color: #0000BB">&lt;?=&nbsp;$title&nbsp;?&gt;</span>&lt;/h3&gt;<br />&lt;div&gt;<span style="color: #0000BB">&lt;?=&nbsp;$content&nbsp;?&gt;</span>&lt;/div&gt;</span></code></p>
<p>Und gerendert wird das dann so:<br />
<code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$content&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">render</span><span style="color: #007700">(</span><span style="color: #DD0000">'test'</span><span style="color: #007700">,&nbsp;array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'title'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'hello&nbsp;world!'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'content'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'Lorem&nbsp;ipsum&nbsp;dolor&nbsp;sit&nbsp;amet...'</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Mit statischem Text macht das ganze natürlich nur wenig Sinn.</p>
<h3>Beispiel zum Download</h3>
<p>Ich habe aus dem ganzen Code ein Beispielskript gebaut, welches die Anwendung (auch zusammen mit MySQL) klar machen soll:</p>
<p><a href="http://michaelbertsch.com/files/media/blog/minimalistic-template-engine.zip" class="download">Download</a>
</p>
 ]]></description>
  <pubDate>Sat, 19 May 2007 15:39:48 +0200</pubDate>
 </item>
 <item>
  <title>Mathe Stunde: f(x)=0 und Ziegenproblem</title>
  <link>http://michaelbertsch.com/blog/mathe-stunde-fx0-und-ziegenproblem</link>
  <description><![CDATA[ <p>Aufgrund einer Mathe Phase meinerseits gibt es jetzt zwei neue Codesnippets im Code-Bereich. Eine PHP Lösung des Problems f(x)=0 und ein Simulationsprogramm für das Ziegenproblem bzw. Monty-Hall-Problem.</p><h3>f(x)=0 Lösung</h3>
<p>Eine PHP Lösung des mathematischen Problems f(x)=0 durch ein <a href="http://de.wikipedia.org/wiki/Bisektion">Intervallhalbierungsverfahren (Bisektion)</a>. Es wird also durch Probieren gerechnet bis das Ergebnis der gegebenen Funktion 0 ergibt.<br />
<a href="http://michaelbertsch.com/snippet/loesung-von-fx0" class="more">Mehr</a></p>
<h3>Ziegenproblem Simulation</h3>
<p>Das <a href="http://de.wikipedia.org/wiki/Ziegenproblem">Ziegenproblem</a> oder Monty-Hall-Problem ist ein eher komplexes mathematisches Problem der bedingten Wahrscheinlichkeiten. Es lohnt sich also vor dem Probieren des Scripts, den <a href="http://de.wikipedia.org/wiki/Ziegenproblem">Artikel bei Wikipedia</a> dazu genau durchzulesen.</p>
<p>Wie sinnvoll eine Umsetzung davon in PHP ist, sei dahingestellt. Dabei stand eher der Spaß und Lerneffekt im Vordergrund ;)<br />
<a href="http://michaelbertsch.com/snippet/ziegenproblem-simulation" class="more">Mehr</a></p>
<p>Viel Spaß mit den beiden Snippets, vielleicht kann es ja jemand gebrauchen.
</p>
 ]]></description>
  <pubDate>Sun, 22 Apr 2007 12:18:05 +0200</pubDate>
 </item>
 <item>
  <title>Neues CMS?</title>
  <link>http://michaelbertsch.com/blog/neues-cms</link>
  <description><![CDATA[ <p>Wie unschwer zu erkennen ist hatte ich die letzten Monate keine Zeit zum  Bloggen, was aber nicht heißt, dass ich ganz untätig war. Denn ich arbeite derzeit an einem neuen CMS für meine Webseite und spiele mit dem Gedanken es open source zur Verfügung zu stellen.</p><h3>Screenshots</h3>
<div style="float:left"><a href="http://img153.imageshack.us/my.php?image=cmsinfobh5.jpg"><img src="http://img153.imageshack.us/img153/6145/cmsinfobh5.th.jpg" alt="CMS Infopanel" /></a></div>
<div style="float:left;margin:0px 10px"><a href="http://img87.imageshack.us/my.php?image=cmsinhaltebu9.jpg"><img src="http://img87.imageshack.us/img87/8098/cmsinhaltebu9.th.jpg" alt="CMS Inhaltsübersicht" /></a></div>
<div style="float:left"><a href="http://img223.imageshack.us/my.php?image=cmseinstellungenoq7.jpg"><img src="http://img223.imageshack.us/img223/4745/cmseinstellungenoq7.th.jpg" alt="CMS Einstellungen" /></a></div>
<p><br style="clear:left" /><br />
Eigentlich ist mir das Design beim CMS anfangs eher Nebensache. Trotzdem die Screenshots, weil ich finde dass es ganz gut geworden ist. Viel wichtiger ist mir allerdings eine solide Code-Basis auf der später gut gearbeitet werden kann. Diese Basis ist nun zu etwa 70% Fertig und wie ich finde gut geworden.</p>
<h3>Braucht die Welt noch ein CMS?</h3>
<p>Jedenfalls gibt es kein CMS das meinen Geschmack trifft. Am ehesten das neue <a href="http://code.google.com/p/habari/">Habari</a>, aber das befindet sich noch in der Alpha Phase und auch der Code gefällt mir nicht gerade immer gut.</p>
<h3>Und jetzt?</h3>
<p>Schaut euch mal die Screenshots an und sagt mir was ihr denkt. Eine Antwort auf die Frage "Braucht die Welt noch ein CMS?" wäre auch erwünscht.
</p>
 ]]></description>
  <pubDate>Tue, 27 Feb 2007 15:11:35 +0100</pubDate>
 </item>
 <item>
  <title>OOP: Globale Instanzen, Singletons und Registry Pattern</title>
  <link>http://michaelbertsch.com/blog/oop-globale-instanzen-singletons-und-registry-pattern</link>
  <description><![CDATA[ <p>Ich beschäftige mich gerade mit der objektorientierten Programmierung in PHP und versuche mein CMS so fast komplett neu umzusetzen und zu erweitern. Ein Problem war da aber: Wie setzt man am besten Objektinstanzen (z.B. von der Datenbank Klasse) global verfügbar?</p><h3>Problem von "global"</h3>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$test_var&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'Hello&nbsp;World'</span><span style="color: #007700">;<br />function&nbsp;</span><span style="color: #0000BB">test_function</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;</span><span style="color: #0000BB">$test_var</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #0000BB">$test_var</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">test_function</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code><br />
So einfach würde es gehen, Variablen vom lokalen <a href="http://nl3.php.net/manual/de/language.variables.scope.php">Geltungsbereich</a> auch in einer Funktion/Methode verfügbar zu machen. Warum man es dennoch nicht nutzen sollte:</p>
<ol>
<li><strong>Wiederverwendung von Code-Teilen</strong> wird erschwert wegen möglicherweise anderen Variablennamen.</li>
<li>Das <strong>finden von Fehlern</strong> wird erschwert, weil eine globale Variable überall definiert werden könnte.</li>
<li>Die <strong>Übersichtlichkeit</strong> leidet darunter, wenn sehr viele globale Variablen verwendet werden und somit wird es wahrscheinlich schwerer den Code später zu verstehen.</li>
</ol>
<h3>Abhilfe mit Singletons und Registry Pattern</h3>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">registry&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;</span><span style="color: #0000BB">$objects&nbsp;</span><span style="color: #007700">=&nbsp;array();<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;&amp;</span><span style="color: #0000BB">load</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;</span><span style="color: #0000BB">$me</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!</span><span style="color: #0000BB">is_object</span><span style="color: #007700">(</span><span style="color: #0000BB">$me</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$me&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">registry</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$me</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">,&nbsp;&amp;</span><span style="color: #0000BB">$object</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">objects</span><span style="color: #007700">[</span><span style="color: #0000BB">$name</span><span style="color: #007700">]&nbsp;=&amp;&nbsp;</span><span style="color: #0000BB">$object</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;&amp;</span><span style="color: #0000BB">get</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">objects</span><span style="color: #007700">[</span><span style="color: #0000BB">$name</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />function&nbsp;</span><span style="color: #0000BB">instance_require</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$registry&nbsp;</span><span style="color: #007700">=&amp;&nbsp;</span><span style="color: #0000BB">registry</span><span style="color: #007700">::</span><span style="color: #0000BB">load</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$args&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">func_get_args</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">)&nbsp;&gt;&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$ref&nbsp;</span><span style="color: #007700">=&nbsp;array();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach(</span><span style="color: #0000BB">$args&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$arg</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$ref</span><span style="color: #007700">[]&nbsp;=&amp;&nbsp;</span><span style="color: #0000BB">$registry</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">get</span><span style="color: #007700">(</span><span style="color: #0000BB">$arg</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$ref&nbsp;</span><span style="color: #007700">=&amp;&nbsp;</span><span style="color: #0000BB">$registry</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">get</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$ref</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Die Grundidee hinter diesem Code besteht darin, alle Instanzen der Objekte zu registrieren und dann später über die Funktion instance_require in den Methoden verfügbar zu machen. Singleton wird die load-Methode der registry-Klasse genannt. <strong>Single</strong>ton, weil dieses Modell nur eine Instanz der registry-Klasse zulässt.</p>
<h3>Verwendung</h3>
<p>Als erstes muss die registry geladen werden um benötigte Instanzen zur registry hinzuzufügen:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;Instance&nbsp;registry<br /></span><span style="color: #0000BB">$registry&nbsp;</span><span style="color: #007700">=&amp;&nbsp;</span><span style="color: #0000BB">registry</span><span style="color: #007700">::</span><span style="color: #0000BB">load</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">//&nbsp;Register&nbsp;instances<br /></span><span style="color: #0000BB">$db&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">database</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$registry</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">'db'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$db</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$var&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">variable</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$registry</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">'var'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$var</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Später können die registrierten Instanzen dann bequem über die Funktion instance_require geladen, bzw. referenziert werden:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">test&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">test_RequireOneInstance</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$database&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">instance_require</span><span style="color: #007700">(</span><span style="color: #DD0000">'db'</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Work&nbsp;with&nbsp;database<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">test_RequireMoreInstances</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list(</span><span style="color: #0000BB">$var</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$MyDBName</span><span style="color: #007700">)&nbsp;=&nbsp;</span><span style="color: #0000BB">instance_require</span><span style="color: #007700">(</span><span style="color: #DD0000">'var'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'db'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Work&nbsp;with&nbsp;both&nbsp;instances&nbsp;using&nbsp;only&nbsp;one&nbsp;line&nbsp;of&nbsp;code.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Isn't&nbsp;that&nbsp;nice?&nbsp;:o)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Quelle und mehr zum Thema gibt es auf <a href="http://www.phpit.net/article/using-globals-php/">www.phpit.net</a>.
</p>
 ]]></description>
  <pubDate>Sun, 03 Dec 2006 20:25:19 +0100</pubDate>
 </item>
 <item>
  <title>Was tun mit dem alten PC? - Heimkino PC im Eigenbau</title>
  <link>http://michaelbertsch.com/blog/was-tun-mit-dem-alten-pc--heimkino-pc-im-eigenbau</link>
  <description><![CDATA[ <p>Auf keinen Fall weg schmeißen! Ok, ein alter 486er kann gutes Gewissens entsorgt werden, aber mit einem Duron oder Athlon XP kann man sich einen schönen <acronym title="Home Theater Personal Computer">HTPC</acronym> bauen. Ein solcher PC vereint u.a. DVD-Player, Spielekonsole, Festplattenrecorder in einem Gerät, und ist dazu noch viel flexibler als gewöhnliche Wohnzimmer-Komponenten.</p><h3>Hardware</h3>
<ul>
<li><strong>Gehäuse:</strong> Möglichst klein, aber Vorsicht: kleine PC-Gehäuse und spezielle HTPC-Gehäuse haben oft nur Platz für MicroATX und nicht für normale ATX Mainboards.</li>
<li><strong>Mainboard:</strong> ...vom alten PC nehmen.</li>
<li><strong>CPU:</strong> Möglichst kühl und nicht übertaktet.</li>
<li><strong>CPU-Lüfter:</strong> Wenn nötig mit reduzierten Spannungen (mit Lüfteradapter von 12V auf z.B. 7V), um die Lautstärke zu reduzieren.</li>
<li><strong>Grafikkarte:</strong> Möglichst Passiv gekühlt. Alle nötigen Anschlüsse sollten vorhanden sein: S-Video, VGA, DVI und wer Zukunftssicher sein will HDMI.</li>
<li><strong>RAM:</strong> Weniger entscheidend beim HTPC. 256MB sollten für die meißten Anwendungen gut ausreichen.</li>
<li><strong>Netzteil:</strong> Wieder möglichst leise. Wer es ganz Leise haben möchte, sollte überlegen ein Lüfterloses Netzteil zu kaufen.</li>
<li><strong>Festplatte(n):</strong> 5400UPM Festplatten sollen noch leiser sein, aber sind durch die geringe Umdrehungszahl natürlich auch langsamer. Ich empfehle ansonsten eigentlich immer Samsung Festplatten.</li>
<li><strong>opt. Laufwerk:</strong> Normales DVD-Laufwerk oder Brenner. Ich bin mit NEC sehr zufrieden.</li>
<li><strong>TV-Karte:</strong> Möglichst digital (DVB-S, DVB-C oder DVB-T)</li>
<li><strong>Eingabegeräte:</strong> kabellose Tastatur und Maus oder nur eine Fernbedienung.</li>
</ul>
<h3>Software</h3>
<p>Ich selber verwende die Windows XP Media Center Edition. Für Windows ist das open source Programm <a href="http://www.team-mediaportal.de/">MediaPortal</a> auch zu empfehlen. Die einzige Software für Linux, die ich gefunden habe nennt sich <a href="http://de.wikipedia.org/wiki/Video_Disk_Recorder">Video Disk Recorder</a>.</p>
<h3>Weiterführende Links</h3>
<ul>
<li><a href="http://wiki.htpc-news.de/wiki/index.php?title=Hauptseite">HTPC-Board Wiki</a></li>
<li><a href="http://www.htpc.de">htpc.de</a></li>
<li><a href="http://tv-out.de/">tv-out.de - Wie kommt das PC-Bild auf den Fernseher?</a></li>
</ul>
 ]]></description>
  <pubDate>Sun, 12 Nov 2006 14:05:18 +0100</pubDate>
 </item>
 <item>
  <title>SQL Injection: Wie verantwortungslos kann man sein?</title>
  <link>http://michaelbertsch.com/blog/sql-injection-wie-verantwortungslos-kann-man-sein</link>
  <description><![CDATA[ <p>... und wie Paranoid sollte man sein? Grunsätzlich gilt: Besser zu Paranoid, denn Sicherheitslücken im nachhinein zu finden und auszubessern ist meist sehr mühsam. Und oft ist ein sicheres Script nicht mehr Arbeit als ein unsicheres.</p><p>SQL Injection ist ein alt bekanntes Sicherheitsproblem, welches - wie so oft - bei ungefilterten Benutzereingaben liegt. Darum sollten Eingaben vom Client immer überprüft (validiert) werden.</p>
<h3>Beispiel</h3>
<p>Ein sehr arges Beispiel das ich erst vor kurzem gesehen habe:<br />
<code>http://example.com/seite.php?table=benutzer&field=passfoto&where=kuerzel='AB'</code></p>
<p>Das ist jetzt kein Scherz. Nicht dass ihr denkt ich erfinde da etwas... muss ich garnicht!<br />
Die GET Parameter werden so direkt in die SQL Query eingefügt:</p>
<p><code>SELECT passfoto FROM benutzer WHERE kuerzel='AB'</code></p>
<p>Jetzt könnte man natürlich die Parameter ändern und eine beliebige Query ausführen und somit an Passwörter oder andere Daten kommen.</p>
<h3>Sichere Queries</h3>
<p>Das open source CMS <a href="http://drupal.org">Drupal</a> hat da eine einfache aber sehr schöne Lösung eingebaut. Die Query wird dabei mit <a href="http://de.php.net/sprintf">sprintf</a> formatiert, wobei z.B. %d für Zahlen stehen und NUR Zahlen in diesem Argument erlaubt sind. Also ist weiteres validieren unnötig. Ich habe diese Funktion abgeändert und vereinfacht, sodass diese mit jedem Script verwendet werden kann:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">db_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$query</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$args&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">func_get_args</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">)&nbsp;&gt;&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset(</span><span style="color: #0000BB">$args</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]);&nbsp;</span><span style="color: #FF8000">//&nbsp;Query&nbsp;should&nbsp;not&nbsp;be&nbsp;escaped.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$args&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql_real_escape_string'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$args</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">array_unshift</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$query</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;Add&nbsp;query&nbsp;again&nbsp;for&nbsp;sprintf.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$query&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">call_user_func_array</span><span style="color: #007700">(</span><span style="color: #DD0000">'sprintf'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$args</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$result&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$query</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$result</span><span style="color: #007700">;<br />}<br /></span><span style="color: #FF8000">//&nbsp;Example<br /></span><span style="color: #0000BB">db_query</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT&nbsp;*&nbsp;FROM&nbsp;table&nbsp;WHERE&nbsp;typ=%d&nbsp;AND&nbsp;name="%s"'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'typ'</span><span style="color: #007700">],&nbsp;</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<h3>Magic Quotes abschalten</h3>
<p>Diese sehr umstrittene PHP Einstellung stellt (wenn sie aktiviert ist) allen Metazeichen (vorallem einfache Anführungszeichen) von der Clientseite (POST, GET, Cookie,...) automatisch einen Backslash bevor. Dadurch kann kein oder nur erschwert Code in Queries gebracht werden.</p>
<p>Diese Einstellung muss also deaktiviert werden, wenn man Benutzereingaben selber überprüft (also auch bei Verwendung der db_query funktion). Am besten in der php.ini "magic_quotes_runtime" auf 0 setzen, oder per Script deaktivieren falls man keinen Zugang zur php.ini hat:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'magic_quotes_runtime'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;Try&nbsp;to&nbsp;turn&nbsp;magic_quotes&nbsp;off<br />//&nbsp;Stripslashes&nbsp;in&nbsp;deep&nbsp;if&nbsp;needed.<br /></span><span style="color: #007700">if(</span><span style="color: #0000BB">get_magic_quotes_gpc</span><span style="color: #007700">())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$_GET&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">stripslashes_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$_POST&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">stripslashes_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$_COOKIE&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">stripslashes_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">);<br />}<br />function&nbsp;</span><span style="color: #0000BB">stripslashes_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">is_array</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$value&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #DD0000">'stripslashes_r'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$value</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$value&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">stripslashes</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$value</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Wer diese Funktionen benutzt ist auf der sicheren Seite und viel mehr Arbeit ist es garnicht, da diese Code Teile in jedem Script gleich verwendet werden können.
</p>
 ]]></description>
  <pubDate>Sun, 22 Oct 2006 12:57:41 +0200</pubDate>
 </item>
 <item>
  <title>Oben, rechts, unten, links, was?</title>
  <link>http://michaelbertsch.com/blog/oben-rechts-unten-links-was</link>
  <description><![CDATA[ <p>Der Titel mag verwirrend sein, aber es geht um CSS in diesem Beitrag. Und zwar konnte ich mir nie Reihenfolge der Eigenschaften bei z.B. margin merken, bis ich heute einen Geistesblitz hatte.</p><p>Geht es nur mir so, oder müsst ihr auch immer auf Seiten wie <a href="http://css4you.de">CSS4You</a> nachsehen, in welcher Reihenfolge die Eigenschaften gehören?</p>
<h3>Beispiel</h3>
<p><code>margin: 5px 10px 0px 5px;</code><br />
Was ist denn nun oben, unten, links und rechts?</p>
<h3>Lösung</h3>
<p>Von oben angefangen gehen die Angaben im Uhrzeigersinn um die Box:</p>
<div style="text-align:center;margin: 10px 0px;"><img src="http://michaelbertsch.com/files/media/blog/boxmodell.jpg" alt="Boxmodell" /></div>
<p>So ist es endlich einfach zu merken und ich muss nicht immer nachsehen.
</p>
 ]]></description>
  <pubDate>Sun, 15 Oct 2006 15:45:57 +0200</pubDate>
 </item>
 <item>
  <title>Converter für programmierer</title>
  <link>http://michaelbertsch.com/blog/converter-fuer-programmierer</link>
  <description><![CDATA[ <p>Dieses Script ist gedacht um schnell verschiedene Berechnungen durchzuführen, die beim Programmieren öfter benötigt werden wie z.b. MD5 oder Berechnungen zwischen Hex, Bin und ASCII. Es steht gratis zum Download und kann von jedem frei verwendet und geändert werden.</p><h3>Features</h3>
<ul>
<li>Hash
<ul>
<li>MD5</li>
<li>SHA1</li>
<li>CRC32</li>
</ul>
</li>
<li>HTML
<ul>
<li>URL Encode</li>
<li>URL Decode</li>
<li>HTML Entities Encode</li>
<li>HTML Entities Decode</li>
<li>Base 64 Encode</li>
<li>Base 64 Decode</li>
</ul>
</li>
<li>Bin/Hex/ASC
<ul>
<li>Binary to Hex</li>
<li>Hex to Binary</li>
<li>Ascii to Binary</li>
<li>Binary to Ascii</li>
<li>Hex to Ascii</li>
<li>Ascii to Hex</li>
</ul>
</li>
<li>Misc
<ul>
<li>ASCII Code</li>
<li>Reverse (Backwards)</li>
<li>Shuffle</li>
<li>Length</li>
<li>Timestamp</li>
<li>Quote (RegEx)</li>
<li>Strip HTML Tags</li>
</ul>
</li>
</ul>
<p>Zu finden ist das Script auf der <a href="http://michaelbertsch.com/script/converter">Projekt Seite</a>.</p>
<ul>
<li><a href="http://michaelbertsch.com/files/demo/converter/index.php">Demo</a></li>
<li><a href="http://michaelbertsch.com/download/converter.zip">Download</a></li>
</ul>
 ]]></description>
  <pubDate>Sat, 30 Sep 2006 17:45:38 +0200</pubDate>
 </item>
 <item>
  <title>TinyGallery einfach erweitern + Versionsupdate (1.1)</title>
  <link>http://michaelbertsch.com/blog/tinygallery-einfach-erweitern-versionsupdate-1.1</link>
  <description><![CDATA[ <p>Das kleine <a href="http://michaelbertsch.com/project/50">Gallery Script</a> hat nun das erste große Update hinter sich. Neben dem verbesserten Code kamen Features hinzu und einige Fehler wurden behoben.</p><h3>Änderungen in v1.1</h3>
<ul>
<li>Bugfix: Sortierung der Dateien und Ordner. Vorher war die Reihenfolge beliebig, jetzt Alphabetisch.</li>
<li>Einfach erweiterbarer Info Bereich.</li>
<li>Status Speicherung: Es wird nun per Cookie gespeichert welche Tabs im Info Bereich offen sind.</li>
<li>Accesskeys "p" (previous) und "n" (next) zur Navigation.</li>
<li>Style: Im Internet Explorer war der "Next" Link um 1px verschobe, was etwas unschön aussah.</li>
<li>Viele weitere, kleine Änderungen.</li>
</ul>
<h3>TinyGallery einfach erweitern</h3>
<p>Mit dem Versionsupdate lässt sich TinyGallery nun sehr einfach erweitern. So könnte z.B. eine Beschreibung zu jedem Bild aus einer Datenbank ausgegeben werden. Ein Beispiel wie das funktionieren würde. Als erstes benötigen wir eine Funktion, die eine Verbindung zur Datenbank aufbaut (z.B. MySQL) und die Beschreibung zum Bild zurückgiebt.</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">info_description</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;</span><span style="color: #0000BB">$dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$files</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$img_key</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Connect&nbsp;and&nbsp;select&nbsp;DB<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mysql_connect</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql_host'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'mysql_user'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'mysql_password'</span><span style="color: #007700">)&nbsp;or&nbsp;die(</span><span style="color: #0000BB">mysql_error</span><span style="color: #007700">());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mysql_select_db</span><span style="color: #007700">(</span><span style="color: #DD0000">'test'</span><span style="color: #007700">)&nbsp;or&nbsp;die(</span><span style="color: #0000BB">mysql_error</span><span style="color: #007700">());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Get&nbsp;image&nbsp;description<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$query&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT&nbsp;name,dir,description&nbsp;FROM&nbsp;`tinygallery_desc`&nbsp;WHERE&nbsp;`dir`="'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">mysql_real_escape_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$dir</span><span style="color: #007700">).</span><span style="color: #DD0000">'"&nbsp;AND&nbsp;`name`="'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">mysql_real_escape_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$files</span><span style="color: #007700">[</span><span style="color: #0000BB">$img_key</span><span style="color: #007700">])&nbsp;.</span><span style="color: #DD0000">'"'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$info&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_fetch_row</span><span style="color: #007700">(</span><span style="color: #0000BB">$query</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Return&nbsp;description&nbsp;(if&nbsp;available)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(isset(</span><span style="color: #0000BB">$info</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$info</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #DD0000">'No&nbsp;description&nbsp;available'</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Hier noch die Datenbank Struktur, die bei diesem Beispiel verwendet worden ist:<br />
<code>CREATE TABLE `tinygallery_desc` (
  `name` varchar(255) NOT NULL,
  `dir` varchar(255) NOT NULL,
  `description` text NOT NULL,
  PRIMARY KEY  (`name`,`dir`)
) TYPE=MyISAM;</code></p>
<p>Sinnvollerweise sollte die Funktion bei den Info Funktionen nach der Funktion "info_browse" platziert werden. So, der großteil ist schon geschafft. Jetzt muss nur noch das conf_info Array (oben bei der Konfiguration) erweitert werden:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$conf_info&nbsp;</span><span style="color: #007700">=&nbsp;array(&nbsp;</span><span style="color: #FF8000">//&nbsp;Which&nbsp;infos&nbsp;should&nbsp;be&nbsp;loaded?<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'common'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'Image&nbsp;Info'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'browse'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'Browse&nbsp;Subfolders'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'description'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'Description'<br /></span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Array Schlüssel ist der Funktionsname ohne Präfix "info_" und der Wert ist der Name unter dem es im Info Bereich angezeigt werden soll. Wenn eine Standard Info nicht gebraucht wird, einfach die Zeile löschen oder auskommentieren (Vorsicht aber mit den Kommas!).</p>
<h3>Copyright</h3>
<p>Ich finde es ja nicht so toll wenn meine Scripte ohne Copyright Hinweis verwendet werden, wie z.B. <a href="http://www.phpuniverset.dk/se_child_forum.phtml?forum_id=1&id=2623">hier</a>. Ein HTML Kommentar stört doch niemand, oder?</p>
<p>So jetzt aber viel Spaß mit der neuen Version ;)
</p>
 ]]></description>
  <pubDate>Tue, 05 Sep 2006 15:18:03 +0200</pubDate>
 </item>
 <item>
  <title>Standard XHTML Template</title>
  <link>http://michaelbertsch.com/blog/standard-xhtml-template</link>
  <description><![CDATA[ <p>Beim erstellen einer neuen Webseite fängt man meißt mit den selben Grundlagen an: <acronym title="Document Type Definition">DTD</acronym>, Titel, usw. Um etwas Zeit zu sparen habe ich ein kleines Standard Template zusammen gestellt, das grundlegende (X)HTML und CSS angaben beinhaltet.</p><p>Ich werde jetzt zwar nicht auf alle Einzelheiten dieses Templates eingehen, da es größtenteils selbsterklärend sein müsste. Zwei kleine Feinheiten hat es aber:</p>
<h3>Clearfix Hack</h3>
<p>Der Clearfix Hack von <a href="http://positioniseverything.net/easyclearing.html">Positioniseverything</a> wurde eingebaut. Dieser ermöglicht es floats ohne zusätzliches Markup zu "clearen". Einfach mit dem zuweisen der Klasse "clearfix". Ein kleiner Tipp noch dazu: Es können einem Element mehrere CSS Klassen zugewiesen werden (einfach mit einem Leerzeichen trennen).</p>
<h3>Druck-Stylesheet</h3>
<p>Da HTML Attribute wie href oder title auf Papier nicht erkennbar sind, wird mit diesem separatem print Stylesheet eine Link Adresse in spitzen Klammern nach dem Link Text geschrieben und Titel Attribute nach dem Element in runden Klammern. Auch das cite Attribut für Quellenangaben wird für den Druck nach dem Element dargestellt.</p>
<p><a href="http://michaelbertsch.com/download/standard_template.zip" class="download">Download</a>
</p>
 ]]></description>
  <pubDate>Sat, 02 Sep 2006 19:46:05 +0200</pubDate>
 </item>
 <item>
  <title>IE7: Änderungen für Webdesigner</title>
  <link>http://michaelbertsch.com/blog/ie7-aenderungen-fuer-webdesigner</link>
  <description><![CDATA[ <p>Gerade vor ein paar Tagen wurde der Release Candidate 1 zum <a href="http://www.microsoft.com/windows/ie/downloads/default.mspx">Download</a> freigegeben und die Final soll auch <a href="http://www.betanews.com/article/Microsoft_Were_Close_to_Shipping_IE7/1156390090">nicht mehr lange</a> auf sich warten lassen. Passend dazu wurde im IE Blog ein <a href="http://blogs.msdn.com/ie/archive/2006/08/22/712830.aspx">Beitrag</a> über alle CSS Änderungen geschrieben.</p><p>Insgesammt wurden 200 Änderungen im Bereich CSS vorgenommen. Die wichtigsten davon (wie ich finde) hier kurz zusammengefasst:</p>
<h3>Wichtigste Änderungen</h3>
<ul>
<li>Alle Bugs auf <a href="http://www.positioniseverything.net/explorer.html">positioniseverything.net</a> außer dem "escaping floats" Bug.</li>
<li>Pseudo-Klasse :hover wird nun auf allen Elementen unterstützt, nicht nur auf &lt;a&gt;</li>
<li>Min/max width/height support</li>
<li>Alpha Kanal PNG support</li>
</ul>
<p><a href="http://blogs.msdn.com/ie/archive/2006/08/22/712830.aspx">Original Post im IEBlog</a></p>
<p>Da der Browser als <a href="http://winfuture.de/news,26552.html">"hochkritischen" Sicherheits-Update</a> ausgeliefert werden soll, bin ich gespannt wieviel Prozent nach der veröffentlichung der finalen Version noch den alten IE6 benutzen. Aber wahrscheinlich zuviel, um auf IE6 support zu verzichten.
</p>
 ]]></description>
  <pubDate>Mon, 28 Aug 2006 12:08:14 +0200</pubDate>
 </item>
 <item>
  <title>Trackback Spam verhindern</title>
  <link>http://michaelbertsch.com/blog/trackback-spam-verhindern</link>
  <description><![CDATA[ <p>Manch einer hat es vielleicht gesehen - in der Zeit als ich im Urlaub war (letzte Woche) wurde ein <a href="http://michaelbertsch.com/blog/48">Blog-Post</a> mit Spam-Trackbacks "zugemüllt". Nun habe ich mich auf die Suche nach einer guten Validierungsmöglichkeit gemacht und vorallem eine relativ gute Möglichkeit gefunden.</p><p>Problem ist, dass beim Trackback kein Formular abgesendet wird. Darum kann ich meine normale <a href="http://michaelbertsch.com/blog/43">Antispam Funktion</a> oder <a href="http://de.wikipedia.org/wiki/Captcha">captchas</a> hier nicht verwenden.</p>
<h3>Möglichkeiten</h3>
<ol>
<li>Bei jedem eingehenden Trackback, wird die Webseite (von welcher der Trackback kommt) per <a href="http://de.php.net/fsockopen">fsockopen</a> ausgelesen und gesucht ob ein Link zu der eigenen Seite vorhanden ist. Wenn das nicht der Fall ist, wird der Trackback direkt gelöscht oder moderiert.</li>
<li>Die gute alte Badwords-Liste. Einfach eine Liste mit "bösen"-Wörter anlegen. Wenn nun ein solches Wort im Trackback excerpt vorkommt wird er geblockt.</li>
<li>Eine andere Möglichkeit ist (wie bei Kommentarspam) natürlich IP-Adressen oder Bereiche auszusperren.</li>
<li>Nach einer weiteren (besseren) Möglichkeit suche ich noch, denn alle haben ihre Nachteile: 1. Sehr Server-lastig bei vielen Spam-Trackbacks. 2. und 3. werden wohl nie alle Spams blocken können.
</li>
</ol>
<p>Bis jetzt habe ich auf dieser Seite nur die erste Möglichkeit eingebaut. Mal sehen wie lange das gut geht. Ansonsten wenn jemand noch eine Idee hat, immer her damit ;)</p>
<h3>Links zum Thema</h3>
<ul>
<li><a href="http://seclab.cs.rice.edu/proj/trackback/trackback-validator-plugin/">Trackback Validator Plugin für Wordpress</a></li>
<li><a href="http://wiki.wordpress.org/?pagename=Plugin#spam">Wordpress Anti-Spam Plugins</a></li>
<li><a href="http://www.linksleeve.org/">LinkSleeve: Spam Link Verification</a></li>
<li><a href="http://meta.wikimedia.org/wiki/Anti-spam_Features">Wiki Anti-spam Features</a></li>
<li><a href="http://akismet.com/">Akismet</a></li>
</ul>
 ]]></description>
  <pubDate>Mon, 21 Aug 2006 22:18:44 +0200</pubDate>
 </item>
 <item>
  <title>Script: TinyGallery</title>
  <link>http://michaelbertsch.com/blog/script-tinygallery</link>
  <description><![CDATA[ <p>Gerade habe ich ein kleines aber feines PHP Script fertiggestellt. Wie der Name schon sagt ist es eine kleine Gallery, die nur aus einer Datei besteht und somit bequem ohne langes Einrichten verwendet werden kann.</p><p>Oft ist es doch so: Man hat ein paar Fotos die man mit seinen Freunden teilen möchte, aber dafür kein unschönes Directory-listing verwenden oder extra eine aufwändige Bildergallerie installieren will. An dem Punkt setzt TinyGallery an. TinyGallery besteht aus nur einer PHP-Datei, ist simpel aufgebaut, aber trotzdem funktional. Einfaches hochladen dieser einen Datei genügt für eine vollwertige Gallery.</p>
<h4>Installation</h4>
<ul>
<li>"index.php" öffnen und Konfigurations-Variablen ändern (optional)</li>
<li>Einige Bilder und die index.php auf den Webserver laden</li>
<li>Seite aufrufen und loslegen.</li>
</ul>
<h4>Links</h4>
<ul>
<li><a href="http://michaelbertsch.com/files/demo/TinyGallery/index.php">Demo</a></li>
<li><a href="http://michaelbertsch.com/download/tinygallery.zip">Download</a></li>
</ul>
<p>Zu finden ist das ganze auch im <a href="http://michaelbertsch.com/project/50">Projekte</a> Bereich. Bei Bugs oder anderen Problemen bitte hier einen Kommentar schreiben oder über das <a href="http://michaelbertsch.com/contact">Kontaktformular</a> bei mir melden.
</p>
 ]]></description>
  <pubDate>Wed, 02 Aug 2006 21:00:40 +0200</pubDate>
 </item>
 <item>
  <title>Kommentarspam verhindern mit PHP</title>
  <link>http://michaelbertsch.com/blog/kommentarspam-verhindern-mit-php</link>
  <description><![CDATA[ <p>Viele Blogger klagen zur Zeit über Spam in ihren Kommentaren. Es gibt allerdings einige einfache Tricks um sich vor Spam-Bots zu schützen und sich so unnötige Arbeit mit dem Löschen solcher Kommentare zu ersparen.</p><p>Meine kleine PHP Funktion arbeitet mit einem Punkte-System. So kann jeder selber festlegen ab wann der Post als Spam erkannt werden soll.</p>
<p>Überprüft werden folgende Faktoren:</p>
<ul>
<li>Ob der Benutzer von einer Seite der gleichen Domain weitergeleitet wurde (Referer).</li>
<li>Wie lange gebraucht wurde um das Formular auszufüllen.</li>
<li>Ob die IP Adresse überein stimmt.</li>
<li>Und ob der im Hintergrund übermittelte Hash stimmt.</li>
</ul>
<h3>Vorbereiten des Formulars</h3>
<p>Als erstes muss das Kommentar-Formular mit zwei zusätzlichen Formularfeldern ausgestattet werden. So z.B.:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$rand_chr&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'2/dx§&amp;K40xaw1=4?d'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$query&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">time</span><span style="color: #007700">()&nbsp;.</span><span style="color: #DD0000">'_'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">base64_encode</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'REMOTE_ADDR'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$hash&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">md5</span><span style="color: #007700">(</span><span style="color: #0000BB">$query&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$rand_chr</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #DD0000">'&lt;input&nbsp;name="as_query"&nbsp;type="hidden"&nbsp;value="'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$query&nbsp;</span><span style="color: #007700">.</span><span style="color: #DD0000">'"&nbsp;/&gt;'</span><span style="color: #007700">;<br />echo&nbsp;</span><span style="color: #DD0000">'&lt;input&nbsp;name="as_hash"&nbsp;type="hidden"&nbsp;value="'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$hash&nbsp;</span><span style="color: #007700">.</span><span style="color: #DD0000">'"&nbsp;/&gt;'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Hier wird also die Zeit übermittelt (wann das Formular generiert wurde), die IP-Adresse (base64 enkodiert) und ein Hash davon, damit die Angaben danach auf ihre Richtigkeit überprüft werden können. Dem MD5 Hash wird noch eine Zeichenkette angehängt, sonst wär es wieder einfach für Spam-Bots. Diese Zeichenkette solltet ihr selber zufällig wählen.</p>
<h3>Überprüfen der Formular-Daten</h3>
<p>Jetzt der wichtigste Teil des Scripts:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">is_spam</span><span style="color: #007700">(</span><span style="color: #0000BB">$max_points&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;</span><span style="color: #0000BB">$rand_chr</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;Requires&nbsp;the&nbsp;random&nbsp;string&nbsp;from&nbsp;before.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$points&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(isset(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'as_query'</span><span style="color: #007700">],&nbsp;</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'as_hash'</span><span style="color: #007700">])&nbsp;&amp;&amp;&nbsp;</span><span style="color: #0000BB">strpos</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'as_query'</span><span style="color: #007700">],&nbsp;</span><span style="color: #DD0000">'_'</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Process&nbsp;submitted&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">list(</span><span style="color: #0000BB">$timestamp</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$ip</span><span style="color: #007700">)&nbsp;=&nbsp;</span><span style="color: #0000BB">explode</span><span style="color: #007700">(</span><span style="color: #DD0000">'_'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'as_query'</span><span style="color: #007700">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Check&nbsp;for&nbsp;same&nbsp;hash<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'as_hash'</span><span style="color: #007700">]&nbsp;!=&nbsp;</span><span style="color: #0000BB">md5</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'as_query'</span><span style="color: #007700">]&nbsp;.&nbsp;</span><span style="color: #0000BB">$rand_chr</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$points&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">6</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Check&nbsp;for&nbsp;same&nbsp;IP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(</span><span style="color: #0000BB">base64_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$ip</span><span style="color: #007700">)&nbsp;!=&nbsp;</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'REMOTE_ADDR'</span><span style="color: #007700">])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$points&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Check&nbsp;on&nbsp;timestamp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(</span><span style="color: #0000BB">time</span><span style="color: #007700">()&nbsp;-&nbsp;</span><span style="color: #0000BB">$timestamp&nbsp;</span><span style="color: #007700">&lt;=&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$points&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif(</span><span style="color: #0000BB">time</span><span style="color: #007700">()&nbsp;-&nbsp;</span><span style="color: #0000BB">$timestamp&nbsp;</span><span style="color: #007700">&lt;=&nbsp;</span><span style="color: #0000BB">6</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$points&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Check&nbsp;for&nbsp;valid&nbsp;referer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(!</span><span style="color: #0000BB">strpos</span><span style="color: #007700">(</span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'HTTP_REFERER'</span><span style="color: #007700">]),&nbsp;</span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'HTTP_HOST'</span><span style="color: #007700">])))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$points&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Is&nbsp;it&nbsp;spam?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(</span><span style="color: #0000BB">$points&nbsp;</span><span style="color: #007700">&lt;=&nbsp;</span><span style="color: #0000BB">$max_points</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;No&nbsp;spam<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;spam&nbsp;:-(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;No&nbsp;form&nbsp;data&nbsp;submitted.&nbsp;Handle&nbsp;as&nbsp;spam.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Mit dieser Funktion werden die Daten überprüft und Punkte vergeben. Ich denke mehr brauche ich dazu nicht sagen/schreiben, da alles auskommentiert ist, aber bei Fragen bitte die Kommentare nutzen. </p>
<p>Danach kann man bequem überprüfen ob der Post als Spam erkannt wurde oder nicht:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if(</span><span style="color: #0000BB">is_spam</span><span style="color: #007700">())&nbsp;{<br />&nbsp;&nbsp;die(</span><span style="color: #DD0000">'don't&nbsp;spam&nbsp;my&nbsp;blog'</span><span style="color: #007700">);<br />}<br />else&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;sql&nbsp;INSERT&nbsp;or&nbsp;whatever&nbsp;you&nbsp;want&nbsp;:)<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Das ganze kann man natürlich nicht nur mit Kommentarformularen benutzen sondern eigentlich mit jedem Formular. Unabhängig davon gibt es auch andere Methoden zur Spam-Bekämpfung. So kann man z.B. mit htaccess ganze IP Bereiche aussperren, was allerdings auch manchmal auch echte User aussperrt. Hier noch ein paar interessante Links dazu:</p>
<p><a href="http://blog.patrickkempf.de/archives/2006/06/03/spam-attacke-geht-weiter/">http://blog.patrickkempf.de/archives/2006/06/03/spam-attacke-geht-weiter/</a><br />
<a href="http://unknowngenius.com/blog/wordpress/spam-karma/">http://unknowngenius.com/blog/wordpress/spam-karma/</a><br />
<a href="http://www.basicthinking.de/blog/2006/05/22/spam-branche-mit-zukunft/">http://www.basicthinking.de/blog/2006/05/22/spam-branche-mit-zukunft/</a>
</p>
 ]]></description>
  <pubDate>Tue, 27 Jun 2006 20:07:44 +0200</pubDate>
 </item>
 <item>
  <title>Post-Daten Validierung</title>
  <link>http://michaelbertsch.com/blog/post-daten-validierung</link>
  <description><![CDATA[ <p>Jeder der sich länger mit PHP befasst hat kennt das Problem - die Validierung der Benutzereingaben. Ich Zitiere bei diesem Thema immer wieder gerne einen Programmierer der sagte: "Never trust a users input" (soweit ich mich erinnere war es ein Microsoft Mitarbeiter). Darum möchte ich euch mit diesem Post einige kleine PHP Funktionen mit auf den Weg geben, die das Validieren erleichtern.</p><p>Grundfunktion und zwei Zusatzfunktionen (erweiterbar):<br />
<code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">validate</span><span style="color: #007700">(</span><span style="color: #0000BB">$fields&nbsp;</span><span style="color: #007700">=&nbsp;array(),&nbsp;</span><span style="color: #0000BB">$optional_fields&nbsp;</span><span style="color: #007700">=&nbsp;array())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$errors&nbsp;</span><span style="color: #007700">=&nbsp;array();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Validate&nbsp;normal,&nbsp;required&nbsp;fields<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">foreach(</span><span style="color: #0000BB">$fields&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$fieldname&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">$type</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">(</span><span style="color: #DD0000">'validate_'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$type</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #0000BB">$fieldname</span><span style="color: #007700">])&nbsp;===&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$errors</span><span style="color: #007700">[]&nbsp;=&nbsp;</span><span style="color: #0000BB">$fieldname</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Process&nbsp;optional&nbsp;fields<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">foreach(</span><span style="color: #0000BB">$optional_fields&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$fieldname&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">$type</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!empty(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #0000BB">$fieldname</span><span style="color: #007700">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">(</span><span style="color: #DD0000">'validate_'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$type</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #0000BB">$fieldname</span><span style="color: #007700">])&nbsp;===&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$errors</span><span style="color: #007700">[]&nbsp;=&nbsp;</span><span style="color: #0000BB">$fieldname</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$errors</span><span style="color: #007700">;<br />}<br />function&nbsp;</span><span style="color: #0000BB">validate_url</span><span style="color: #007700">(</span><span style="color: #0000BB">$url</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;if&nbsp;(!</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/^(http|https|ftp)://[a-z0-9/:_-_.?$,~=#&amp;%+]+$/i",&nbsp;$url))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;}<br />}<br />function&nbsp;validate_numeric($num)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(!is_numeric($num))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />?&gt;</span></span></code></p>
<p>Das Prinzip ist eigentlich ganz einfach. Die Funktion validate() benötigt mindestens einen Parameter, der ein Array sein muss.</p>
<p>Das sieht dann z.B. Folgendermaßen aus:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$errors&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">validate</span><span style="color: #007700">(array(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'www'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'url'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'numbers'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'numeric'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Der Schlüssel des Arrays ist immer der Name des Post Feldes, das validiert werden soll, und der Wert, der Name der Funktion, die zur Validierung benutzt werden soll. Also würde in diesem Beispiel $_POST['www'] nach einer gültigen URL überprüft werden und $_POST['numbers'] nach einem nummerischen Wert.</p>
<p>Soweit sogut. Wie sich einige villeicht schon gedacht haben wird ein Array mit allen ungültigen Post Feldern zurückgegeben und in diesem Fall in der Variable $errors gespeichert.</p>
<p>Der 2. Parameter für validate() ist für optionale Felder und funktioniert im Prinzip genau gleich wie der erste. So könnte dann beispielsweise der fertige Code aussehen (die Funktionen müssen natürlich auch eingebunden werden):</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$errors&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">validate</span><span style="color: #007700">(array(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'www'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'url'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'body'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'numeric'</span><span style="color: #007700">));<br />if(</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$errors</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">'Fehler&nbsp;bei&nbsp;der&nbsp;Eingabe:&nbsp;'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">',&nbsp;'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$errors</span><span style="color: #007700">);<br />}<br />else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">'Eingaben&nbsp;OK.'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></p>
<p>Das feine daran ist, dass dieses Script sehr einfach erweitert werden kann. Hier noch ein paar zusätzliche Validierungs-Funktionen die mit der Grundfunktion verwendet werden können:</p>
<p><code class="php"><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">validate_email</span><span style="color: #007700">(</span><span style="color: #0000BB">$email</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;if(!</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/^[A-Za-z0-9](([_.-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([.-]?[a-zA-Z0-9]+)*).([A-Za-z]{2,})$/",&nbsp;$email))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;}<br />}<br />function&nbsp;validate_plz($plz)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$plz&nbsp;&gt;&nbsp;1000&nbsp;&amp;&amp;&nbsp;!$plz&nbsp;&lt;=&nbsp;99998)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />?&gt;</span></span></code>
</p>
 ]]></description>
  <pubDate>Wed, 21 Jun 2006 22:48:56 +0200</pubDate>
 </item>
</channel>
</rss>

