<?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/"
	>

<channel>
	<title>compufreak &#187; webdesign</title>
	<atom:link href="http://www.compufreak.info/tag/webdesign/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.compufreak.info</link>
	<description>Blog und Vodcast über Computer, Webdesign und den Sinn des Lebens</description>
	<lastBuildDate>Mon, 30 Jan 2012 16:02:41 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Spamschutzmechanismen für die eigene Homepage</title>
		<link>http://www.compufreak.info/2011/09/06/spamschutzmechanismen-fur-die-eigene-homepage/</link>
		<comments>http://www.compufreak.info/2011/09/06/spamschutzmechanismen-fur-die-eigene-homepage/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 19:54:16 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[PHP-Scripte]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=2288</guid>
		<description><![CDATA[Im Netz findet man unglaubliche Zahlen sobald es um das Thema Spam-Aufkommen geht. Einige sprechen da von ca. 80 Billionen Spam-Emails – jährlich. Tendenz: Steigend. Und diese Zahlen beziehen sich lediglich auf Email-Spam. Das Spam-Aufkommen auf der eigenen Website ist ebenfalls eine Plage für all jene, die an sich selbst den Anspruch stellen ihren Online-Auftritt Spam-frei zu halten.]]></description>
			<content:encoded><![CDATA[<div id="attachment_2290" class="wp-caption alignright" style="width: 310px"><a href="http://www.compufreak.info/wp-content/uploads/2011/09/titelbild.png"><img src="http://www.compufreak.info/wp-content/uploads/2011/09/titelbild-300x199.png" alt="NEIN! ... Ich habe Email in meinem Spam!" title="Email im SPAM." width="300" height="199" class="size-medium wp-image-2290" /></a><p class="wp-caption-text">Titelbild: Die SPAM-Flut</p></div>
<p><strong>Vorwort</strong></p>
<p>Im Netz findet man unglaubliche Zahlen sobald es um das Thema Spam-Aufkommen geht. Einige sprechen da von ca. 80 Billionen Spam-Emails – jährlich. Tendenz: Steigend. Und diese Zahlen beziehen sich lediglich auf Email-Spam. Das Spam-Aufkommen auf der eigenen Website ist ebenfalls eine Plage für all jene, die an sich selbst den Anspruch stellen ihren Online-Auftritt Spam-frei zu halten.</p>
<p><strong>In diesem Artikel erfahren Sie:</strong></p>
<ul>
<li>Wie eine Maschine einen Menschen von einem böswilligen Artgenossen unterscheiden lernt.</li>
<li>Welche einfachen Tricks große Teile des täglichen Spams abfangen.</li>
<li>Mit welchen Methoden sich die eigene Email-Adresse im Web vor Crawlern schützen lässt.</li>
<li>Warum es gar nicht so schwer ist ein Captcha zu basteln.</li>
<li>Welche Instant-Lösungen bereits zur Verfügung stehen.</li>
<li>Mit welchen Erweiterungen man Content-Management-Systeme erfolgreich gegen Spam verteidigt.</li>
</ul>
<p><strong>Was Sie vorher besitzen sollten:</strong></p>
<ul>
<li>Fortgeschrittene Kenntnisse in PHP (Session, Grafiken „on-the-fly“, etc.).</li>
<li>Gegebenenfalls grundlegende Kenntnisse bezüglich des jeweiligen CMS.</li>
</ul>
<p><strong>Einleitung</strong></p>
<p>Website-Spam: Er ist nicht ungefährlich, denn er enthält oft Links zu böswilligen „Angeboten“. Auch wirft er kein gutes Licht auf die eigene Website. Ja oft ist er sogar ein Merkmal ungepflegter oder verwaister Projekte. Schön anzusehen ist er auch nicht. Leider kann man ihn nicht einfach irgendwo abstellen: Er muss bekämpft werden. Da man als gewöhnlicher Web-Entwickler weder Zeit noch Lust hat den Ursprung dieses Übels zu bekämpfen, muss man notgedrungen Spam-Schutzmechanismen implementieren um diesem Problem habhaft zu werden.<br />
Machen wir uns nichts vor: Wir können der Spam-Flut weder entkommen noch eine Sandburg bauen die stark genug wäre ihr für immer stand zu halten. Jedoch gibt es Mittel und Wege Spam zu „behindern“.<br />
Da die wenigsten diese eigentlich stupide Aufgabe einem Menschen auftragen würden (welcher zudem unglücklicherweise auf Bezahlung besteht), muss der pfiffige Web-Entwickler diesen Vorgang automatisieren. Folglich ist es ein Kampf der Maschinen untereinander: Ein Turing-Test<sup class='footnote'><a href='#fn-2288-1' id='fnref-2288-1'>1</a></sup>. Doch wie unterscheidet eine Maschine einen Menschen von einem Artgenossen?</p>
<p><strong>Allgemeine Vorgehensweise</strong></p>
<p>Im Folgenden werden einige simple Methoden beschrieben, mittels PHP zu bestimmen, ob es sich bei einer Nachricht (z.B. in einem Gästebuch) um Spam handelt oder nicht. Normalerweise sollten mehrere dieser Methoden nebeneinander eingesetzt werden. Idealerweise baut man diese Mechanismen so, dass für einen Aspekt, der auf Spam hindeutet ein oder ggf. auch mehrere Punkte vergeben werden. Nachdem alle Funktionen die Nachricht analysiert haben, wird diese je nach Punktzahl entweder als Spam eingeordnet oder nicht. Das hat den Vorteil, dass man die „Strenge“, nach der Spam identifiziert wird leicht justieren kann. Um ganz sicher zu gehen, dass man niemanden zu unrecht als Spam abtut, kann man vermeintliche Spam-Nachrichten auch in der Datenbank belassen und nur vorerst sperren. Später geht man diese Nachrichten dann von Hand durch und gibt diese ggf. frei (siehe Abb. 2).  </p>
<p><a href="http://www.compufreak.info/wp-content/uploads/2011/09/ablauf.png"><img src="http://www.compufreak.info/wp-content/uploads/2011/09/ablauf-279x300.png" alt="" title="ablauf" width="279" height="300" class="aligncenter size-medium wp-image-2291" /></a></p>
<p><strong>1. Schutz durch eine Blacklist</strong></p>
<p>Eine naheliegende Lösung ist die sog. Blacklist, also die „schwarze Liste“. Auf ihr werden Schimpfwörter oder gar ganze Website-Adressen gepflegt. Enthält ein Eintrag (zum Beispiel in ein Gästebuch) eines oder mehrere dieser Wörter, kann davon ausgegangen werden, dass es sich dabei um Spam handelt. Oftmals wird von einer Blacklist mit der Begründung sie sei zu aufwändig und nicht ausreichend abgesehen. Dabei kann man bereits mit einer Handvoll Begriffen gut 60% allen Spams aussortieren. Man braucht sich dazu lediglich ein paar Spam-Einträge anzusehen. In den meisten Fällen geht es um Viagra oder andere medizinische Produkte. An zweiter Stelle folgen dann häufig „Werbe-Anzeigen“ für Websites mit pornographischem Inhalt. Bringt man nun nur ein paar gängige Begriffe aus diesen Bereichen der Blacklist bei, schiebt man damit einem Großteil des Spams einen Riegel vor. Ebenfalls nützlich sind Begriffe wie „kaufen“, „günstig“ oder „free“. Lediglich eine Sache sollte man dann noch beachten: Spam ist in den meisten Fällen  englisch. Eine mehrsprachige Blacklist ist also ratsam.</p>
<p>Glücklicherweise ist die Umsetzung einer solchen Blacklist mittels PHP nicht sonderlich schwer:<br />
Als erstes muss man natürlich ein Formular in HTML erstellt haben. Die Daten daraus müssen von einem entsprechenden PHP-Script abgefangen werden. Dann werden die einzelnen Begriffe der Blacklist zur einfacheren Handhabung in einen Array abgespeichert. Dazu gibt es zwei Möglichkeiten: Entweder werden die Begriffe und der Array direkt im Quellcode abgelegt, das kann allerdings bei einer langen Blacklist umständlich werden. Oder die Begriffe werden in einer anderen Datei (zum Beispiel einer TXT-Datei) abgelegt. Wobei die Begriffe jeweils durch einen Zeilenumbruch getrennt sein müssten. Handlicher ist letztere Methode. Ein Beispiel für eine sehr kurze Blacklist:</p>
<p>günstig<br />
cheap<br />
free<br />
viagra</p>
<p>Durch folgenden Befehl wird die Datei (in diesem Fall „blacklist.txt“) aufgerufen und der Inhalt in einen Array ($blacklist_array) gespeichert:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$blacklist_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'blacklist.txt'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Um herauszufinden, wie oft eine Zeichenkette in einer anderen Zeichenkette vorkommt, benötigt man den Befehl substr_count(). Dieser wird für jedes Element des Arrays, sprich für jedes „verbannte“ Wort neu ausgeführt. Jedes Vorkommen eines solchen Wortes wird ein Zähler um eins erhöht.</p>
<p>Sind diese beiden Grundlagen bekannt, wird der Rest nicht schwer:</p>
<p><em>Listing 1.1. Simple Blacklist-Funktion</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
<span style="color: #666666; font-style: italic;">// Inhalt der Nachricht abrufen </span><br />
<span style="color: #000088;">$nachricht</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nachricht'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
<span style="color: #666666; font-style: italic;">// blacklist.txt öffnen und in Array $blacklist_array speichern (Eine Zeile = Ein</span><br />
<span style="color: #666666; font-style: italic;">// Element) </span><br />
<span style="color: #000088;">$blacklist_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'blacklist.txt'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
<span style="color: #666666; font-style: italic;">// Zähler für die gefundenen Wörter aus der Blacklist </span><br />
<span style="color: #000088;">$anzahl</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <br />
<br />
<span style="color: #666666; font-style: italic;">// Jeweils ein Wort der Blacklist nehmen, in $blackword speichern und mitzählen, </span><br />
<span style="color: #666666; font-style: italic;">// wie oft das Wort in der Nachricht auftaucht </span><br />
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$blacklist_array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$blackword</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$anzahl</span> <span style="color: #339933;">+=</span> <span style="color: #990000;">substr_count</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$nachricht</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$blackword</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span> <br />
<br />
<span style="color: #666666; font-style: italic;">// Bestimmen, ob die Anzahl der &quot;Spam-Wörter&quot; niedrig genug ist </span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$anzahl</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde nicht als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p>Natürlich lässt sich dieses Script noch verbessern. So ist es momentan noch machtlos gegen Dinge wie „Leet-Speak<sup class='footnote'><a href='#fn-2288-2' id='fnref-2288-2'>2</a></sup>“ (Buchstaben durch ähnlich aussehende Zahlen ersetzen) oder sonstige Abstraktionen.</p>
<p><strong>2. Schnell-Tippen: Zeit ist Geld?</strong></p>
<p>Eine andere Möglichkeit Spam zu erkennen besteht darin die Schreibgeschwindigkeit zu ermitteln. Denn welcher Spam-Bot nutzt denn nicht „Copy-&#038;-Paste“? Ein Spam-Eintrag benötigt meist nur sehr kurze Zeit. Misst man nun die Zeit seit dem Laden der Formular-Seite bis zum Empfang der Formular-Daten, kann man daraus und aus der Anzahl aller Zeichen im Formular die Tastenanschläge errechnen. Das Ergebnis ist zwar leicht verfälscht, wenn ein echter Benutzer die Seite besucht, da dieser nicht sofort anfängt zu tippen, doch das setzt seine errechneten Tastaturanschläge ja nur herunter.</p>
<p>Die Zeit berechnen wir mit einem Timestamp (also sekundengenau). Es liegt zwar nahe, diesen Timestamp zusammen mit den anderen Formular-Daten in einem versteckten Feld zu verschicken, dies ist aber zu unsicher, da der Spam-Bot diese Werte manipulieren kann. Aus diesem Grund hinterlegen wir den Timestamp in einer Session. Bei der Auswertung rufen wir ihn dann wieder ab, errechnen die Differenz, ermitteln die Anzahl aller Zeichen im Formular und errechnen daraus die Tastenanschläge. Ein verdächtiger Wert liegt bei ungefähr 8 Anschläge pro Sekunde aufwärts.</p>
<p>Auf der Seite des Formulars:</p>
<p><em>Listing 2.1. Speichern des Timestamps in die Session-Variable</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Session-Start </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Speichern des Timestamps in die Session-Variable </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p>Bei der Auswertung:</p>
<p><em>Listing 2.2. Auswertung der Daten und Errechnen des Tastenanschlags</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Session-Start </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span> <br />
&lt;em&gt;[… HTML-Grundgerüst, etc. ...]&lt;/em&gt;<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Name abrufen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Inhalt der Nachricht abrufen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$nachricht</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nachricht'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Timestamp abrufen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$spam_check_start</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_start'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Aktuellen Timestamp ermitteln </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$spam_check_ende</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Differenz ermitteln </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$spam_check_dauer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$spam_check_ende</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$spam_check_start</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Anzahl aller Buchstaben errrechnen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$anzahl_aller_buchstaben</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$name</span><span style="color: #339933;">.</span><span style="color: #000088;">$nachricht</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Anschlage pro Sekunde errrechnen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$anschlaege_pro_sekunde</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$anzahl_aller_buchstaben</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$spam_check_dauer</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$anschlaege_pro_sekunde</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">9</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// ggf. Meldung ausgeben </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde nicht als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Fehlermeldung ausgeben, ggf. Punkt-Zähler entsprechend verändern </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p><strong>3. Leere Eingabe-Felder</strong></p>
<p>Da Spam-Bots oft die Angewohnheit haben alle Felder auszufüllen, kann es schnell passieren, dass auch unsichtbare Formular-Elemente mit Inhalten gefüllt werden. Dies tun normale Besucher nicht: Ein weiteres Unterscheidungsmerkmal.<br />
Dazu muss im Formular lediglich ein unsichtbares, leeres Element hinzugefügt werden. Inzwischen haben Spam-Bots meistens schon gelernt, dass „versteckte Eingabefelder“ (&lt;input type=“hidden“ /&gt;) besser ignoriert werden sollten. Deshalb ist es ratsamer ein ganz normales Eingabefeld (&lt;input type=“text“ /&gt;) anzulegen, welches auch keinen auffälligen Namen trägt. Dieses wird dann einfach mit der CSS-Eigenschaft display unsichtbar gemacht (&lt;input type=“text“ style=“display:none;“ /&gt;). Ist das Feld bei der Auswertung mit Inhalt gefüllt, steigt erneut die Spam-Wahrscheinlichkeit.</p>
<p><strong>4. Kannst du rechnen?</strong></p>
<p>Eine weitere beliebte Möglichkeit Spam abzufangen besteht darin, dem Besucher eine einfache Rechenaufgabe zu stellen. Das Ergebnis muss (korrekt) in ein Formularfeld eingetragen werden. Es wird bei der Auswertung überprüft. Da viele Spam-Bots immer noch nicht „rechnen“ können, ist es ein geeignetes Kriterium. Leider ist es jedoch für den Besucher mit Mehraufwand verbunden. Die Entscheidung, ob dies zumutbar ist, liegt beim Entwickler.</p>
<p>Auf der Formular-Seite müssen zuerst die beiden Zufalls-Zahlen und die Rechenart (Addition oder Subtraktion) ermittelt werden. Das Ergebnis wird in die Session-Variable gespeichert, die Rechnung im Formular ausgegeben.</p>
<p><em>Listing 4.1. Vorbereiten einer Rechenaufgabe</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Session-Start </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Ermitteln der ersten Zufallszahl </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$zahl1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span> <span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Ermitteln der zweiten Zufallszahl </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$zahl2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Bestimmen einer Rechenart (+ o. -) </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// und dem entsprechenden Ergebnis </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$zahl1</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$zahl2</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$rechenart</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">' + '</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$ergebnis</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$zahl1</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$zahl2</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$rechenart</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">' - '</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$ergebnis</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$zahl1</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$zahl2</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Speichern des Timestamps in die Session-Variable </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_rechnung'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ergebnis</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p><em>Listing 4.2. Ausgeben der Rechenaufgabe im Formular</em></p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span>&gt;</span>Bitte ausrechnen: <span style="color: #009900;">&lt;?php echo $zahl1.$rechenart.$zahl2; ?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span> <br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;spam_check_rechnung_besucher&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span></div></td></tr></tbody></table></div>
<p>Die Auswertung ist nun ziemlich simpel. Auch hier könnten Spam-Punkte vergeben werden:</p>
<p><em>Listing 4.3. Auswertung der Rechnung</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Session-Start </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span> <br />
&lt;em&gt;[... HTML-Grundgerüst, etc. ...]&lt;/em&gt;<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Korrektes Ergebnis abrufen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$spam_check_rechnung</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_rechnung'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Erhaltenes Ergebnis abrufen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$spam_check_rechnung_besucher</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_rechnung_besucher'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Auswertung </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$spam_check_rechnung</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$spam_check_rechnung_besucher</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// ggf. Meldung ausgeben </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde nicht als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Fehlermeldung ausgeben, ggf. Punkt-Zähler entsprechend verändern </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p>Diese Methode funktioniert leider nicht mehr bei alle Spam-Bots, dennoch ist sie häufig noch effektiv, denn die Schwierigkeit für die Maschine besteht dabei nicht darin die Rechnung zu lösen, sondern zu begreifen, dass sie eine Rechnung lösen muss. </p>
<p><strong>5. Wie heißt Max mit Vornamen?</strong></p>
<p>Ähnlich der Rechenmethode (s.o.) funktioniert auch folgende (verbesserte) Methode sehr gut: Erneut muss der Besucher die richtige Eingabe machen um sich als Nicht-Spammer zu identifizieren. Nur handelt es sich nicht um eine Rechenaufgabe, sondern um eine Frage. Die Fragen sollten folgende Kriterien erfüllen:</p>
<p>Sie sollten&#8230; </p>
<p>&#8230; zahlreich sein.<br />
&#8230; sich selbst beantworten.<br />
&#8230; in einem Wort beantwortet werden können.<br />
&#8230; nur eine mögliche Antwort zulassen.</p>
<p>Beispiele für solche Fragen:</p>
<ul>
<li>Wie heißt Max mit Vornamen?</li>
<li>Welche Farbe hat ein rotes Auto?</li>
<li>Der Erfinder des Zeppelin erfand den Z&#8230;?</li>
<li>Wie viele Seiten hat ein 200-seitiges Buch?</li>
<li>Eine CD ist rund. Was ist eine DVD?</li>
<li>Weihnachten kommt der W&#8230;?</li>
<li>etc.</li>
</ul>
<p>Die Schwierigkeit für die Maschine besteht hier darin, dass sie semantisch erfassen muss. Das heißt: Sie muss erst einmal die Frage verstehen. Das ist aber gar nicht so einfach.</p>
<p>Wie funktioniert dies nun im Detail?<br />
Zuerst brauchen wir eine Liste mit Fragen und Antworten. Dazu verwenden wir erneut einen Array. Die Daten werden diesmal nicht in eine TXT-Datei gelegt, sondern direkt in den Array. Diesen kann man ja bei Bedarf in eine andere PHP-Datei auslagern. Auf der Formular-Seite ermitteln wir dann per Zufall eine Frage und lassen sie ausgeben. Die Antwort speichern wir in die Session-Variable. Die Frage samt Eingabefeld wird im Formular ausgegeben:</p>
<p><em>Listing 5.1. Generierung und Ausgabe einer Frage.</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Session-Start </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Erstellen des Arrays (&lt;Nummer der Frage&gt; =&gt; &lt;Frage&gt;, &lt;Antwort&gt;) </span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$fragen_array</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Wie hei&amp;szlig;t Max mit Vornamen?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Max'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Welche Farbe hat ein rotes Auto?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'rot'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Wieviele Ecken hat ein Dreieck?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'drei'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">3</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Wie viele Seiten hat ein 200-seitiges Buch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'200'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">4</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Fridas Mofa ist gelb. Welche Farbe hat es?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'gelb'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Ermitteln der Frage </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$frage_nummer</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$fragen_array</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Speichern des Timestamps in die Session-Variable </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_frage'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$fragen_array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$frage_nummer</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p><em>[... HTML-Grundgerüst, etc. ...]</em></p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span>&gt;</span>Beantworte: <span style="color: #009900;">&lt;?php echo $fragen_array<span style="color: #66cc66;">&#91;</span>$frage_nummer<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>; ?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span> <br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;spam_check_frage_besucher&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span></div></td></tr></tbody></table></div>
<p>Bei der Auswertung des Formulars wird es auf Spam überprüft, indem einfach die Antwort des Besuchers mit der richtigen Antwort aus der Session-Variable verglichen wird. Vor dem Vergleich jedoch werden beide Antworten mit der Funktion strtolower() in Kleinbuchstaben umgewandelt, damit Abweichungen in Groß- und Kleinschreibung irrelevant werden:</p>
<p><em>Listing 5.2. Auswertung der Antwort des Besuchers.</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Session-Start </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span> <br />
&lt;em&gt;[... HTML-Grundgerüst, etc. ...]&lt;/em&gt;<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Korrektes Ergebnis abrufen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$spam_check_frage</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_frage'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Erhaltenes Ergebnis abrufen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$spam_check_frage_besucher</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_frage_besucher'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Auswertung </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$spam_check_frage</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$spam_check_frage_besucher</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// ggf. Meldung ausgeben </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde nicht als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Fehlermeldung ausgeben, ggf. Punkt-Zähler entsprechend verändern </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nachricht wurde als Spam eingestuft!'</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p>Natürlich lässt sich auch dieses Beispiel noch stark ausbauen. So ist ein größerer Fragen-Katalog ebenso von Vorteil, wie mehrere Antwortmöglichkeiten (um verschiedenen Schreibweisen, etc. vorzubeugen). </p>
<p><strong>6. Wo hast du eigentlich deine Augen?</strong></p>
<p>Eine Abwandlung der semantischen Frage (s.o.) ist sogar noch effektiver und sicherer als selbige: Anstatt eine Frage zu stellen, muss der Inhalt eines Bilds mit nur einem Wort beschrieben werden. Auf dem Bild sollten einfache Dinge mit kurzen Bezeichnungen abgebildet sein. Außerdem sollte nur genau ein Gegenstand zu sehen sein, damit keine Verwirrung aufkommt. So könnte der Besucher zum Beispiel gebeten werden eine Birne, einen Apfel, einen Hund, ein Haus oder Millionen andere Dinge zu identifizieren.<br />
Die technische Umsetzung funktioniert vom Prinzip her genauso, wie die der semantischen Frage (s.o.). Nur wird hier keine Frage ausgegeben, sondern ein kleiner HTML-Code um das entsprechende Bild einzubinden.</p>
<p><strong>7. Doppelt hält besser?</strong></p>
<p>Da Spam-Bots oft die Angewohnheit haben Felder, von denen sie nicht wissen, was das Script an Inhalten erwartet, einfach mit irgendwelchen Links zu füllen, kommt es auch oft vor, dass solche Felder mit den gleichen Inhalten gefüllt werden. Es lohnt sich also, alle Eingabefelder auf doppelten Inhalt zu prüfen. Wurden mehrere Eingabefelder identisch ausgefüllt, handelt es sich wohl um einen Spam-Bot. Auch hierfür könnten bei Bedarf wieder Spam-Punkte vergeben werden.</p>
<p><strong>8. Captcha im Eigenbau</strong></p>
<p>Leider werden die Spam-Bots immer besser. Um dieser Entwicklung entgegen zu treten, muss man sich schon tolle Dinge einfallen lassen. Die oben beschriebenen Methoden sollten in Kombination in den meisten Fällen hinreichend sein. Um die Sicherheit noch weiter zu steigern, bieten sich sog. Captchas<sup class='footnote'><a href='#fn-2288-3' id='fnref-2288-3'>3</a></sup> an. Das sind kleine Grafiken, welche eine Zeichenkombination abbilden, welche der Besucher abtippen muss. Das ist im Prinzip auch eine gute Idee. Leider hat sie bei den meisten Umsetzungen einige Nachteile:</p>
<p>Da Spam-Bots die Fähigkeit entwickeln die Codes solcher Grafiken auszulesen, werden dies immer abstrakter und unlesbarer.<br />
Damit der Code nicht mit einem Wörterbuch abgeglichen werden kann, werden nur noch zufällig generierte Buchstaben- und Zahlenkombinationen verwendet.<br />
Daher empfinden die Besucher empfinden sie schnell als lästig.</p>
<p>Diese Nachteile kann man aber auch recht einfach beseitigen oder zumindest abschwächen: </p>
<p>So sollte ein Bild nicht verunstaltet werden, nur damit man die Schrift nicht mehr lesen kann. Dann sollte man lieber eine ausgefallenere Schriftart nehmen. Bunte Sterne, Hintergründe und Linien sind ebenfalls hinderlich. Sie erhöhen zwar die Sicherheit, schrecken dafür aber Besucher ab, wenn sie nicht zum Design passen oder zu viel Zeit beanspruchen.<br />
Zufällig generierte Codes müssen nicht wie Kauderwelsch klingen: Zahlen kann man eigentlich weglassen, denn ob 26 oder 36 Zeichen zur Auswahl stehen macht auch keinen besonders großen Unterschied mehr. Werden nur Buchstaben verwendet, kann man schön-klingende Phantasie-Wörter generieren indem man Konsonanten und Vokale abwechselt. Das vermindert die Sicherheit zwar ein wenig, aber auch das nur unter der Voraussetzung, dass der Spam-Bot auf so etwas programmiert wurde.<br />
Wie oben bereits angesprochen können auch Bilder von Gegenständen, die es zu benennen gilt, als Captchas verwendet werden, denn solch eine Aufgabe setzt eine hohe Rechenleistung des Spam-Bots voraus. Vergessen wir nicht, dass das menschliche Gehirn ein Meister das abstrakten Denkens ist.<br />
Auch könnte man die langweiligen Codes durch die oben beschriebenen Fragen ersetzen. Dann steht der Spam-Bot nämlich nicht nur vor dem Problem die Frage „Wie heißt Max mit Vornamen?“ zu beantworten, sondern diese auch erst mal zu lesen.</p>
<p>Nun wollen wir ein ganz simples Captcha basteln und es mit unseren Fragen (s.o.) kombinieren. Dazu verwenden wir die Bordmittel PHPs und ein angepasstes Formular. Die Grafiken werden „on-the-fly<sup class='footnote'><a href='#fn-2288-4' id='fnref-2288-4'>4</a></sup>“ generiert. Dazu benötigen wir ein zusätzliches PHP-Script, welches als Grafik (mit Image-Tag) in das HTML-Formular eingebunden wird und die richtige Lösung in die Session-Variable schreibt:</p>
<p><em>Listing 8.1. Generierung eines Captchas</em></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Session-Start </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Senden des Headers </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Content-type: image/png&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Erstellen des Arrays (&lt;Nummer der Frage&gt; =&gt; &lt;Frage&gt;, &lt;Antwort&gt;) </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$fragen_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Wie heißt Max mit Vornamen?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Max'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Welche Farbe hat ein rotes Auto?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'rot'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Wieviele Ecken hat ein Dreieck?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'drei'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">3</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Wie viele Seiten hat ein 200-seitiges Buch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'200'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">4</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Fridas Mofa ist gelb. Welche Farbe hat es?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'gelb'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Ermitteln der Frage </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$frage_nummer</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$fragen_array</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Abspeichern der Frage </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$frage</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$fragen_array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$frage_nummer</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Speichern der Antwort in die Session-Variable </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'spam_check_frage'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$fragen_array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$frage_nummer</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Generieren der Grafik (400x30) </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$grafik</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreate</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">400</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">30</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Hintergrund der Grafik weiß machen </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">imagecolorallocate</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$grafik</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Text-Farbe generieren (Schwarz) </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000088;">$text_farbe</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecolorallocate</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$grafik</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Text ausgeben. Parameter: </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Variable der Grafik </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Schriftgröße </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Abstand zum linken Rand </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Abstand zum oberen Rand (Ausrichtung wird so berechnet, dass die Schrift </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// mittig steht) </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Text </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Farbe des Schriftzugs </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">ImageString</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$grafik</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">,</span> <span style="color: #990000;">ceil</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">15</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">imagefontheight</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">4</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$frage</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$text_farbe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Grafik ausgeben (im PNG-Format) </span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #990000;">imagepng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$grafik</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p>Das Formular ist im Prinzip das gleiche wie in Listing 5.1. Nur wird die Frage nicht dort, sondern in der Datei captcha.png.php generiert. Diese wiederum wird eingebunden:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;captcha.png.php&quot;</span> </span><br />
<span style="color: #009900;"><span style="color: #000066;">alt</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Bitte aktivieren Sie die </span><br />
<span style="color: #009900;">Anzeige von Grafiken in Ihrem </span><br />
<span style="color: #009900;">Browser!&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span></div></td></tr></tbody></table></div>
<p>Die Auswertung bleibt unverändert (siehe Listing 4.2).</p>
<p>Mithilfe solcher Captchas ist man nun einen ganzen Schritt weiter. Natürlich lässt sich diese Methode aber noch stark ausbauen.</p>
<p><strong>Instant-Lösungen</strong></p>
<p>Im Bereich Spam-Abwehr gibt es viele Angebote. Besonders wenn es um Captchas geht. Die interessantesten Lösungen sind folgende:</p>
<p>1. Die wohl bekannteste Lösung lautet reCaptcha (Website: www.google.com/recaptcha). Es handelt sich dabei um ein System, welches von Google übernommen und fortgeführt wurde. Google scannt alte Bücher und Zeitschriften ein. Die einzelnen Wörter landen in einer riesigen Datenbank. Wird ein reCaptcha aufgerufen, bekommt der Besucher zwei Wörter zu sehen und muss sie abtippen. Das Besondere: Die Antworten werden gespeichert. Die einzelnen Wörter werden mehrmals von verschiedenen Besuchern abgetippt. Die Antwort, die am häufigsten gegeben wird, akzeptiert Google dann als „richtig“. Auf diese Weise werden wahnsinnig viele Captchas generiert und alte Zeitschriften digitalisiert. Diese Methode gilt als sehr effektiv und sicher. Allerdings ist die Integration in die eigene Website nicht unbedingt für „blutige Anfänger“ geeignet. Erfahrenere Programmierer sollten damit aber keine Probleme haben. Außerdem besitzt das reCaptcha ein recht auffälliges und platz-einnehmendes Aussehen. Das kann man zwar anpassen, aber das wiederum ist mit nicht wenig Arbeit verbunden. Alles in Allem eine der besseren Lösungen.<br />
2. Eine weitere sehr schöne Captcha-Lösung ist SecureImage von www.phpcaptcha.org. Die Grafiken sind simpler und die Integration in die eigene Website ein wenig einfacher als bei anderen „Instant“-Lösungen.<br />
3. Einen sehr interessanten Ausblick bietet www.animierte-captcha.de. Vor den Captchas „tanzen“ Symbole und Grafiken herum, sodass der Schriftzug nie vollständig zu sehen ist: Eine zusätzliche Herausforderung für einen Spam-Bot.</p>
<p>Diese „Instant“-Lösungen sind meistens schneller eingebaut als die eigenen Methoden. Außerdem sind sie in der Regeln doch deutlich sicherer und durchdachter. Dafür lassen sie sich nicht so leicht anpassen oder in das Design eingliedern. Auch handelt es sich (wie bei den Beispiele auch) fast immer um Captchas. Betrachtet man die oben beschriebenen Methoden, muss man sich allerdings fragen, ob man seine Besucher wirklich mit so etwas belästigen muss.</p>
<p><strong>Erweiterungen für Content-Management-Systeme</strong></p>
<p>Besonders komfortabel lebt man, wenn man ein CMS<sup class='footnote'><a href='#fn-2288-5' id='fnref-2288-5'>5</a></sup> für seine Website verwendet, denn für diese gibt es eigentlich immer Erweiterungen, Plugins oder Addons. Mit diesen lassen sich die Spammer schon deutlich einfacher ausschalten.</p>
<p>Eine kurze Übersicht hier:</p>
<p>WordPress: </p>
<ul>
<li>Akismet (Standard)</li>
<li>Block Spam By Math Reloaded (Schützt das Backend)</li>
<li>Peter&#8217;s Custom Anti-Spam (Sehr umfangreich)</li>
</ul>
<p>Joomla</p>
<ul>
<li>EasyCalcCheck PLUS</li>
<li>Core Design Captcha plugin</li>
<li>Akismet</li>
<li>XIJC</li>
</ul>
<p>Contao (ehemals TypoLight):</p>
<ul>
<li>honeypotForm (sehr schlicht)</li>
</ul>
<p>Typo3:</p>
<ul>
<li>TIMTAB Bad Behavior</li>
<li>SFP Anti SPAM</li>
<li>Simple Captcha</li>
</ul>
<p><strong>Schutz einer Email-Adresse vor Crawlern</strong></p>
<p>Da in dem Impressum jeder Website eine gültige Email-Adresse stehe muss, ist dies ein beliebter Angriffspunkt für Email-Crawler<sup class='footnote'><a href='#fn-2288-6' id='fnref-2288-6'>6</a></sup>. Diese lesen die Adresse aus und speichern sie in ihre Datenbank. Wie von Zauberhand landet dann Spam im Posteingang. Um dies zu verhindern gibt es wahnsinnig viele Methoden. Einige besser, andere schlechter:</p>
<p>Kodierung der einzelnen Zeichen: Jedes Zeichen wird in den entsprechenden HTML-Sonderzeichencode umgewandelt. Das ist die beliebteste Lösung. Leider auch die mit am wenigsten effektive, denn die Crawler sind schon lange in der Lage diesen Trick zu durchschauen.<br />
Einbinden als Grafik: Effektiver, jedoch leider auch nicht besonders ansehnlich und total „Copy-&#038;-Paste“-unfreundlich. Die Adresse wird als Grafik gespeichert und eingebunden. Nicht optimal.<br />
Maskieren der Adresse: Das @ wird durch Zeichenfolgen wie „ät“, „at“, „[at]“, etc. ersetzt. Doch auch das können die Crawler mittlerweile ganz gut durchschauen.<br />
Aus zwei mach&#8217; eins: Dabei handelt es sich um einen kleinen HTML-Trick. Es werden zwei Email-Adressen hintereinander gesetzt. Jede für sich ist nicht existent (bzw. totaler Quatsch). Streicht man jedoch den letzten Teil der ersten Adresse und den ersten Teil der letzten Adresse, entsteht aus dem Rest eine dritte: Die richtige. Alles was man tun muss, ist also mittels CSS die Teile dazwischen auszublenden. Beispiel:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>heinz <br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">small</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;display:none;&quot;</span>&gt;</span> <br />
@nichtvorhanden.de<span style="color: #ddbb00;">&amp;nbsp;</span>gibtesnicht <br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">small</span>&gt;</span>@mueller.info<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span></div></td></tr></tbody></table></div>
<p>In diesem Beispiel sind die Adressen heinz@nichtvorhanden.de und gibtesnicht@mueller.info falsch. Lediglich die Kombination von beiden ist richtig: heinz@mueller.info.</p>
<p><strong>Anregungen</strong></p>
<p>Der Kreativität sind fast keine Grenzen gesetzt, geht es um die Spam-Bekämpfung. Lediglich die technischen Mittel binden den Programmierer an einen Rahmen. Dennoch sind weder alle Möglichkeiten Mensch und Maschine zu unterscheiden hier erklärt worden, noch sind sie ausgeschöpft. Alle Mechanismen lassen sich verbessern. Alle sind absolut ungesichert gegen Attacken (XSS und Co.). Alle Methoden einzubauen ist momentan auch noch viel Arbeit. Eine Klasse dafür zu schreiben wäre also von Vorteil und würde auf längere Sicht viel Aufwand ersparen. Kurzum: Auf geht’s!</p>
<p><strong>Nachwort</strong></p>
<p>Den Spam werden wir wohl nie ganz besiegen, doch mit geschickten Überlegungen lässt sich viel erreichen. Ich hoffe, ich konnte mit diesem Artikel einen Einstieg in das Thema bieten und zum Weitermachen anregen. Denn ausgereift sind die Scripte noch lange nicht.</p>
<p><strong>Im Internet</strong><br />
<a href="http://www.google.com/recaptcha/" title="http://www.google.com/recaptcha/" target="_blank">http://www.google.com/recaptcha/</a> &#8211; reCaptcha-Website<br />
<a href="http://www.phpcaptcha.org/" title="http://www.phpcaptcha.org/" target="_blank">http://www.phpcaptcha.org/</a> &#8211; Website des SecureImage-Projekts<br />
<a href="http://www.animierte-captcha.de/" title="http://www.animierte-captcha.de/" target="_blank">http://www.animierte-captcha.de/</a> &#8211; Website der animierten Captchas<br />
http://www.drweb.de/magazin/sichere-formulare-teil-4-spam-bots-masregeln/ &#8211; Ein Artikel zum Thema vom Dr. Web-Magazin<br />
<a href="http://de.wikipedia.org/wiki/CAPTCHA" title="http://de.wikipedia.org/wiki/CAPTCHA" target="_blank">http://de.wikipedia.org/wiki/CAPTCHA</a> – Wikipedia-Artikel zum Thema Captcha<br />
<a href="http://www.bizeps.or.at/news.php?nr=8627" title="http://www.bizeps.or.at/news.php?nr=8627" target="_blank">http://www.bizeps.or.at/news.php?nr=8627</a> – Sehr unterhaltsamer Beitrag zum Thema Captcha und Benutzerfreundlichkeit von Peter Purgathofer</p>
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-2288-1'>Was ist eigentlich der Turing-Test?<br />
Der Turing-Test wurde 1950 von Alan Turing entwickelt, um festzustellen, ob eine Maschine ein Denkvermögen haben kann, dass dem des Menschen ähnelt. Oft wird dieser Begriff auch mit dem Stichwort „Künstliche Intelligenz“ in einem Atemzug genannt. <span class='footnotereverse'><a href='#fnref-2288-1'>&#8617;</a></span></li>
<li id='fn-2288-2'>Was ist Leet-Speak?<br />
Leet-Speak leitet sich ab von dem englischen Begriff „elite“ (Elite) und „speak“ (Sprache). Es bezeichnet das Ersetzen von Buchstaben durch ähnlich aussehende Zahlen oder auch Sonderzeichen. So wird auch oft nur von „1337“ gesprochen, was „leet“ in „Leet-Speak“ bedeutet. Die 1 steht dabei für das L, die 3 für das große E und die 7 für das T. Ursprünglich wurde diese Substitutions-„Chiffre“ verwendet um heikle Emails vor dem automatisierten Abhören zu schützen. Heute findet es oft im Gamer-Bereich Anwendung.  <span class='footnotereverse'><a href='#fnref-2288-2'>&#8617;</a></span></li>
<li id='fn-2288-3'>Was sind eigentlich Captchas?<br />
Der Begriff „Captcha“ kommt aus dem Englischen und ist ein Akronym für „Completely Automated Public Turing test to tell Computers and Humans Apart“ („Vollautomatischer öffentlicher Turing-Test zur Unterscheidung von Computern und Menschen“). Ein Captcha ist meist eine Grafik, die ein verzerrtes Wort oder einen Code abbildet, der vom Besucher abgetippt werden muss, um zu beweisen, dass er selbst kein Spam-Bot ist. <span class='footnotereverse'><a href='#fnref-2288-3'>&#8617;</a></span></li>
<li id='fn-2288-4'>Was bedeutet noch gleich „on-the-fly“?<br />
Der Begriff „on-the-fly“ heißt im Bezug auf durch PHP generierte Grafiken, dass diese bei einem Aufruf durch einen Benutzer jedes mal neu erstellt werden müssen. Das heißt, sie können immer wieder anders aussehen. „On-the-fly“ bezeichnet also sozusagen den Moment zwischen Verlassen des Servers und der Ankunft beim Browser (auch wenn dies nicht ganz richtig ist). <span class='footnotereverse'><a href='#fnref-2288-4'>&#8617;</a></span></li>
<li id='fn-2288-5'>Wofür steht nochmal „CMS“?<br />
Ein CMS ist ein Content-Management-System (Inhalt-Verwaltungs-System). Es wird auf dem Webserver installiert und verwaltet Inhalte, Design und Struktur der Website sehr komfortabel. Die großen verfügen über eine Benutzerverwaltung, hunderte Erweiterungen und viele zusätzliche Funktionen. Große Websites kommen um ein CMS kaum noch herum. <span class='footnotereverse'><a href='#fnref-2288-5'>&#8617;</a></span></li>
<li id='fn-2288-6'>Worin besteht eigentlich der Unterschied zwischen Spam-Bot und Email-Crawler?<br />
Ein Spam-Bot durchsucht Websites nach Formularen, füllt sie aus und versucht so Backlinks für eine Website zu generieren oder Schadsoftware zu verteilen. Ein Email-Crawler such im Internet nach Email-Adressen und sammelt sie um später Spam zu verschicken. <span class='footnotereverse'><a href='#fnref-2288-6'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2011/09/06/spamschutzmechanismen-fur-die-eigene-homepage/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tab-Menü und ein paar wirklich knifflige Fragen</title>
		<link>http://www.compufreak.info/2011/01/19/tab-menu-und-ein-paar-wirklich-knifflige-fragen/</link>
		<comments>http://www.compufreak.info/2011/01/19/tab-menu-und-ein-paar-wirklich-knifflige-fragen/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 20:55:43 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Wissen]]></category>
		<category><![CDATA[freak]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=2181</guid>
		<description><![CDATA[Vielleicht kennt das der Eine oder Andere? Wenn man sich gut mit etwas auskennt, fangen die Leute irgendwann an, Fragen zu stellen. Diese Fragen sind manchmal dumm und irgendwann fangen sie an, zu nerven. An dieser Stelle scheiden sich die Geister. Einige werden sowas antworten wie: "Read the fucking Manual!" oder "http://www.googleisyourfriend.com/" oder weitere unschöne, unfreundliche und doofe Bemerkungen. Damit haben sie manchmal auch echt recht, aber die Anfänger haben es schließlich auch nicht immer leicht. Wenn man keine Ahnung hat. Wo soll man denn dann anfangen? Die ersten Fragen sind halt dumm. Das ist so.
Die netten Leute ( so wie ich ;) ) antworten dennoch freundlich und sind hilfsbereit, auch, wenn die Leute es einfach nicht checken.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.compufreak.info/wp-content/uploads/2011/01/Bildschirmfoto-101.png"><img src="http://www.compufreak.info/wp-content/uploads/2011/01/Bildschirmfoto-101-300x35.png" alt="" title="Tab-Menü" width="300" height="35" class="alignright size-medium wp-image-2184 white-border" /></a>Vielleicht kennt das der Eine oder Andere? Wenn man sich gut mit etwas auskennt, fangen die Leute irgendwann an, Fragen zu stellen. Diese Fragen sind manchmal dumm und irgendwann fangen sie an, zu nerven. An dieser Stelle scheiden sich die Geister. Einige werden sowas antworten wie:</p>
<p>&#8220;Read the fucking Manual!&#8221;</p>
<p>oder </p>
<p>&#8220;http://www.googleisyourfriend.com/&#8221;</p>
<p>oder weitere unschöne, unfreundliche und doofe Bemerkungen. Damit haben sie manchmal auch echt recht, aber die Anfänger haben es schließlich auch nicht immer leicht. Wenn man keine Ahnung hat. Wo soll man denn dann anfangen? Die ersten Fragen sind halt dumm. Das ist so.<br />
Die netten Leute ( so wie ich <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) antworten dennoch freundlich und sind hilfsbereit, auch, wenn die Leute es einfach nicht checken. Deshalb sind sie die Anfänger und ich der Erfahrenere. Ich stelle ja selbst dumme Fragen. Jeden Tag! Und so, wie vermutlich Jeder dieses Problem kennt, kennen bestimmt auch viele die andere Seite:<br />
Was, wenn mal jemand eine gute Frage stellt? Eine Frage, die in der Tat so gut ist, dass man sie selbst nicht beantworten kann! Was zum Beispiel, wenn jemand nach dem Sinn des Lebens fragt? Was dann? Die Antwort ist so simpel wie genial: Nachforschen! Auch wenn es 7 1/2 Millionen Jahre dauert <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Ein Kerl aus irgendeinem nicht ganz so tollen Forum hat irgendwann mal auf die Frage &#8220;Woher weißt du das eigentlich alles?&#8221; geantwortet: &#8220;Die meiste Zeit löse ich die Probleme anderer Leute. Daran lernt man besonders gut!&#8221;. Er hatte recht. Er hatte absolut recht. Ich lerne etwas viel gründlicher und viel effektiver, wenn ich vorher absolut keine Ahnung habe, was ich da eigentlich tue!<br />
Die beste Methode, etwas zu lernen, ist sich in diesem Bereich ein Ziel zu setzen, von dem Andere behaupten, dass man es sowieso nicht erreichen wird. Dann verdammt nochmal lernt man eine ganze Menge.<br />
In diesem speziellen Fall hat Dominik mir eine sehr knifflige Frage gestellt. Er wollte für seine Seite eine Art Tab-Menü erstellen. Drop-Down-Menüs kennt sicher Jeder, aber Tab-Menüs waren eine Herausforderung für mich. Bis vor wenigen Tagen hätte ich nicht gedacht, dass so etwas technisch ohne absolute Positionierung oder JavaScript überhaupt möglich ist. Nun habe ich es realisiert und meine Ergebnisse anschaulich in einem Tutorial zusammengefasst.</p>
<p>Ihr findet es hier: <a href="http://www.compufreak.info/tutorials/tab-menu-ohne-javascript/">http://www.compufreak.info/tutorials/tab-menu-ohne-javascript/</a></p>
<p>Also: Lasst mich Eure Meinung zum Tutorial und Erfahrungen bezüglich dummen oder kniffligen Fragen wissen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2011/01/19/tab-menu-und-ein-paar-wirklich-knifflige-fragen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Echt Webdesignen: Teil 56 &#8211; 62</title>
		<link>http://www.compufreak.info/2010/12/29/echt-webdesignen-teil-56-62/</link>
		<comments>http://www.compufreak.info/2010/12/29/echt-webdesignen-teil-56-62/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 14:24:58 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Specials]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[special]]></category>
		<category><![CDATA[vodcast]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1508</guid>
		<description><![CDATA[So, da bin ich mal wieder.
Ich weiß, es sieht so aus, als würde ich in den Ferien auf der Faulen Haut liegen, aber das stimmt nicht!
Ich habe viel zu tun. Schließlich möchte ich das Echt-Webdesignen-Projekt Januar nächsten Jahres abschließen. Allerdings fehlen noch ca. 2-3 Stunden Video, ca. 80-100 Seiten eBook, sämtliche Übungsaufgaben samt Lösungen und das Poster mit allen HTML5-Elementen ist grad' mal zur Hälfte fertig. Ich arbeite also auf Hochtouren und muss nebenbei noch für Schule und Theater lernen. Wie auch immer.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.compufreak.info/wp-content/uploads/2010/12/vod62_title-150x150.jpg" alt="" title="Echt Webdesignen #62" width="150" height="150" class="alignright size-thumbnail wp-image-1509 white-border" />So, da bin ich mal wieder.<br />
Ich weiß, es sieht so aus, als würde ich in den Ferien auf der Faulen Haut liegen, aber das stimmt nicht!<br />
Ich habe viel zu tun. Schließlich möchte ich das Echt-Webdesignen-Projekt Januar nächsten Jahres abschließen. Allerdings fehlen noch ca. 2-3 Stunden Video, ca. 80-100 Seiten eBook, sämtliche Übungsaufgaben samt Lösungen und das Poster mit allen HTML5-Elementen ist grad&#8217; mal zur Hälfte fertig. Ich arbeite also auf Hochtouren und muss nebenbei noch für Schule und Theater lernen. Wie auch immer.</p>
<p>Ich wünsche Euch viel Spaß mit den neuen Videos.<br />
Ihr findet sie wie immer im Vodcast-Bereich oder auf meinem YouTube-Kanal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/12/29/echt-webdesignen-teil-56-62/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Echt Webdesignen: Teil 48 &#8211; 55</title>
		<link>http://www.compufreak.info/2010/12/13/echt-webdesignen-teil-48-55/</link>
		<comments>http://www.compufreak.info/2010/12/13/echt-webdesignen-teil-48-55/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 15:32:14 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Specials]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[special]]></category>
		<category><![CDATA[vodcast]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1477</guid>
		<description><![CDATA[Ich habe endlich die 50 geknackt. Nun umfasst mein Kurs 'Echt Webdesignen' ganze 55 Videos mit insgesamt 8 Stunden und 33 Minuten Länge. Leider konnte ich die Videos mangels Zeit und Gesundheit nicht schon wie geplant gestern veröffentlichen sondern erst heute... naja. Passiert halt.
Auch habe ich heute nicht nur die 50-Video-Marke geknackt, sondern zusätzlich über 60 Abonnenten auf YouTube erreicht. Alles in Allem also ein recht sehr erfolgreicher Tag, oder?]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.compufreak.info/wp-content/uploads/2010/12/vod50_title-150x150.jpg" alt="" title="Echt Webdesignen #50" width="150" height="150" class="alignright size-thumbnail wp-image-1478 white-border" />Juhu,<br />
ich habe endlich die 50 geknackt. Nun umfasst mein Kurs &#8216;Echt Webdesignen&#8217; ganze 55 Videos mit insgesamt 8 Stunden und 33 Minuten Länge. Leider konnte ich die Videos mangels Zeit und Gesundheit nicht schon wie geplant gestern veröffentlichen sondern erst heute&#8230; naja. Passiert halt.<br />
Auch habe ich heute nicht nur die 50-Video-Marke geknackt, sondern zusätzlich über 60 Abonnenten auf YouTube erreicht. Das ermunterte mich dann auch, mal meinem <a href="http://www.youtube.com/user/compufreak29">Kanal</a> ein schöneres Antlitz zu verleihen. Sieht jetzt deutlich besser aus, oder?<br />
Alles in Allem also ein recht sehr erfolgreicher Tag, oder?</p>
<p>Interessant war auch, dass YouTube mich bei einem Video plötzlich darauf hinwies, dass ich nun auch Videos hochladen darf, die länger sind als 15 Minuten. Ein bisschen Googlen bestätigte meine Vermutung, dass ich nicht der Einzige war, der diese Nachricht erhielt. Es gehen sogar Gerüchte um, nach denen YouTube die Beschränkung der Länge ganz aufheben will. Das wiederum finde ich persönlich nicht so toll. Ich meine wo ist dann noch der Vorteil YouTube-Partner zu sein? Das nützlichste geht doch dadurch verloren!</p>
<p>Die neuen Videos findet ihr wie immer im Vodcast-Bereich oder auf YouTube!<br />
Abonniert mich und habt Spaß!</p>
<p>lg,<br />
compufreak</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/12/13/echt-webdesignen-teil-48-55/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Echt Webdesignen: Teil 42 &#8211; 47</title>
		<link>http://www.compufreak.info/2010/11/28/echt-webdesignen-teil-42-47/</link>
		<comments>http://www.compufreak.info/2010/11/28/echt-webdesignen-teil-42-47/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 18:50:21 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Specials]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[special]]></category>
		<category><![CDATA[vodcast]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1414</guid>
		<description><![CDATA[Ich war sehr fleißig heute und habe es geschafft gleich 6 neue Videos fertig zu machen.
Das ist auch nötig, denn ich würde das Echt-Webdesignen-Projekt eigentlich gerne zum 1. Januar abschließen und dann richtig die Werbetrommel rühren. Auf meinem Plan stehen aber noch weitere 30 Videos, ein großes Plakat, ein eBook und ein Übungsheft...]]></description>
			<content:encoded><![CDATA[<p>Ich war sehr fleißig heute und habe es geschafft gleich 6 neue Videos fertig zu machen.<br />
Das ist auch nötig, denn ich würde das Echt-Webdesignen-Projekt eigentlich gerne zum 1. Januar abschließen und dann richtig die Werbetrommel rühren. Auf meinem Plan stehen aber noch weitere 30 Videos, ein großes Plakat, ein eBook und ein Übungsheft&#8230;<br />
Nun sind dazwischen aber noch Ferien&#8230; wird schon werden, gell?</p>
<p>Die neuen Videos findet ihr in meiner Playlist auf YouTube oder natürlich im Vodcast-Bereich!</p>
<p>Der Artikel über die portablen Programme folgt hoffentlich morgen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/11/28/echt-webdesignen-teil-42-47/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Echt Webdesignen: Teil 39 &#8211; 41</title>
		<link>http://www.compufreak.info/2010/11/21/echt-webdesignen-teil-39-41/</link>
		<comments>http://www.compufreak.info/2010/11/21/echt-webdesignen-teil-39-41/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 13:42:23 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[compufreak.info]]></category>
		<category><![CDATA[Specials]]></category>
		<category><![CDATA[compufreak]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[special]]></category>
		<category><![CDATA[vodcast]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1379</guid>
		<description><![CDATA[Wie Einige bereits bemerkt haben könnten, habe ich meinen Vodcast-Bereich (erreichbar unter 'Vodcast' (oh Wunder!)) ein wenig ganz doll aufpoliert. Vorher war dort eine Liste mit allen Folgen vorhanden. Diese Liste war blöd. Nun befindet sich da eine Liste mit allen Vodcast-Reihen. Momentan ist da nur die 'Echt-Webdesignen'-Reihe aufgeführt, aber weitere Reihen sind in Planung. Die Liste ist grafisch schöner geworden. Es gibt nun zu jeder Reihe ein 'Cover' und eine kurze Beschreibung. Klickt man auf das Cover, gelangt man zur Folgen-Übersicht. Dort werden alle Folgen säuberlich, grafisch schön, übersichtlich und mit Cover angezeigt.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.compufreak.info/wp-content/uploads/2010/07/vod41_title-150x150.jpg" alt="" title="Echt Webdesignen #41" width="150" height="150" class="alignright size-thumbnail wp-image-1373 white-border" />Hallo,<br />
wie Einige bereits bemerkt haben könnten, habe ich meinen Vodcast-Bereich (erreichbar unter &#8216;Vodcast&#8217; (oh Wunder!)) ein wenig ganz doll aufpoliert. Vorher war dort eine Liste mit allen Folgen vorhanden. Diese Liste war blöd. Nun befindet sich da eine Liste mit allen Vodcast-Reihen. Momentan ist da nur die &#8216;Echt-Webdesignen&#8217;-Reihe aufgeführt, aber weitere Reihen sind in Planung. Die Liste ist grafisch schöner geworden. Es gibt nun zu jeder Reihe ein &#8216;Cover&#8217; und eine kurze Beschreibung. Klickt man auf das Cover, gelangt man zur Folgen-Übersicht. Dort werden alle Folgen säuberlich, grafisch schön, übersichtlich und mit Cover angezeigt. Klickt man dort auf ein Cover, kann man die Folge direkt auf meiner Website sehen. 720p sind bereits eingestellt. Damit für die Videos genügend Platz ist, habe ich das Menü aus den Vodcast-Seiten entfernt. Unter jedem Video befindet sich eine Beschreibung, jeweils ein Vor- und Zurück-Button und ein Download-Link.<br />
Ich hoffe, ich mache das Angebot auf meiner Seite damit noch schöner und einfacher als bisher. Schließlich müssen die Leute nun nicht mehr auf YouTube nach dem nächsten Video suchen. Was übrigens nicht heißt, dass ich nicht immer noch Abonnenten suche <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Neben den Änderungen an den Vodcast-Seiten habe ich es endlich geschafft eine Seite mit Links einzurichten. Dort befinden sich demnächst Banner meiner Partnerseiten, befreundeter Seiten und Links zu themen-relevanten Websites. Die Links werden mit der Zeit erweitert und umfangreicher gestaltet. Da sollte man von Zeit zu Zeit vielleicht mal vorbeischauen.</p>
<p>Nun gab es wegen diesen Änderungen die ganze vergangene Woche nichts neues. Dafür gibt es heute besagte Änderungen, die sich jeder mal ansehen sollte <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  und drei neue Videos.<br />
Diese sind natürlich im neu gestalteten Vodcast-Bereich zu finden.<br />
Viel Spaß dabei!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/11/21/echt-webdesignen-teil-39-41/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Echt Webdesignen: Teil 36 &#8211; 38</title>
		<link>http://www.compufreak.info/2010/11/07/echt-webdesignen-teil-36-38/</link>
		<comments>http://www.compufreak.info/2010/11/07/echt-webdesignen-teil-36-38/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 18:14:23 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Specials]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[special]]></category>
		<category><![CDATA[vodcast]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1122</guid>
		<description><![CDATA[Ich habe soeben Teil 36, 37 und 38 freigegeben. Teil 36 ist eine Fortsetzung von Teil 35. Teil 37 behandelt weitere div-Attribute und Teil 38 erklärt, wie man CSS-Dateien anwendet.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.compufreak.info/wp-content/uploads/2010/07/vod38_title-150x150.jpg" alt="" title="Echt-Webdesignen #39" width="150" height="150" class="alignright size-thumbnail wp-image-1119 white-border" /><br />
Hallo, zusammen,<br />
ich habe soeben Teil 36, 37 und 38 freigegeben.</p>
<p><a href="http://www.youtube.com/watch?v=nxEzAWcS190">Teil 36</a><br />
ist die Fortsetzung von Teil 35. Es geht also immer noch um die Vorführung einer kleinen 20-Minuten-Website mit div-Elementen.</p>
<p><a href="http://www.youtube.com/watch?v=FdyUI8E20M0">Teil 37</a><br />
zeigt noch ein paar weitere Div-Attribute. Damit habe ich immer noch nicht alle erklärt, die wichtigsten sollten aber dann bekannt sein <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://www.youtube.com/watch?v=I-E43Wbqk2g">Teil 38</a><br />
erklärt endlich die CSS-Dateien, wie man sie nutzt, warum sie so cool sind und wie man sie einbinden kann.</p>
<p>Bis nächste Woche,</p>
<p>compufreak</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/11/07/echt-webdesignen-teil-36-38/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Echt Webdesignen: Teil 34 + 35</title>
		<link>http://www.compufreak.info/2010/10/27/echt-webdesignen-teil-34-35/</link>
		<comments>http://www.compufreak.info/2010/10/27/echt-webdesignen-teil-34-35/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 20:15:54 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Specials]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[special]]></category>
		<category><![CDATA[vodcast]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1100</guid>
		<description><![CDATA[Neues aus meiner Video-Werkstatt:Teil 34 geht nochmal näher auf die beiden Attribute padding und margin ein. Dazu habe ich eine kleine Grafik gebastelt. Sie ist jetzt nicht sooo toll, aber sie erfüllt ihren Zweck. In Teil 35 erstelle ich ein simples 10-Minuten-Design mit static-positionierten div-Elementen, ein paar Überschriften und ein bisschen Text.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.compufreak.info/wp-content/uploads/2010/07/vod35_title-150x150.jpg" alt="" title="Echt Webdesignen #35" width="150" height="150" class="alignright size-thumbnail wp-image-1097 white-border" /><br />
<strong>Neues aus meiner Video-Werkstatt:</strong><br />Teil 34 geht nochmal näher auf die beiden Attribute padding und margin ein. Dazu habe ich eine kleine Grafik gebastelt. Sie ist jetzt nicht sooo toll, aber sie erfüllt ihren Zweck. In Teil 35 erstelle ich ein simples 10-Minuten-Design mit static-positionierten div-Elementen, ein paar Überschriften und ein bisschen Text. Der Inhalt und das Aussehen spielen keine Rolle. Es geht nur darum, zu zeigen, wie man jetzt mit den vorhandenen Techniken ein simples Design erstellen könnte.</p>
<p>Die beiden Videos gibt es wie immer in meiner Übersicht, meinem Channel oder über diese Links:<br />
<a href="http://www.youtube.com/watch?v=HMKH9fSgV_c">Teil 34</a><br />
<a href="http://www.youtube.com/watch?v=Zvwuu6rvSGk">Teil 35</a></p>
<p>Morgen gibt es hoffentlich einen schönen Beitrag in Text-Form.<br />
Bis dahin,<br />
compufreak</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/10/27/echt-webdesignen-teil-34-35/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warum ich JavaScript HASSE!</title>
		<link>http://www.compufreak.info/2010/10/23/warum-ich-javascript-hasse/</link>
		<comments>http://www.compufreak.info/2010/10/23/warum-ich-javascript-hasse/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 18:54:04 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Sonstiges]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1086</guid>
		<description><![CDATA[In einigen Videos oder Artikeln ist vielleicht schon aufgefallen, das ich JavaScript nicht so toll finde. Eigentlich kann ich es nicht leiden. Genau genommen halte ich es für eine der dümmsten Erfindungen der Menschheit. Gleich hinter der Erfindung des viereckigen Rades und Bluetooth. Mit dieser Meinung bin ich nicht der einzige. Ich finde JavaScript ist [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.compufreak.info/wp-content/uploads/2010/10/ich_hasse_js.png" alt="" title="Ich hasse JavaScript" width="150" height="150" class="alignright size-full wp-image-1088 white-border" />In einigen Videos oder Artikeln ist vielleicht schon aufgefallen, das ich JavaScript nicht so toll finde. Eigentlich kann ich es nicht leiden. Genau genommen halte ich es für eine der dümmsten Erfindungen der Menschheit. Gleich hinter der Erfindung des viereckigen Rades und Bluetooth. Mit dieser Meinung bin ich nicht der einzige. Ich finde JavaScript ist unter anderem deswegen verabscheuungswürdig, weil es ständig und am laufenden Band gegen seine eigene Prinzipien verstößt. Das Ziel, welches jeder Webdesigner verfolgt, wenn er JavaScript verwendet, besteht entweder darin, dass er seine Besucher ärgern will, oder darin, dass er seiner Website eine gewisse Eleganz verleihen will. Letzteres ist der wohl wichtigste Aspekt JavaScripts. Leider ist JavaScript selbst so unelegant wie Kuhfladen. Dieser Sprache mangelt es an allem, was ihr ein vernunftbegabter Programmierer hätte beibringen sollen.</p>
<p>Ich denke, man kann ohne Scheu sagen, dass ca. 90% aller JavaScript-Codes eine frappierenden Hang zur Selbstbefriedigung haben. Andauernd muss man Umwege gehen, weil es einfach &#8211; schlicht und ergreifend &#8211; keinen direkten, eleganten und schnellen Weg gibt.</p>
<p>Der Umgang mit Variablen in JavaScript ist seit Jahren verstümmelt, daran hat man sich zu gewöhnen. Auch fehlen JavaScript Möglichkeiten, für richtige Klassen, OOP und Vererbung.<br />
Auch wenn viele Leute das anders sehen, bleibe ich bei meiner Ansicht:<br />
<strong>JavaScript fehlt es einfach an Macht!</strong></p>
<p>Und als ob all das noch nicht genug wäre, gibt es noch nicht einmal eine anständige IDE für JavaScript. Debugger sind ebenso ein Fremdwort. Fehlersuche in JavaScript gleicht einer Nadel im Heuhaufen.<br />
JavaScript ist damit weder Entwickler-, noch Benutzerfreundlich. Beiden Gruppen bereitet es viel Ärger.</p>
<p>Ein weiterer Punkt sind diese unsäglichen Frameworks. Diese gibt es wie Sand am Meer. Leider lassen sie sich dank mangelnder Einheit schlecht kombinieren oder überhaupt anwenden. Leider bin ich außerdem oft gezwungen sie dennoch zu kombinieren, weil es einfach keins gibt, was wirklich alles kann, was ich brauche.</p>
<p>JavaScript kann man gut mit einem Auto vergleichen. Ein Auto, an dem zwei Räder fehlen. Dummerweise sind dies immer genau die Räder, welche das Auto antreiben sollten. Fenster sind zwar vorhanden, lassen sich aber nicht öffnen. Nicht, weil es keine Kurbel dafür gäbe, sondern eher, weil sie zugeklebt wurden. Auch hat das Auto natürlich eine Windschutzscheibe. Diese besitzt es jedoch nicht, um die Insassen vor Wind zu schützen, sondern viel mehr, um sie mit ihrer innen angebrachten Tönung am hinausschauen zu hindern. Blinker sind natürlich eingebaut, jedoch funktionieren diese nur Sonntags, wenn das Auto sowieso nur in der Garage steht. Der Kofferraum des Autos ist immer genau so groß, dass das, was man nützliches hineinpacken will am Ende nicht passt und hinten übersteht. Da das Verkehrsamt einen so nicht fahren lassen möchte, muss es schließlich abgeschnitten werden. So hat man vielleicht mal nur einen halben Stuhl, wenn man zuhause ankommt.</p>
<p>Nun gibt es natürlich Leute, die so einen Artikel gar nicht gerne lesen. Ein Argument wäre zum Beispiel, dass eine Website wie YouTube ohne JavaScript gar nicht denkbar wäre. Natürlich wäre eine Website in dieser Form nicht denkbar. Aber in einer sehr Ähnlichen sehr wohl. Es gibt Mittel und Wege, komplett auf JavaScript zu verzichten. Sie sind vielleicht gelegentlich ein wenig umständlicher&#8230; dafür funktionieren sie bei mehr als 30% der Benutzer so, wie sie es sollten. (Als Beweis könnt ihr ja mal den Einbetten-Code eines YouTube-Videos durch einen Validator laufen lassen <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Ihr werdet ein kleines Wunder erleben&#8230;)</p>
<p>Ich denke, dass wir als Webdesigner es unseren Besuchern einfach schuldig sind, auf eine so unsichere, umständliche, unelegante und uncoole Sprache zu verzichten.</p>
<p>Nun bin ich aber mit meiner Meinung leider nicht allein auf der Welt. Was denkst du?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/10/23/warum-ich-javascript-hasse/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Echt Webdesignen: Teil 33</title>
		<link>http://www.compufreak.info/2010/10/21/echt-webdesignen-teil-33/</link>
		<comments>http://www.compufreak.info/2010/10/21/echt-webdesignen-teil-33/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 20:42:19 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[Specials]]></category>
		<category><![CDATA[Einstieg in den Umstieg auf HTML5]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[special]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1084</guid>
		<description><![CDATA[Gerade habe ich den 33. Teil meiner Reihe 'Echt Webdesignen' freigegeben. Außerdem habe ich die neue Einleitung eben dieser Reihe fertiggestellt. Nun kann man auf die drei Schaltflächen am Ende des Videos gelangen. ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.compufreak.info/wp-content/uploads/2010/07/vod33_title.jpg"><img src="http://www.compufreak.info/wp-content/uploads/2010/07/vod33_title-150x150.jpg" alt="" title="Echt Webdesignen #33" width="150" height="150" class="alignright size-thumbnail wp-image-1079 white-border" /></a>Gerade habe ich den 33. Teil meiner Reihe &#8216;Echt Webdesignen&#8217; freigegeben. Außerdem habe ich die neue Einleitung eben dieser Reihe fertiggestellt. Nun kann man auf die drei Schaltflächen am Ende des Videos gelangen. Sie führen zu einem ebenfalls neuen Video, welches meine Seite kurz vorstellt oder zu dem Video &#8216;<a href="http://www.youtube.com/watch?v=gM6QQ6bmS38">Einstieg in den Umstieg auf HTML5</a>&#8216; oder zum nächsten Teil des Tutorials.<br />
Alles in allem bin ich recht zufrieden mit mir. Alle meine Projekte bewegen sich fort. Nicht alle in derselben Geschwindigkeit. Das ist sogar gut, denn sonst wären sie ja alle langsam&#8230; aber wenigstens bei einigen gehts schneller voran. Sogar das XL-HTML5-CheatSheet entwickelt sich prächtig. Ich werde es noch vor Ende der Woche veröffentlichen können.</p>
<p>Morgen ein Artikel über meine Einstellung zu JavaScript.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/10/21/echt-webdesignen-teil-33/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

