<?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>ebene7 &#187; Spam</title>
	<atom:link href="http://blog.ebene7.com/schlagwort/spam/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ebene7.com</link>
	<description></description>
	<lastBuildDate>Tue, 04 Jun 2013 18:57:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Captchas umgehen leicht gemacht</title>
		<link>https://blog.ebene7.com/2010/04/06/captchas-umgehen-leicht-gemacht/</link>
		<comments>https://blog.ebene7.com/2010/04/06/captchas-umgehen-leicht-gemacht/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 08:00:33 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Bot]]></category>
		<category><![CDATA[Captcha]]></category>
		<category><![CDATA[Schutz]]></category>
		<category><![CDATA[Sicherung]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=545</guid>
		<description><![CDATA[Warum schreibe ich als Entwickler einen Artikel darüber, wie man einen vermeintlichen Schutzmechanismus umgeht? Ganz klar, weil die Dinger mich als Anwender nerven und ich sie auch als Entwickler nicht sinnvoll finde. Bevor ich aber nun einen Glaubenskrieg um Captcha-Bildchen &#8230; <a href="https://blog.ebene7.com/2010/04/06/captchas-umgehen-leicht-gemacht/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Warum schreibe ich als Entwickler einen Artikel darüber, wie man einen vermeintlichen Schutzmechanismus umgeht? Ganz klar, weil die Dinger mich als Anwender nerven und ich sie auch als Entwickler nicht sinnvoll finde. Bevor ich aber nun einen Glaubenskrieg um <a href="http://de.wikipedia.org/wiki/CAPTCHA" target="_blank">Captcha</a>-Bildchen entfache, werde ich nachfolgend erklären, warum diese nicht so sicher sind.</p>
<p><span id="more-545"></span>Gut, dass das Abschreiben von irgendwelchen Wortfetzen aus unleserlichen Bildern nervt, um irgendwelche Aktionen ausführen zu können steht sicher nicht zur Diskussion. Aber auch die Sperre ansich kann relativ leicht umgangen werden.</p>
<p>Über die grundsätzlichen Vor- und Nachteile habe ich schon in einem früheren <a href="http://blog.ebene7.com/2009/12/28/spambots-ist-mir-doch-egal/" target="_self">Artikel</a> geschrieben. Captcha sollen ja schon dem Namen nach zwischen Menschen und Maschinen unterscheiden, d.h. wenn die Aufgabe durch eine Maschine an einen anderen Menschen weitergereicht wird, dann ist die Aufgabe ja schon gelöst.</p>
<p>Konkret bedeutet das, wenn ein Programm z.B. auf einer Webseite eine geschützte Aktion ausführen will, dann kann es die Aufgabe, bewusst oder unbewusst, an einen Menschen deligieren und lösen lassen. Mit der zu erwartenen korrekten Antwort kann dann die Maschine die Aktion ausgeführen.</p>
<p>Das Ganze ist aber nicht ganz einfach. Eine Möglichkeit ist, die Aufgabe durch sexhungige, und wahrscheinlich unkritische, Besucher einer gut frequentierten Pornoseite lösen zu lassen. Der Nachteil für Spammer ist wohl, dass erstmal diese Seite vorhanden sein muss.</p>
<p>Wie man eine gut besuchte Community aufziehen kann, habe ich ja schon in meinem letzten <a href="http://blog.ebene7.com/2010/04/01/auf-partnersuche-mit-dem-dating-bot/" target="_self">Artikel</a> beschrieben. <img src='https://blog.ebene7.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Eine andere Möglichkeit ist auch der Einsatz von Menschen in Billiglohnländern, ähnlich dem <a href="http://de.wikipedia.org/wiki/Goldfarmer" target="_blank">Goldfarming</a> bei Computerspielen.</p>
<p>Die Einsatzbereitschaft hängt sicherlich von dem zu erwartenden Nutzen ab. Daher wird derartiger Schutz sicher schnell umgangen sein, wenn es jemand wirklich darauf anlegt und den ehrlichen Nutzer wird es weiterhin einfach nur nerven.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/04/06/captchas-umgehen-leicht-gemacht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spambots? Ist mir doch egal!</title>
		<link>https://blog.ebene7.com/2009/12/28/spambots-ist-mir-doch-egal/</link>
		<comments>https://blog.ebene7.com/2009/12/28/spambots-ist-mir-doch-egal/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 14:30:04 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Bot]]></category>
		<category><![CDATA[Captcha]]></category>
		<category><![CDATA[Schutz]]></category>
		<category><![CDATA[Sicherung]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=22</guid>
		<description><![CDATA[Dieser Artikel erklärt einige Strategien und Methoden, um Spambots und deren Hinterlassenschaften von der Webseite zu verbannen. <a href="https://blog.ebene7.com/2009/12/28/spambots-ist-mir-doch-egal/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dieser Artikel erklärt einige Strategien und Methoden, um Spambots und deren Hinterlassenschaften von der Webseite zu verbannen.</p>
<p>Diesem Thema habe ich mich zwar bereits 2006 angenommen (<a href="http://www.developia.de/developia/viewarticle.php?cid=29428" target="_blank">Artikel auf developia.de</a>), aber es hat über die Jahre sicher nicht an Bedeutung verloren.</p>
<p>So nutze ich die Gelegenheit etwas Inhalt zu schaffen und vergleiche, was sich in den letzten knapp vier Jahren so getan hat.</p>
<p><span id="more-22"></span></p>
<h3>Spambots? Ist mir doch egal!</h3>
<p><a href="http://de.wikipedia.org/wiki/Spam" target="_blank">Spam</a> ist sicherlich jedem, der das Internet nutzt ein Begriff. Es handelt sich dabei um Nachrichten, die dem Empfänger meist elektronisch, aber immer unerwünscht zugestellt werden und oft werbenden Inhalt haben. Diese Art der Belästigung weitet sich u.a. durch die Verbreitung von Standardsoftware, wie z.B. Gästebücher, Foren, Blogs etc. nun auch auf Webpages aus.</p>
<p>Häufiges Ziel dieser Aktionen ist es, massenhaft eigene Links auf fremden Seiten zu platzieren, um dadurch das Ranking der beworbenen Seite bei Suchmaschinen zu verbessern. Die Seite soll wertvoller erscheinen, da so viele verschiedene Seiten darauf verlinken. Nicht zuletzt geht es natürlich auch um Werbung.</p>
<p>Was lässt sich nun dagegen tun, dass so genannte <a href="http://de.wikipedia.org/wiki/Spambot" target="_blank">Spambots</a> die eigene Webseite in eine Müllkippe verwandeln?</p>
<p>Um heraus zu finden, ob Eingaben von einem Menschen oder von einem Programm gemacht worden sind, lassen sich <a href="http://de.wikipedia.org/wiki/Captcha" target="_blank">Captcha</a> einsetzen. Leider sind einzelne Captcha keine Wunderwaffe gegen die Werbeflut aber eine Strategie. Verschiedene begleitende Maßnahmen können den Schutz verbessern.</p>
<p>Die folgenden Prüfmethoden lassen sich sowohl einzeln oder besser noch in einem Gesamtkonzept einsetzen. Voraussetzung für die Arbeit sind grundlegende Programmier- und <a href="http://de.wikipedia.org/wiki/Php" target="_blank">PHP</a>-Kenntnisse. Selbstverständlich lassen sich die beschriebenen Techniken auch mit anderen Sprachen umsetzen (<a href="http://de.wikipedia.org/wiki/Perl_(Programmiersprache)" target="_blank">Perl</a>, <a href="http://de.wikipedia.org/wiki/Java_(Programmiersprache)" target="_blank">Java</a> etc).</p>
<h3>1. Generierte Bilder/Captchas</h3>
<p>Das wie ich glaube bekannteste Captcha beruht auf generierten Grafiken, die eine für Maschinen möglichst unlesbare Zeichenkette enthalten, die jedoch für einen Menschen kein Problem darstellen sollten. Gerade bei diesen Bildern hat sich in den letzten Jahren einiges getan.</p>
<p>Die Bilder sind mit zunehmender Qualität der heutigen OCR-Software (<a href="http://de.wikipedia.org/wiki/Texterkennung" target="_blank">Optical Character Recognition</a>) immer komplexer und dadurch auch für den Menschen schwieriger zu lesen. Die Erkennung der Bilder lässt sich jedoch auch recht leicht umgehen, indem die Erkennung an Menschen auf anderen Seiten <a href="http://de.wikipedia.org/wiki/Captcha#Unwissentlich" target="_blank">delegiert</a> wird.</p>
<p>Gerade auf Seiten, die sich um eine möglichst barrierefreie Bedienung bemühen, ist das ein Problem. Als Alternative werden zunehmend Audio-Captcha angeboten. Dabei werden dem Benutzer die geforderten Eingaben vorgelesen.</p>
<p>Captcha ist, meiner persönlichen Meinung nach, nach wie vor störend und nicht die eleganteste Methode. Wenigstens wurde dem Abtippen der Bildschnipsel in den letzten Jahren durch <a href="http://de.wikipedia.org/wiki/ReCAPTCHA#reCAPTCHA" target="_blank">ReCAPTCHA</a> ein gewisser Mehrwert verliehen.</p>
<p>Bei der Verwendung von Captcha ist es wichtig, die Bilder so aufzurufen, dass der Bot die Zeichenkette nicht ausspähen kann.</p>
<p><code>&lt;img src="captcha.php?string=smwm"&gt;</code></p>
<p>Der im Beispiel gezeigte Aufruf wäre also nicht wirklich sinnvoll, da der Bot den String mittels <a href="http://de.wikipedia.org/wiki/Regex" target="_blank">RegEx</a> aus der Bild-URL lesen könnte. Besser ist es, den String (oder die jeweilige ID bei gecachten Bildern) in einer <a href="http://de.wikipedia.org/wiki/Session-ID" target="_blank">Session</a> zu speichern und dann in allen Scripten zu verwenden.</p>
<p>An dieser Stelle rate ich ausdrücklich von der Verwendung von <a href="http://de.wikipedia.org/wiki/HTTP-Cookie" target="_blank">Cookies</a> ab, da die Informationen beim Anwender gespeichert werden und so auch manipuliert oder verarbeitet werden können.</p>
<h4>Benötigte Kenntnisse/Funktionen:</h4>
<ul>
<li><a href="http://de.php.net/manual/de/ref.image.php" target="_blank">GD/Grafik</a></li>
<li><a href="http://de.php.net/manual/de/ref.filesystem.php" target="_blank">Datei-</a> oder Datenbankzugriff (<a href="http://de.php.net/manual/de/ref.mysql.php" target="_blank">MySQL</a>)</li>
<li><a href="http://de.php.net/manual/de/ref.session.php" target="_blank">Session</a></li>
<li>Eingabeverarbeitung</li>
</ul>
<h3>2. Einfache Aufgaben</h3>
<p>Eine weitere inzwischen recht verbreitete Methode der Überprüfung ist es, dem Anwender eine einfache Aufgabe zu stellen und die Eingabe dann mit der richtigen Antwort zu vergleichen.</p>
<p>Am einfachsten sind kleine Rechenaufgaben (z.B. 3+7, 2*3 etc.), denn sie lassen sich schnell und leicht generieren und selbst ein Grundschüler sollte die Antwort kennen.</p>
<p>Jedoch könnte ein Bot auch relativ leicht so programmiert werden, dass er die Aufgabe aus dem HTML-Quelltext ausliest, löst und das Ergebnis verwendet. Hier wäre die Kombination mit generierten Bildern vorstellbar, die die Aufgabe enthalten.</p>
<p>Etwas komplexer und sicherer (auch ohne generierte Bilder) ist die Frage nach Themen, die ein Computer nicht ohne weiteres lösen kann, da sie Textverständnis voraussetzen, z.B. &#8220;welcher Tag ist Heute?&#8221;, &#8220;Wie lautet der dritte Buchstabe im Wort Spambot?&#8221; etc. Zu bedenken ist dabei auch, dass der Programmieraufwand größer wird und zu schwierige Fragen evtl. auch den einen oder anderen Besucher daran hindern, einen netten Eintrag im Gästebuch zu hinterlassen.</p>
<p>Der stark vereinfachte Code zum Erstellen einer Aufgabe könnte etwa so aussehen:</p>
<pre>srand (time ());
$zahl1 = rand (1, 9);
$zahl2 = rand (1, 9);
$_SESSION['aufgabe'] = $zahl1 . '+' . $zahl2;
$_SESSION['ergebnis'] = $zahl1 + $zahl2;</pre>
<h4>Benötigte Kenntnisse/Funktionen:</h4>
<ul>
<li><a href="http://www.php.net/manual/de/ref.session.php" target="_blank">Session</a></li>
<li>Eingabeverarbeitung</li>
<li>Zufallsfunktionen (<a href="http://de.php.net/manual/de/function.srand.php" target="_blank">srand</a> / <a href="http://de.php.net/manual/de/function.rand.php" target="_blank">rand</a>)</li>
</ul>
<h3>3. Session-Counter</h3>
<p>Für die meisten Überprüfungen ist eine Session sinnvoll oder notwendig. Diese lässt sich auch gut zum Zählen der Seitenaufrufe nutzen. Da die meisten moderen Anwendungen ohnehin mit einer Session arbeiten, stellt diese Möglichkeit keinen großen Mehraufwand dar.</p>
<p>Die wenigsten Bots werden wohl zuerst das Formular aufrufen und dann die Seite, die die Eingaben verarbeitet/speichert und selbst wenn, dann ist der geforderte Aufwand schon wieder etwas größer.</p>
<p>Ein menschlicher Benutzer hingegen wird wahrscheinlich beides tun, d.h. sein Zählerstand ist dann größer als eins.</p>
<pre>session_start ();
if (isset ($_SESSION['count'])) {
  $_SESSION['count'] = 0;
}
$_SESSION['count']++;

if ($_SESSION['count'] &gt; 1) {
  // mach was
} else {
  die ();
}</pre>
<h4>Benötigte Kenntnisse/Funktionen:</h4>
<ul>
<li><a href="http://de.php.net/manual/de/ref.session.php" target="_blank">Session</a></li>
<li>Grundlagen der Mathematik</li>
</ul>
<h3>4. Zeitmessung</h3>
<p>Bekanntlich sind Menschen langsamer als Maschinen und brauchen für gewöhnlich für die Eingabe der Daten in das Formular eine gewisse Zeit. Das können wir uns nun zu Nutzen machen und die Zeitdifferenz zwischen der Anzeige des Formulars und dem Eingang der Daten messen.</p>
<h4>Benötigte Kenntnisse/Funktionen:</h4>
<ul>
<li><a href="http://de.php.net/manual/de/ref.session.php" target="_blank">Session</a></li>
<li><a href="http://de.php.net/manual/de/function.time.php" target="_blank">Zeitfunktionen</a></li>
<li>Grundlagen der Mathematik</li>
</ul>
<h3>5. Token (vgl.<a href="http://de.wikipedia.org/wiki/Security-Token" target="_blank">Security-Token</a>)</h3>
<p>Eine, wie ich finde, recht einfache, sichere und fehlerunanfällig Methode ist der Einsatz von Token. Token sind serverseitig generierte Einwegschlüssel, die als Datei oder besser noch in der Session des jeweiligen Benutzers gespeichert und gleichzeitig in einem verstecktem Formularfeld übergeben werden.</p>
<p>Einfache Token sind <a href="http://de.wikipedia.org/wiki/Md5" target="_blank">MD5</a>-Summen aus beliebigen Werten.</p>
<pre>session_start ();
$_SESSION['token'] = md5 (time ());</pre>
<p>Die Token können beliebig generiert werden, dabei sollte darauf geachtet werden, dass der Schlüssel möglichst schwer zu erraten ist.</p>
<p>Im so sähe das HTML-Formular aus&#8230;</p>
<p>&#8230;im PHP-Script:</p>
<pre>&lt;form action="..." method="post"&gt;
  &lt;input name="token" type="hidden" value="&lt;?php echo $_SESSION['token']; ?&gt;" /&gt;
  &lt;!-- weitere Formularelemente --&gt;
&lt;/form&gt;</pre>
<p>&#8230;in der HTML-Ausgabe:</p>
<pre>&lt;form action="..." method="post"&gt;
  &lt;input name="token" type="hidden" value="ed740e1aba2df..." /&gt;
  &lt;!-- weitere Formularelemente --&gt;
&lt;/form&gt;</pre>
<p>Die Abfrage funktioniert dann später so:</p>
<pre>if (isset ($_POST['token']) &amp;&amp; $_POST['token'] == $_SESSION['token']) {
  $_SESSION['token'] = md5 (time ()); // neuer Schlüssel
  // mach was
}</pre>
<p>Zu beachten ist, wann und an welcher Stelle der Token-Schlüssel überschrieben wird, da es sonst die Prüfung immer fehlschlägt.</p>
<h4>Benötigte Kenntnisse/Funktionen:</h4>
<ul>
<li><a href="http://de.selfhtml.org/navigation/html.htm#formulare" target="_blank">HTML-Forms</a></li>
<li><a href="http://de.php.net/manual/de/ref.session.php" target="_blank">Session</a></li>
<li><a href="http://de.php.net/manual/de/function.md5.php" target="_blank">md5</a></li>
</ul>
<h3>6. JavaScript</h3>
<p>Eine aus meiner Sicht etwas kritische Methode ist, zwei versteckte HTML-Formularelemente mittels JavaScript clientseitig anzugleichen und dann serverseitig auf Identität zu überprüfen. Diese Methode ist deshalb kritisch, weil Benutzer ohne aktives JavaScript im Browser keine Aktion ausführen können. Die Akzeptanz gegenüber JavaScript ist gefühlt zwar besser geworden, aber dennoch ist das nicht 100%ig zuverlässig.</p>
<p>Es bietet sich hier an, einfach die Token-Prüfung zu erweitern, da wir bereits ein verstecktes &#8220;Zufallsfeld&#8221; haben, dessen Wert auf dem Server gespeichert ist.</p>
<p>Die Erweiterung&#8230;</p>
<p>&#8230;im PHP-Script:</p>
<pre>&lt;form action="..." method="post"&gt;
  &lt;input name="token_c" type="hidden" value="&lt;?php echo md5(0); ?&gt;" /&gt;
  &lt;!-- weitere Formularelemente --&gt;
&lt;/form&gt;</pre>
<p>&#8230;in der HTML-Ausgabe:</p>
<pre>&lt;form action="..." method="post"&gt;
  &lt;input name="token_c" type="hidden" value="cfcd208495d56..." /&gt;
  &lt;!-- weitere Formularelemente --&gt;
&lt;/form&gt;</pre>
<p>Beim Absenden des Formulars wird des JavaScript-Handler &#8220;<a href="http://de.selfhtml.org/javascript/sprache/eventhandler.htm#onsubmit" target="_blank">onSubmit</a>&#8221; aufgerufen und führt die darin enthaltene Anweisung aus. In unserem Fall bekommt das Element &#8220;token_c&#8221; den Wert vom Element &#8220;token&#8221; zugewiesen. Auf der Serverseite werden dann beide Werte verglichen.</p>
<pre>if ($_POST['token'] == $_POST['token_c']) {
  // mach was
}</pre>
<h4>Benötigte Kenntnisse/Funktionen:</h4>
<ul>
<li>Grundkenntnisse <a href="http://de.selfhtml.org/javascript/index.htm" target="_blank">JavaScript</a></li>
</ul>
<h3>7. Bezeichner verschlüsseln</h3>
<p>So weit, so gut! Das alles kann schon einen ausreichenden und erfolgreichen Schutz gegen Spambots bieten. Wie nicht? Der Bot meint es ernst? Ok, wir können auch anders&#8230;</p>
<p>Bislang stehen alle Bezeichner im Klartext im HTML-Quelltext und so könnte z.B. die JavaScript-Prüfungen auch durch ein RegEx im Bot-Programm ersetzt werden, ebenso kennt das Bot-Programm wahrscheinlich auch alle anderen Feldnamen/-bezeichner und aus diesem Grund werden jetzt die Eingabefelder verschlüsselt.</p>
<p>Wir brauchen nun eine Funktion, die für uns einheitlich und flexibel die Bezeichner &#8220;verschlüsselt&#8221;. Der verschlüsselte Bezeichner ist ein Ausschnitt aus einem mit md5() erzeugtem String, auf der Grundlage zufälliger, persönlicher, konstanter und variabler Werte.</p>
<p>Der zufällige Wert wird, wie es der Name vermuten lässt, zufällig erzeugt und als &#8220;seed&#8221; in der Session gespeichert. Persönliche Werte der Benutzers sind z.B. $_SERVER['HTTP_USER_AGENT'], diese variieren evtl. je nach verwendeten Browser, bleiben aber im &#8220;Normalfall&#8221; während der Session konstant.</p>
<p>Die zu 90% konstanten Werte könnten $_SERVER['SERVER_NAME'] o.ä. sein, solange nicht verschiedene Domains auf die Datei zugreifen oder ein fest vorgegebener String. Die Variable ist letztlich unser Parameter $key.</p>
<p>Zuerst initialisieren wir die Session mit &#8220;seed&#8221;:</p>
<pre>session_start ();
if (!isset ($_SESSION['seed'])) {
  srand (time ());
  $_SESSION['seed'] = md5 (rand (0,250000) . time());
}</pre>
<p>Und unsere PHP-Funktion könnte nun so aussehen:</p>
<pre>function scramble_key ($key, $length=10) {
  $tmp = $_SESSION['seed'];
  $tmp .= $_SERVER['HTTP_USER_AGENT'];
  $tmp .= $_SERVER['SERVER_NAME'];
  $tmp = $key;
  return substr (md5 ($tmp), 0, $length);
}</pre>
<p>Den Einbau ins Formular demonstriere ich an dem bekannten &#8220;Token&#8221;-Formular:</p>
<p>Und so sähe das dann aus&#8230;</p>
<pre>&lt;form action="..." method="post"&gt;
  &lt;input name="&lt;?php echo scramble_key ('token_c'); ?&gt;" type="hidden" value="&lt;?php echo md5(0); ?&gt;" /&gt;
  &lt;!-- weitere Formularelemente --&gt;
&lt;/form&gt;</pre>
<p>&#8230;in der HTML-Ausgabe:</p>
<pre>&lt;form action="..." method="post"&gt;
  &lt;input name="9fefa8db9c" type="hidden" value="cfcd208495d56..." /&gt;
  &lt;!-- weitere Formularelemente --&gt;
&lt;/form&gt;</pre>
<p>Abgefragt werden die Eingaben dann fast wie immer:</p>
<pre>$form_token = scramble_key ('token');
$form_token_c = scramble_key ('token_c');

if ($_POST[$form_token] == $_POST[$form_token_c] {
  // mach was
}</pre>
<p>Wichtig ist, wenn diese Verschlüsselung zusammen mit der JavaScript-Prüfung verwendet wird, dass der Schlüssel mit einem Buchstaben beginnt.</p>
<p>Dafür reicht es die Funktion scramble_key minimal zu verändern:</p>
<pre>function scramble_key ($key, $length=10) {
  $tmp = $_SESSION['seed'];
  $tmp .= $_SERVER['HTTP_USER_AGENT'];
  $tmp .= $_SERVER['SERVER_NAME'];
  $tmp = $key;
  return 's' . substr (md5 ($tmp), 0, $length-1);
}</pre>
<p>Bei der Verwendung von Frameworks wie z.B. dem <a href="http://framework.zend.com/" target="_blank">Zend Framework</a> können verschiedene Prüfungen relative zentral (z.B. in den Decorators und Helpers) verbaut werden, so dass sie beim täglichen Gebrauch kaum mehr Arbeit verursachen.</p>
<p>Die Möglichkeit der Captchas wurde sogar schon mit <a href="http://framework.zend.com/manual/de/zend.form.standardElements.html#zend.form.standardElements.captcha" target="_blank">Zend_Form_Element_Captcha</a> umgesetzt und auch für unseren Token gibt es mit <a href="http://framework.zend.com/manual/de/zend.form.standardElements.html#zend.form.standardElements.hash" target="_blank">Zend_Form_Element_Hash</a> eine fertige Komponente.</p>
<h4>Benötigte Kenntnisse/Funktionen:</h4>
<ul>
<li><a href="http://de.php.net/manual/de/ref.session.php" target="_blank">Session</a></li>
</ul>
<h3>Zusammenfassung/Vergleich</h3>
<p>Capcha lässt sich inzwischen schnell und einfach in Anwendungen einbauen und auch die Prüfung ist einfach. Der Schutz hängt von der Komplexität der generierten Bilder ab und wird dadurch auch zunehmend schwerer für Menschen zu lesen.</p>
<p>Dem Benutzer irgendwelche Aufgaben zu stellen ist ebenfalls recht einfach umsetzbar und kann beliebig komplex erweitert werden. Gut kombinierbar mit generierten Bildern.</p>
<p>Session-Counter und Zeitmessung stellen aus meiner Sicht nur einen mittleren Schutz dar, da beides auch relativ einfach in einem Bot-Script umgangen werden kann. Etwas besser schützt dagegen ein Token. Diese Methode verhindert nebenbei auch mehrfache Verarbeitung der Daten, wenn der Benutzer das Formular mehrfach abschickt.</p>
<p>Das Formular mit JavaScript zu schützen ist ebenfalls einfach und kann bei Bedarf noch etwas erweitert werden. Benutzer mit deaktiviertem JavaScript werden dabei allerdings ausgesperrt. Die Methode lässt sich gut mit den anderen kombinieren. Wenn das Prinzip erkannt wird, lässt sich der Schutz u.U. auch von einem Bot umgehen.</p>
<p>Die Feldnamen zu verschlüsseln rundet das Konzept ab. Der Aufwand dafür hängt hauptsächlich von der zu schützenden Anwendung ab und in Frameworks lässt sich dieser Ansatz meist zentral implementieren.</p>
<p>Da die Formulare durch die verfremdeten Namen schwerer lesbar sind, sollte der Schutz während Entwicklungsarbeit abschaltbar sein.</p>
<h3>Fazit</h3>
<p>Die beschriebenen Methoden bieten alle keinen 100%igen Schutz, da sich jede Sperre mit entsprechendem Aufwand. Jede Schutzmanahme stellt nur einen gewissen Mehraufwand dar, aber eben dieser Mehraufwand wird die Zahl der potentiellen Störenfriede bereits merklich senken.</p>
<p>Ebenso sollten die verschiedenen Möglichkeiten als Bausteine verstanden werden, die sinnvoll je nach den Gegebenheiten der jeweiligen Anwendung eingesetzt und angepasst werden sollten. Eine Sperre für Bots sollte einen menschlichen Besucher so wenig wie möglich stören.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2009/12/28/spambots-ist-mir-doch-egal/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
