<?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; PHP-Scripte</title>
	<atom:link href="http://www.compufreak.info/category/php-scripte/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>Timestamp-Datum-Konvertierer</title>
		<link>http://www.compufreak.info/2011/01/16/timestamp-datum-konvertierer/</link>
		<comments>http://www.compufreak.info/2011/01/16/timestamp-datum-konvertierer/#comments</comments>
		<pubDate>Sun, 16 Jan 2011 21:22:01 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[PHP-Scripte]]></category>
		<category><![CDATA[generieren]]></category>
		<category><![CDATA[konvertieren]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[timestamp]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=2116</guid>
		<description><![CDATA[Den Timestamp des eigenen Geburtsdatums berechnen? Im Prinzip nicht schwierig, aber wie ging das nochmal mit den Zeitzonen? 

Was ist ein Timestamp?

Der UNIX-Timestamp ist eine Möglichkeit Zeit in Form von Sekunden zu messen. Seit dem 1. Januar 1970 werden so die Sekunden gezählt. In jedem Computer. Diese Messmethode hat den unglaublichen Vorteil, dass sie aus nur einer Zahl besteht. Das macht es für den Computer und den Programmierer wesentlich einfach damit zu rechnen.]]></description>
			<content:encoded><![CDATA[<p>Den Timestamp des eigenen Geburtsdatums berechnen? Im Prinzip nicht schwierig, aber wie ging das nochmal mit den Zeitzonen? </p>
<p>Was ist ein Timestamp?</p>
<p>Der UNIX-Timestamp ist eine Möglichkeit Zeit in Form von Sekunden zu messen. Seit dem 1. Januar 1970 werden so die Sekunden gezählt. In jedem Computer. Diese Messmethode hat den unglaublichen Vorteil, dass sie aus nur einer Zahl besteht. Das macht es für den Computer und den Programmierer wesentlich einfach damit zu rechnen.<span id="more-2116"></span></p>
<p>Wie lange kann man so zählen?</p>
<p>Dummerweise gibt es bei dieser Zählmethode ein Problem: Sie ist nicht unendlich. Es steht nur ein Integer mit 32-Bit zur Verfügung. Für 86400 Sekunden pro Tag ist das ein bisschen wenig. Irgendwann wird in diesen 32 Bit nicht mehr genügend Speicherplatz frei sein. Durch das mathematische Prinzip dahinter wird die Zählung am 19 Januar 2038 um genau 03:14:07 (UTC) wieder auf Null zurück springen. Bis dahin müssen die Programmierer also auf 64-Bit “Zeitmessung” umgestiegen sein. Dieses Problem nennt man übrigens auch den UNIX Millenium Bug.</p>
<p>Was kann dieses Script?</p>
<p>Dieses Script kann Timestamps aus einem Datum erzeugen und umgekehrt aus einem Timestamp ein Datum berechnen. Dabei wird die Zeitzone berücksichtigt. Deutschland befindet sich in der Zeitzone GMT+1 bzw. UTC+1. Nur in der Sommerzeit gehören wir zur Zeitzone GMT+2 bzw. UTC+2. Mit Zeitzonen zu rechnen ist nicht besonders einfach. Das heißt… im Kopf ist das kein Problem. Auf dem Computer schon eher. Ich habe mir viel Mühe gegeben, dieses Script fehlerfrei zu programmieren, aber wie das so ist habe ich vielleicht doch irgendwo einen eingebaut? Schließlich kann ich nicht jede Möglichkeit ausprobieren.</p>
<p>Ich hoffe sehr, dass dieses Tool wirklich richtig arbeitet. Natürlich habe ich es getestet und nachgerechnet, aber Fehler schleichen sich halt ein. Vor Allem aber hoffe ich, dass wenn es richtig arbeitet, es auch jemandem nützt. Es gibt denke ich nicht so viele Timestamp-Konverter, die sowohl auf deutsch sind, als auch mit Zeitzonen klarkommen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2011/01/16/timestamp-datum-konvertierer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zeichen zählen trotz Umlaute</title>
		<link>http://www.compufreak.info/2010/11/10/zeichen-zahlen-trotz-umlaute/</link>
		<comments>http://www.compufreak.info/2010/11/10/zeichen-zahlen-trotz-umlaute/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 19:05:41 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[PHP-Scripte]]></category>
		<category><![CDATA[Sinnlos]]></category>
		<category><![CDATA[freak]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sinnlos]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=1135</guid>
		<description><![CDATA[Vor ein paar Tagen hatte ich folgendes Problem: Ich wollte die Länge eines Strings ermitteln. Also kurz nachgedacht und strlen() benutzt. Das schien auch erst zu funktionieren... nur Umlaute und Sonderzeichen waren so 'ne Sache. Wenn der String überprüft wird, wurden seine Sonderzeichen bereits mittels htmlentities() konvertiert. Das hat zur Folge, dass strlen() die einzelnen Buchstaben der HTML-Codes zählt. So besteht ein Ü zum Beispiel aus 6 Zeichen anstatt einem. Das verfälscht das Ergebnis leider... komplett. Also: was tun?]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen hatte ich folgendes Problem: Ich wollte die Länge eines Strings ermitteln. Also kurz nachgedacht und strlen() benutzt. Das schien auch erst zu funktionieren&#8230; nur Umlaute und Sonderzeichen waren so &#8216;ne Sache. Wenn der String überprüft wird, wurden seine Sonderzeichen bereits mittels htmlentities() konvertiert. Das hat zur Folge, dass strlen() die einzelnen Buchstaben der HTML-Codes zählt. So besteht ein Ü zum Beispiel aus 6 Zeichen anstatt einem. Das verfälscht das Ergebnis leider&#8230; komplett. Also: was tun? Natürlich habe ich ein bisschen gegooglet. Zuerst bin ich auf wenig sinnreiches gestoßen, doch dann fand ich eine Seite, auf der die Funktion <a href="http://php.net/manual/en/function.mb-strlen.php" target="_blank">mb_strlen()</a> erwähnt wurde. Diese Funktion sollte den gleichen Zweck wie strlen() erfüllen. Allerdings erwartet diese als zweiten Parameter den Zeichensatz. Das ermöglichte es mir theoretisch Strings mit Umlauten doch noch richtig zu handhaben.<br />
Nur leider&#8230; waren meine Sonderzeichen dadurch natürlich immer noch konvertiert. Damit kommt auch mb_string() nicht klar.<br />
Folglich habe ich weiter gesucht und wurde wieder erwarten sogar im PHP-Manual fündig. Tatsächlich gibt es zwei Funktionen, welche die genauen Gegenstücke zu htmlspecialchars() und htmlentities() sind. Nun kann ich also erst meine Sonderzeichen wieder zurück konvertieren, dann die Länge mit mb_string() ermitteln und die Zeichenkette anschließend wieder konvertieren.<br />
Diese Funktionen habe ich in einem Mini-Tutorial kurz erklärt. Und zwar genau <a href="http://www.compufreak.info/tutorials/html-codes-wieder-in-sonderzeichen-konvertieren/">hier</a>.<br />
Dummerweise bin ich so ein kleiner Perfektionist. Und diese Methode ist mir bei weitem nicht elegant genug. deshalb werde ich bestimmt mal versuchen eine eigene Funktion aufzustellen. Nicht unbedingt jetzt, aber irgendwann bestimmt <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Das alles brachte mich aber noch zu einer anderen Erkenntnis:</p>
<p>Umlaute sind sch****!</p>
<p>Es wär doch viel praktischer, wenn man sich für alles, was Computer angeht auf genau einen Zeichensatz einigen könnte. Wenn man mal überlegt, wieviel Zeit, Nerven, Geld und Energie das sparen würde. Könnten die Länder nicht einfach auf ihre Landessprache verzichten <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ?<br />
&#8230; Nun gut. Das ist bestimmt ne doofe Idee. Aber sie würde jede Menge Zeit, Geld, Nerven und Energie sparen. Oder?<br />
Wobei das Problem vermutlich darin bestünd, dass das Problem selber nur die Programmierer stört. Die Politik würde das nicht kümmern &#8211; die haben ja auch genug Probleme. Aber selbst wenn sich sowas durchsetzen würde, würden sofort Leute kommen, die irgendwelche Tools erfinden, welche durch irgendwelche Tricks den ganzen Systemen wieder Sonderzeichen beibringen. Diese Tools wären unzuverlässig, zeitraubend, unnötig und eben dumm.</p>
<p>Aber allein schon diese verwirrten Gedanken beweisen doch, wie nervig Sonderzeichen sind, oder?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/11/10/zeichen-zahlen-trotz-umlaute/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP-Script zur Passwort-Erstellung</title>
		<link>http://www.compufreak.info/2010/05/08/php-script-zur-passwort-erstellung/</link>
		<comments>http://www.compufreak.info/2010/05/08/php-script-zur-passwort-erstellung/#comments</comments>
		<pubDate>Sat, 08 May 2010 17:03:24 +0000</pubDate>
		<dc:creator>compufreak</dc:creator>
				<category><![CDATA[PHP-Scripte]]></category>
		<category><![CDATA[generieren]]></category>
		<category><![CDATA[passwort]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.compufreak.info/?p=668</guid>
		<description><![CDATA[Wie auch immer, ... ich habe in einem Buch über PHP mal ein Script gesehen, welches leicht zu merkende Passwörter generieren sollte. Vor Kurzem hatte in der Homepage-AG jemand ein ähnliches Problem, und ich habe angefangen daran ein wenig rumzubasteln (an der Idee, nicht an seinen Problemen ;-) ). Herausgekommen ist ein Script, welches Passwörter generiert - Oh Wunder!]]></description>
			<content:encoded><![CDATA[<p><b>Hiho,</b><br />
hier bin ich wieder &#8230; nicht wundern, wenn ich mich verschnupft anhöre, &#8230; &#8230; ich hab Schnupfen.</p>
<p>Wie auch immer, &#8230; ich habe in einem Buch über PHP mal ein Script gesehen, welches leicht zu merkende Passwörter generieren sollte. Vor Kurzem hatte in der Homepage-AG jemand ein ähnliches Problem, und ich habe angefangen daran ein wenig rumzubasteln (an der Idee, nicht an seinen Problemen <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ). Herausgekommen ist ein Script, welches Passwörter generiert &#8211; Oh Wunder!</p>
<p>Das Script erstellt beliebig lange Zeichenketten nach dem Zufallsprinzip.<br />
<b>Mögliche Zeichen:</b></p>
<ul>
<li>a-z</li>
<li>A-Z</li>
<li>0-9</li>
</ul>
<p>Da solche Funktionen hauptsächlich im Bereich der Passwort-Erstellung Anwendung finden, lassen sich per Parameter auch leichter zu merkende Passwörter erstellen. Diese können nur Kleinbuchstaben enthalten, wovon jeder zweite ein Vokal ist.</p>
<p>Beispiel für ein (fast immer) &#8216;einfaches&#8217; Passwort:</p>
<p><b>raeija</b></p>
<p>Beispiel für ein (meist) &#8216;schweres&#8217; Passwort:<br />
<ins datetime="2010-05-10T12:20:17+00:00">Update: Jetzt wird sogar ein schweres angezeigt XD</ins></p>
<p><b>sPBPEG</b><br />
Wie immer gebe ich auch den entsprechenden Code heraus, damit sich Andere darüber freuen können &#8211; seht ihr, ich bin sehr wohl sozial und so&#8230;.</p>
<p><b>PHP-Code:</b></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 /></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;">function</span> generate_password<span style="color: #009900;">&#40;</span><span style="color: #000088;">$length</span><span style="color: #339933;">,</span><span style="color: #000088;">$pass</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'z'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'A'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Z'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'0'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'9'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$chars_pass</span> <span style="color: #339933;">=</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'z'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$chars_vowel</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;e&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;i&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;o&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;u&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pass</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$length</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$code</span><span style="color: #339933;">.=</span><span style="color: #000088;">$i</span><span style="color: #339933;">%</span><span style="color:#800080;">2</span><span style="color: #339933;">==</span><span style="color: #cc66cc;">0</span>?<span style="color: #000088;">$chars_pass</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">array_rand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars_pass</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span><span style="color: #000088;">$chars_vowel</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">array_rand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars_vowel</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&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; <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$length</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$code</span><span style="color: #339933;">.=</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">array_rand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p><em>Ich plane, dieses Script noch weiter zu verbessern, aber das heißt nicht, dass ich das auch tue &#8230; Es ist allerdings wahrscheinlich <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </em></p>
<p>Diesen Text und den Code gibt&#8217;s natürlich auch in der Tool-Sammlung <img src='http://www.compufreak.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Also: Falls jemand noch eine coole Idee hat, was Passwörter noch einfach merkbar macht! Schreibt ein Buch darüber und schickt&#8217;s mir zu &#8230; die Langweiler unter Euch dürfen&#8217;s auch in die Kommentare schreiben. Aber nur, wenn sie einen Smilie daneben machen, das zeugt von wahrem Inletekt! </p>
<p>Bis dahin,<br />
<strong>compufreak</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.compufreak.info/2010/05/08/php-script-zur-passwort-erstellung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

