<?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>Der Interaktionsdesigner - PHP, jQuery und CSS &#187; Papyros</title>
	<atom:link href="http://www.interaktionsdesigner.de/category/papyros/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.interaktionsdesigner.de</link>
	<description>Pauls Blog beschäftigt sich mit Webentwicklungsthemen, im Focus stehen jQuery, TYPO3, CSS und PHP.</description>
	<lastBuildDate>Sat, 05 Jun 2010 21:13:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Spamschutz ohne Kompromisse!</title>
		<link>http://www.interaktionsdesigner.de/2008/05/14/spamschutz-ohne-kompromisse/</link>
		<comments>http://www.interaktionsdesigner.de/2008/05/14/spamschutz-ohne-kompromisse/#comments</comments>
		<pubDate>Wed, 14 May 2008 13:36:00 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Papyros]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=35</guid>
		<description><![CDATA[Am meisten nerven überflutete Datenbanken voller Spam. Und auf dem zweiten Platz landen die Techniken das zu verhindern!
Nervige Captchas, Rechenaufgaben, Fragen; größtenteils leicht zu beantworten und trotzdem hinderlich. Hier kommt ein Weg um Spam in Gästebüchern zu verhindern und dabei volle Nutzerfreundlichkeit zu erhalten.
Möglich wird das komplett auf Seite des Servers damit der arme User [...]]]></description>
			<content:encoded><![CDATA[<p>Am meisten nerven überflutete Datenbanken voller Spam. Und auf dem zweiten Platz landen die Techniken das zu verhindern!<br />
Nervige Captchas, Rechenaufgaben, Fragen; größtenteils leicht zu beantworten und trotzdem hinderlich. Hier kommt ein Weg um Spam in Gästebüchern zu verhindern und dabei volle Nutzerfreundlichkeit zu erhalten.<br />
Möglich wird das komplett auf Seite des Servers damit der arme User nicht verwirrt wird.</p>
<p><span id="more-35"></span></p>
<p><strong>Jetzt auch als <a title="ID SpamKill Spam Kommentare verhindern" href="http://www.interaktionsdesigner.de/2008/07/09/wordpress-plugin-spamkill/">WordPress Plugin</a> verfügbar!</strong></p>
<h2>Ein Gästebuch voller Spam</h2>
<p>Das Gästebuch von <a href="http://www.papyros.org">Papyros</a> eignet sich zu testzwecken sehr gut. Selten schreiben echte Menschen, Bots werden aber magisch angezogen. Vor der Abschaltung waren es 30 bis 40 Einträge pro Tag die veröffentlich wurden. Dagegen wurden etwa 7000 aussortiert.</p>
<h2>Fünf einfache Regeln</h2>
<p>Nachfolgende Regeln wende ich auf jeden neuen Eintrag an. Die technische Umsetzung folgt.</p>
<ol>
<li><strong>Zeit</strong><br />
Ein Spamroboter will sehr viele Nachrichten verbreiten und das in möglichst kurzer Zeit. Das kann natürlich kein Mensch.<br />
Schon an einer Zeitspanne von mind. 5ms scheitern die meisten Bots.</li>
<li><strong>Vertauschte Bezeichnungen</strong><br />
Offensichtlich werden die Formulare auf simpelste Art und Weise gescannt, ohne Berücksichtigung der Labels. Wir vertauschen<br />
Name und Mailfeld. Sobald eine E-Mailadresse im "Mail"-Feld eingetragen wird, haben wir Spam! (ja, das ist verwirrend)</li>
<li> <strong>Hiddenfield</strong><br />
Ein verstecktes Feld (input type="hidden") muss leer bleiben damit die Nachricht akzeptiert wird.</li>
<li> <strong>Anzahl Links im Text</strong><br />
Links werden natürlich immer verbreitet. Den Benutzern ist ein Link pro Nachricht erlaubt.</li>
<li> <strong>Korrekte E-Mailadresse</strong><br />
Mit einem ganz langem regulären Ausdruck überprüfen wir die E-Mailadresse. Das führt überwiegend zu Erfolg.</li>
</ol>
<h2>Funktionierts?</h2>
<p>Ja! Seit guten 24 Stunden ist der Filter jetzt im <a href="http://www.papyros.org/gaestebuch.html">Einsatz</a> und hat<br />
schon 44 Nachrichten abgewiesen. Alle Nachrichten laden im Spamlog und sehen typischer Weise so aus:</p>
<pre>E-Mailadresse im Namenfeld
Zu viele Links im Text
Die E-Mailadresse ist nicht korrekt
---------------
Hi, The new changes to the site look great. &lt;a href= &lt;a href="http://www.flingblogger.com/hotfling6/senior-relationships-the-best-dating-site.html"&gt;senior relationships-the best dating [...]</pre>
<p>Für Informationszwecke logge ich die Nachrichten und Gründe der Ablehnung mit.</p>
<h2>Technische Umsetzung</h2>
<p><strong>HTML</strong><br />
Ein wirksamer Schutz lässt sich sehr schnell und einfach implementieren. Im Formular brauchen wir nur geringe Änderungen:</p>
<pre><code class="html">&lt;form method="post" action="gaestebuch.html<strong>?s=&lt;?=time()?&gt;</strong>"&gt;
	&lt;input type="hidden" name="nachname" value=""&gt;

		&lt;label for="mail"&gt;Name:&lt;/label&gt;
			&lt;input type="text" name="<strong>mail</strong>" value=""&gt;&lt;br&gt;

		&lt;label for="name"&gt;E-Mail:&lt;/label&gt;
			&lt;input type="text" name="<strong>name</strong>" value=""&gt;&lt;br&gt;

		&lt;label for="text"&gt;Eintrag:&lt;/label&gt;
				&lt;textarea name="text"&gt;&lt;/textarea&gt;&lt;br&gt;

		&lt;label&gt;&lt;/label&gt;
			&lt;input type="submit" value="Eintragen!" style="width:auto"&gt;
&lt;/form&gt;
	</code></pre>
<p>Name und E-Mailfeld sind intern bezeichnet. Werden "for" Attribute vom Labelelement eventuell vorgelesen?<br />
Zur Messung der Zeit wird die aktuelle Zeit als GET-Parameter mitübergeben.</p>
<p><strong>PHP</strong><br />
Die oben angesprochenen Regeln sind nichts weiter als einfache if-Statements. Fehlermeldungen werden in ein Array geschrieben,<br />
wenn dieses nicht leer ist, kein Eintrag im Gästebuch gemacht. So sieht das bei mir aus:</p>
<pre><code class="php">// === spam robot filter ===
$spam = Array();

// Wurde das Formular zu schnell ausgefüllt?
$pt = time() - $_GET["s"];
if($pt &lt; 5)
	$spam[] = "Zu schnell ausgefüllt ($pt ms)";

// Vertauschte Bezeichnungen Name und Mail
if(ereg('^[-!#$%&amp;\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&amp;\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&amp;\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $_POST["mail"]))
	$spam[] = "E-Mailadresse im Namenfeld";

// Leeres Feld Nachname
if(!empty($_POST["nachname"]))
	$spam[] = "Eingabewerte im Hiddenfeld 'Nachname'";

// Anzahl Links im Text
if(substr_count($text, "http://") &gt; 1)
	$spam[] = "Zu viele Links im Text";

// E-Mailadresse korrekt?
if(!ereg('^[-!#$%&amp;\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&amp;\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&amp;\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $_POST["name"]))
	$spam[] = "Die E-Mailadresse ist nicht korrekt";

	</code></pre>
<p>Fertig!</p>
<h2>Probleme</h2>
<p>Mal abgesehen davon das niemand mehr Gästebucheinträge schreibt, ist mir noch nichts kritisches aufgefallen. Vielleicht könnte durch das verschicken, ausdrucken, einscannen und hochladen des Formulars der Timestamp durcheinander kommen.</p>
<h2>Erweiterungen</h2>
<p>Sollten die Bots es irgendwann geschafft haben und Einträge verfassen, dann habe ich noch ein paar Dinge, die ich gerne ausprobieren würde. Dazu dann bei Gelegenheit. Bisher läuft es wunderbar.</p>
<h2>Fazit</h2>
<p>Genau heute kam der erste Spamkommentar über diesen Blog rein. <span style="text-decoration: line-through;">Wie schreibt man WordPress Plugins?!</span> <a href="http://www.interaktionsdesigner.de/2008/07/09/wordpress-plugin-spamkill/">Hier ist ein Vorschlag!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/05/14/spamschutz-ohne-kompromisse/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
