<?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>Tobis Blog &#187; Allgemein</title>
	<atom:link href="http://blog.aditu.de/category/allgemein/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aditu.de</link>
	<description>Alles rund um Webentwicklung, Fotografie, PHP und das Zend Framework</description>
	<lastBuildDate>Mon, 06 Sep 2010 19:03:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>blog.aditu.de auch für iPhone &amp; Co.</title>
		<link>http://blog.aditu.de/2010/05/23/blog-aditu-de-auch-fur-iphone-co/</link>
		<comments>http://blog.aditu.de/2010/05/23/blog-aditu-de-auch-fur-iphone-co/#comments</comments>
		<pubDate>Sun, 23 May 2010 13:59:19 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Theme]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=449</guid>
		<description><![CDATA[Bei dem iPhone und iPad und iWasweißichwas-Hype kommt man ja als Webentwickler nicht mehr darum herum auch aufzurüsten und seinen Content auch auf Briefmarkengröße anzubieten. Bei WordPress ist das glücklicherweise sehr einfach. Das Plugin WPtouch erweitert den Blog und stellt auf iPhones ein passendes und optimiertes Theme zur Verfügung. Das habe ich für diesen Blog [...]]]></description>
			<content:encoded><![CDATA[<p>Bei dem iPhone und iPad und iWasweißichwas-Hype kommt man ja als Webentwickler nicht mehr darum herum auch aufzurüsten und seinen Content auch auf Briefmarkengröße anzubieten. Bei WordPress ist das glücklicherweise sehr einfach. Das Plugin <a title="WPtouch" href="http://www.bravenewcode.com/products/wptouch/">WPtouch</a> erweitert den Blog und stellt auf iPhones ein passendes und optimiertes Theme zur Verfügung. Das habe ich für diesen Blog mal gemacht und bin mit dem Ergebnis ganz zufrieden. Also: wer jetzt mobil auf blog.aditu.de surfen will kann das jetzt problemlos machen <img src='http://blog.aditu.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2010/05/23/blog-aditu-de-auch-fur-iphone-co/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ServerBridge zwischen PHP und C/C++</title>
		<link>http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/</link>
		<comments>http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/#comments</comments>
		<pubDate>Sat, 15 May 2010 11:11:14 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[mongoose]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=428</guid>
		<description><![CDATA[Jetzt ist es schon wieder einige Zeit her, dass ich hier etwas geschrieben habe und ich denke ich gebe mal ein Lebenszeichen von mir. Natürlich gibt es zahlreiche interessante Themen in meiner Queue zum bloggen, aber wie immer findet man nicht die Zeit oder nötige Ruhe dazu. Die Problemstellung Nun aber zum Thema: für ein [...]]]></description>
			<content:encoded><![CDATA[<p>Jetzt ist es schon wieder einige Zeit her, dass ich hier etwas geschrieben habe und ich denke ich gebe mal ein Lebenszeichen von mir. Natürlich gibt es zahlreiche interessante Themen in meiner Queue zum bloggen, aber wie immer findet man nicht die Zeit oder nötige Ruhe dazu.</p>
<h2>Die Problemstellung</h2>
<p>Nun aber zum Thema: für ein aktuelles Projekt benötige ich, von meiner PHP Webapplikation heraus, den Zugriff auf einige Hardwarekomponenten. Zudem will ich einige Fremdbibliotheken verwenden, die sehr rechenintensive Aufgaben übernehmen und auch nur in C++ zur Verfügung stehen. Die Frage ist also: wie kann ich diese Komponenten an mein PHP Programm ankoppeln?</p>
<p>Für Java gibt es eine ganz gute <a title="PHP Java Bridge" href="http://php-java-bridge.sourceforge.net/pjb/">Server Bridge</a>, die innerhalb der Java Virtual Machine einfach einen kleinen Server startet, der XML Anfragen entgegen nimmt, stellvertretend ausführt und das Ergebnis, auch wieder über eine XML Kommunikationsschnittstelle, zur Verfügung stellt. Die nötige PHP Klasse wird ebenfalls durch den Java Server direkt zur Verfügung gestellt. Eine ähnliche Bridge Lösung bringt auch der <a title="Zend Server Community Edition" href="http://www.zend.com/de/products/server-ce/">Zend Server</a> bereits out of the box mit.</p>
<p>Für C++ habe ich so eine Lösung nicht gefunden und als weiteren Ansatz überlegt, eine PHP Extension zu entwickeln. Sowohl für Linux, als auch für Windows, gibt es hier Tutorials (siehe &#8220;<a title="Extension-Entwicklung unter WAP" href="http://www.phpforum.de/forum/showthread.php?t=244096">Extension-Entwicklung unter WAP</a>&#8220;, &#8220;<a title="Wrapping C++ Classes in a PHP Extension" href="http://devzone.zend.com/article/4486-Wrapping-C-Classes-in-a-PHP-Extension">Wrapping C++ Classes in a PHP Extension</a>&#8221; oder &#8220;<a title="Extension Writing Part I: Introduction to PHP and Zend" href="http://devzone.zend.com/article/1021">Extension Writing Part I: Introduction to PHP and Zend</a>&#8220;). Allerdings ist, neben den Tutorials, der ganze Vorgang nicht gut dokumentiert und scheinbar muss das Kompilat der Extension exakt dem des verwendeten PHP Kompilats entsprechen. Insgesamt also eher eine wackelige Angelegenheit.</p>
<h2>Lösungsansatz</h2>
<p>Meine Lösung ist hingegen pragmatisch und verfolgt eine eher losere Kopplung: Meine C++ Komponenten werden in ein eigenständiges Programm ausgelagert, das selbst, über einen gewöhnlichen HTTP Server, die benötigten Dienste zur Verfügung stellt. Dabei orientiere ich mich an dem REST Architektur Prinzip und binde jeweils eine Teil-Funktionalität an eine feste URL. Die Parameter und Rückgabewerte werden mittels JSON kodiert. Von PHP Seite aus, wird der Aufruf der C++ Komponenten sauber gekapselt, so dass für das PHP Programm der Eindruck entsteht, dass eine gewöhnliche Funktion aufgerufen wird.</p>
<p>Welche Vor- und Nachteile hat das Vorgehen? Zum einen ist die in C++ implementierte Funktionalität sauber gekapselt und von der Webapplikation getrennt. Dadurch wird die Software leichter wartbar. Durch eine saubere Schnittstellendefinition, kann die C++ Serverkomponente auch unabhängig vom Wissen über die PHP Applikation gepflegt werden. Zum anderen entsteht aber ein zusätzlicher Aufwand (mit zusätzlichen Fehlerquellen). Die Schnittstelle muss definiert und implementiert werden, ein Fehlerhandling muss durchgeführt werden und eine zusätzliche Serverapplikation muss gestartet werden, was hinsichtlich der Sicherheit berücksichtigt werden muss. Dennoch halte ich die Lösung für die eleganteste, denn sie nutzt genau die Vorteile der Vernetzung und der losen Kopplung aus. So könnte die C++ Komponente bei höherer Last auch leicht auf einen eigenen Server umgezogen oder unabhängig von der Webapplikation betrieben werden.</p>
<h2>Implementierung</h2>
<p>In der Theorie hört sich natürlich immer alles ganz nett an, aber wie sieht das mit dem HTTP Server aus? Hier gibt es eine hervorragende C++ Bibliothek, mit der sich ohne großen Aufwand eine solcher HTTP Server realisieren lässt. <a title="mongoose" href="http://code.google.com/p/mongoose/">mongoose</a> heißt das Wunderding, steht unter der MIT Lizenz unter <a title="mongoose" href="http://code.google.com/p/mongoose/">Google Code</a> zur Verfügung. Es unterstützt Windows, Linux und Mac OS X, bietet eine CGI Schnittstelle, SSL Verschlüsselung, ACL, eine saubere API und ist nicht größer als 60 kB. Die Dokumentation ist zwar recht knapp, aber dank Beispiele findet man sich schnell zurecht und auch die API Beschreibung ist vollkommen ausreichend.</p>
<p>Will man einen eigenen Server starten, so muss zuerst ein neuer Context erzeugt werden:</p>
<pre class="brush: cpp;">
struct mg_context* ctx;
ctx = mg_start();
</pre>
<p>Mit <em>mg_set_options</em>, werden die Servereinstellungen geändert. Folgende zwei Zeilen deaktivieren das Directory Listing und setzten 8080 als Port.</p>
<pre class="brush: cpp;">
mg_set_option(ctx, &quot;dir_list&quot;, &quot;no&quot;);
mg_set_option(ctx, &quot;ports&quot;, &quot;8080&quot;);
</pre>
<p>Aus Sicherheitsgründen erlaube ich nur einen Zugriff vom selben Rechner aus, also erlaube nur die IP Adresse 127.0.0.1:</p>
<pre class="brush: cpp;">
mg_set_option(ctx, &quot;acl&quot;, &quot;-0.0.0.0,+127.0.0.1&quot;);
</pre>
<p>Mit <em>mg_set_uri_callback</em> kann ein Pointer auf eine eigene Funktion an eine URL gebunden werden. Diese wird aufgerufen, wenn der Client die URL aufruft, wobei die URL auch Wildcards enthalten kann.</p>
<pre class="brush: cpp;">
mg_set_uri_callback(ctx, 'dosomething', &amp;Server::dosomething, NULL);
</pre>
<p>Als dritter Parameter darf ein Pointer (<em>void*</em>) auf ein beliebiges Objekt übergeben werden. Die Callback Methode bekommt dazu alle notwendigen Parameter, wie die aktuelle Verbindung, den aktuellen Request und das zuvor übergebene Objekt (hier <em>NULL</em>) übergeben.</p>
<pre class="brush: cpp;">
void Server::capture(struct mg_connection *conn,
 const struct mg_request_info *request_info,
 void *user_data) {
char* param = mg_get_var(conn, &quot;param&quot;);
mg_printf(conn, &quot;%s&quot;, &quot;HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n&quot;);
}
</pre>
<p>Mit <em>mg_printf</em> kann dann eine Antwort an den Client gesendet werden. Hier als einfaches Beispiel einfach nur ein OK (HTTP 200). In meinem Szenario wird hier der generierte JSON Text zurück gegeben. Mit mg_get_var können übergebene Parameter (POST, GET) ausgelesen werden. Wichtig: um memory leaks zu vermeiden, müssen diese mit <em>mg_free</em> wieder freigegeben werden.</p>
<p>Natürlich ist das nur die eine Hälfte. PHP muss jetzt auch Funktionen, auf dem Server, aufrufen können. Dazu kommt der Zend_Http_Client zum Einsatz. Dieser ist im Zend Framework enthalten, mit etwas Frickelei kann er aber auch aus dem Gesamtpaket heraus gepickt werden. Da ich aber das Zend Framework für die ganze Anwendung nutze, ist das Aufrufen der URL und das Decodieren des JSON Strings in einen Action Helper ausgelagert, der gleichzeitig eine einfache Fehlerbehandlung durchführt:</p>
<pre class="brush: php;">
class JsonHttpHelper extends Zend_Controller_Action_Helper_Abstract {
   public function get($url, $params = array()) {
      try {
         $client = new Zend_Http_Client($url);
         foreach($params as $param=&gt;$value)
            $client-&gt;setParameterPost($param, $value);
            $response = $client-&gt;request('POST');
            $res = Zend_Json::decode($response-&gt;getBody());
            if($response-&gt;isSuccessful()) {
               return $res;
            } else {
               return array(&quot;error&quot; =&gt; &quot;request not successfully: &quot;.$res[&quot;error&quot;]);
            }
      } catch(Exception $e) {
         return array(&quot;error&quot; =&gt; $e-&gt;getMessage());
      }
 }
}
</pre>
<p>Bisher bin ich mit der Lösung sehr zufrieden. Besonders mongoose kann ich nur wärmstens empfehlen. Auch von der Verarbeitungsgeschwindigkeit ist das Ergebnis zufriedenstellend und kann sich sehen lassen. Um den Rahmen nicht zu sprengen, habe ich die serverseitige Generierung und Verarbeitung von JSON außen vor gelassen. Hier gibt es aber auch zahlreiche Bibliotheken, so dass die Suche nicht schwer fallen dürfte.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Neues Design für meine Homepage&#8230;</title>
		<link>http://blog.aditu.de/2010/02/06/neues-design-fur-meine-homepage/</link>
		<comments>http://blog.aditu.de/2010/02/06/neues-design-fur-meine-homepage/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 12:26:50 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[aditu.de]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=364</guid>
		<description><![CDATA[Nach meinem Blog ist jetzt meine Homepage dran und hat eine Rundumerneuerung bekommen. Sie ist nun auch viel schlichter geworden und soll schnell und unkompliziert einen Überblick über meine Fotografie und meinen Aktivitäten im Netz geben. Feedback ist willkommen und ich bin gespannt ob die Seite gefällt.]]></description>
			<content:encoded><![CDATA[<p>Nach meinem Blog ist jetzt meine <a title="Webseite Tobias Zeising" href="http://www.aditu.de">Homepage</a> dran und hat eine Rundumerneuerung bekommen. Sie ist nun auch viel schlichter geworden und soll schnell und unkompliziert einen Überblick über meine Fotografie und meinen Aktivitäten im Netz geben. Feedback ist willkommen und ich bin gespannt ob die Seite gefällt.</p>
<p><a title="Webseite Tobias Zeising" href="http://www.aditu.de"><img class="alignnone size-full wp-image-365" title="Screenshot www.aditu.de" src="http://blog.aditu.de/wp-content/uploads/2010/02/screenshot-aditu.de_.png" alt="Screenshot www.aditu.de" width="518" height="288" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2010/02/06/neues-design-fur-meine-homepage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Neues Design für blog.aditu.de</title>
		<link>http://blog.aditu.de/2010/02/01/neues-design-fur-blog-aditu-de/</link>
		<comments>http://blog.aditu.de/2010/02/01/neues-design-fur-blog-aditu-de/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 13:35:55 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=312</guid>
		<description><![CDATA[Lange ist es her, dass ich etwas an meinem Blog verändert habe. Nun habe ich mich entschlossen meinen Blog von einem selbst entwickelten System auf WordPress umzustellen. Wenn auch das Backend ordentlich und ausbaufähig war, fehlt mir die Zeit den Blog zu erweitern und mit nützlichen Funktionen anzureichern. Hier macht es einen WordPress und die [...]]]></description>
			<content:encoded><![CDATA[<p>Lange ist es her, dass ich etwas an meinem Blog verändert habe. Nun habe ich mich entschlossen meinen Blog von einem selbst entwickelten System auf WordPress umzustellen. Wenn auch das Backend ordentlich und ausbaufähig war, fehlt mir die Zeit den Blog zu erweitern und mit nützlichen Funktionen anzureichern. Hier macht es einen WordPress und die große Auswahl an Plugins sehr einfach. Ich bin mir auch noch nicht sicher, was ich von dem Backend von WordPress halten soll. Doch die Vorteile überwiegen: gut testeter Code, komfortables Backend, leicht anzupassen, viele Plugins usw.</p>
<p>Natürlich bin ich mir im Design treu geblieben und habe den Grünton, der meine Webauftritte nun schon seit 10 Jahren begleitet übernommen. Es soll auch wieder schön schlicht sein und durch Einfachheit und Übersichtlichkeit bestechen. Natürlich darf auch ein stylischer Twitter Vogel (siehe ganz unten) nicht fehlen <img src='http://blog.aditu.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Wenn jemand eine Fehlfunktion findet oder mit etwas Probleme hat, dann bin ich über Feedback sehr dankbar. Gerade wenn man etwas neu einführt hackt es immer mal wieder an Details.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2010/02/01/neues-design-fur-blog-aditu-de/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Intrusion Detection mit PHPIDS</title>
		<link>http://blog.aditu.de/2010/01/30/intrusion-detection-mit-phpids/</link>
		<comments>http://blog.aditu.de/2010/01/30/intrusion-detection-mit-phpids/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 12:23:46 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Intrusion Detection]]></category>
		<category><![CDATA[PHPIDS]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=5</guid>
		<description><![CDATA[Eine große Sache bei der Entwicklung von Webapplikationen ist das Thema Sicherheit. Verfolgt man verschiedene Nachrichtendienste zum Thema Sicherheit, dann stellt man sehr schnell fest, dass zahlreiche Applikationen immer wieder kritische Sicherheitslücken aufweisen. Besonders wenn es sich um OpenSource Software handelt stellt das ein Problem dar, da ein Angreifer den Programmcode einer möglichen Opferapplikation kennt. [...]]]></description>
			<content:encoded><![CDATA[<p>Eine große Sache bei der Entwicklung von Webapplikationen ist das Thema Sicherheit. Verfolgt man verschiedene Nachrichtendienste zum Thema Sicherheit, dann stellt man sehr schnell fest, dass zahlreiche Applikationen immer wieder kritische Sicherheitslücken aufweisen. Besonders wenn es sich um OpenSource Software handelt stellt das ein Problem dar, da ein Angreifer den Programmcode einer möglichen Opferapplikation kennt.</p>
<p>Ein Blick in die Literatur offenbart einige grundlegende Bedrohungen, die immer wieder anzutreffen sind:</p>
<ul>
<li><strong>SQL Injection</strong>: fremde SQL Statements werden in die Opferapplikation eingeschleußt und von dieser ausgeführt</li>
<li><strong>Command Injection</strong>: Einschleusen (Injizieren) bösartiger Befehle zur Kompromittierung der Funktionsschicht</li>
<li><strong>Cross-Site Scripting</strong>: Einschleusen (Injizieren) von bösartigen Programmcode</li>
<li><strong>Directory Traversal</strong>: Technik um an nicht öffentliche, aber zugängliche Daten zu kommen</li>
<li><strong>Header Injection</strong>: Manipulation von dynamisch generierten Header</li>
<li><strong>Session Hijacking</strong>: Technik zur Übernahme einer fremden Session</li>
<li><strong>Session Fixation</strong>: Technik zur Session-Manipulation um Session des Angreifers zu privilegieren</li>
<li><strong>Cookie Poisoning</strong>: Manipulation von Cookies</li>
</ul>
<p>Eine sehr schöne Übersicht mit möglichen Gegenmaßnahmen zeigt hier das Buch &#8220;<em>Pro PHP Security</em>&#8221; von Chris Snyder und Michael Southwell auf (apress Verlag, ISBN: 1-59059-508-4).</p>
<h2>PHPIDS</h2>
<p><a title="PHPIDS" href="http://php-ids.org"><img src="wp-content/uploads/2010/01/25/phpids_logo.gif" alt="PHPIDS Logo" width="320" height="66" /></a></p>
<p>Vor einiger Zeit bin ich auf <a title="PHPIDS" href="http://php-ids.org/">PHPIDS</a> gestoßen, einem <a title="Wikipedia: Intrusion Detection System" href="http://de.wikipedia.org/wiki/Intrusion_Detection_System">Intrusion Detection System</a> für PHP. Dabei handelt es sich um ein Skript, das mittels regulären Ausdrücken und einem generischen Ansatz (Zentrifuge-Ansatz) die übergebenen Parameter (GET, POST, COOKIE, REQUEST) überprüft und mögliche Angriffe erkennt.</p>
<p>Ein erkannter Angriff wird mit einem &#8220;Impact&#8221; Wert gekennzeichnet, der angibt, wie schwerwiegend der Angriff ist. Ein Impactwert von 2-5 ist unbedenklich, wobei ein Impact 15 schon sehr hoch ist und eine Reaktion erfordert. Ein sehr hoher Wert (25-50) macht eine Reaktion unbedingt erforderlich. Dabei kommt PHPIDS auch mit exotischen Zeichensätze (UTF-7), JavaScript Unicode, dezimal und hexcode usw. zurecht und erkennt alle gängigen Angriffsmuster wie SQL Injection, Cross-Site Scripting Attacken oder Directory Traversal Zugriffe.</p>
<p>PHPIDS steht unter LGPL und kann unter <a title="PHPIDS" href="http://php-ids.org">http://php-ids.org</a> frei heruntergeladen werden.</p>
<h2>Arbeitsweise</h2>
<p>PHPIDS besitzt eine Liste von Filterregeln. Diese definieren reguläre Ausdrücke, welche gängige Angriffmuster erkennen. Dazu wird der Angriff mit einem Tag und einem Impactwert gekennzeichnet. Greifen mehrere Filterregeln, dann werden die einzelnen Impactwerte aufkummuliert. Um neue, unbekannte Angriffe zu erkennen, wird ein Zentrifuge-Ansatz verwendet, d.h. ist ein Parameter ein String von der Mindestlänge von 40 Zeichen, dann wird dieser String durch geschickte Zeichenersetzung auf eine repräsentative, kurze Zeichenkombination reduziert. Hierbei werden:</p>
<ol>
<li>alle Wortzeichen sowie Whitespace (berücksichtigt Unicode) entfernt</li>
<li>mehrfach vorkommende Zeichen werden gestrippt</li>
<li>bestimmte Zeichengruppen durch festgelegte Zeichen ersetzt (Ziel: Anzahl unterschiedliche Zeichen gering halten)</li>
<li>unerwünschte Zeichen (z.B. Backslash aus Magic-Quotes-Funktion) entfernt</li>
</ol>
<p>Das Ergebnis ist ein String aus 4 bis 6 Zeichen. Cross Site oder Code Injection Angriffe führen dabei erstaunlicherweise immer wieder auf ein ähnliches Muster. Taucht ein solches Muster (z.B. &#8220;((+::&#8221;) auf, so schlägt PHPIDS Alarm.</p>
<h2>Installation</h2>
<p>Die Installation ist denkbar einfach. In der zentralen Bootstrap Datei einer Applikation werden die PHPIDS Klassen geladen, alle Parameter als Array übergeben und das Ergebnis ausgewertet. Die Reaktion kann selbst ausgestalltet werden und kann von einfachen Logging (PHPIDS bringt hier bereits eine Hilfsklasse mit) bis hin zum Sperren der IP Adresse reichen.</p>
<p>Einbinden und Starten von PHPIDS:</p>
<pre class="brush: php;">
$request = array(
'REQUEST' =&gt; $_REQUEST,
'GET' =&gt; $_GET,
'POST' =&gt; $_POST,
'COOKIE' =&gt; $_COOKIE
);

require_once 'IDS/Init.php';
$init = IDS_Init::init('/IDS/Config/Config.ini.php');
$ids = new IDS_Monitor($request, $init);
$result = $ids-&gt;run();

// Angriff erkannt? Loggen und Abbruch
if (!$result-&gt;isEmpty()) {
	require_once 'IDS/Log/File.php';
	require_once 'IDS/Log/Composite.php';

	$compositeLog = new IDS_Log_Composite();
	$compositeLog-&gt;addLogger(IDS_Log_File::getInstance($init));
	$compositeLog-&gt;execute($result);

	die(&quot;ids error &quot;.$result-&gt;getImpact());
}
</pre>
<p>Hat die eigene Applikation keine Bootstrap Datei, so kann mit Hilfe der PHP Option &#8220;auto_prepend_file&#8221; eine Datei angegeben werden, die immer vor der eigentlichen PHP Datei geparst wird. Diese kann unter Apache auch in der .htaccess gesetzt werden:</p>
<pre class="brush: php;">
php_value auto_prepend_file phpids.php
</pre>
<p>phpids.php muss dann den oben stehenden Programmcode enthalten und PHPIDS ausführen.</p>
<p>Hat man beispielsweise einen Blog, wo tatsächlich HTML eingegeben und übertragen wird (z.B. in der Administrationsoberfläche beim Erstellen neuer Blogeinträge), so muss das PHPIDS hier bescheid wissen, da es sonst Alarm schlägt. Hierzu können in der Konfiguration Parameter festgelegt werden, die HTML enthalten dürfen. Ebenso schlägt PHPIDS bei der Verwendung von Google Analytics Alarm. Dieses ist zwar schon vorkonfiguriert, ich musste es aber immer nochmal für REQUEST und COOKIE konfigurieren:</p>
<pre class="brush: php;">
exceptions[]    = REQUEST.__utmz
exceptions[]    = REQUEST.__utmc
exceptions[]    = COOKIE.__utmz
exceptions[]    = COOKIE.__utmc
</pre>
<h2>Performance</h2>
<p>Natürlich hat PHPIDS auch eine Auswirkung auf die Performance der Applikation. Hier haben die Entwickler verschiedene Szenarien getestet und es hat sich gezeigt, dass PHPIDS lediglich 0,5 % der gesamten Rechenzeit benötigt, wenn z.B. von einer CakePHP Applikation ausgegangen wird. Selbst wenn man davon ausgeht, dass die Zahlen geschönt sind, ergibt sich aus meiner Sicht hier trotzdem kein Problem. Nimmt man beispielsweise einen privaten Weblog, der auf WordPress basiert, dann dürften sich hier die Besucherzahlen in Grenzen halten und das IDS nicht ins Gewicht fallen.</p>
<p>PHPIDS berücksichtigt das Performanceproblem bereits und verzichtet darauf z.B. den Zentrifuge-Ansatz auf kurze Strings anzuwenden. Zudem beschränkt es sich auf Strings: Integer Werte werden beispielsweise nicht geprüft. Wer trotzdem noch optimieren will, dem bietet PHPIDS ein Caching Mechanismus, so dass die Liste mit den Filterregeln nicht jedes mal neu geparst werden muss. Zudem liegen die Filterlisten nicht nur als XML Datei vor, sondern auch im JSON Format, welches bedeutend schneller geparst wird.</p>
<h2>Literatur und Links</h2>
<ul>
<li>c&#8217;t magazin 2009 Heft 10: Alarmanlage – Angriffe auf Webanwendungen mit PHPIDS erkennen, Christian Matthies, 27.04.2009</li>
<li>PHPIDS Webseite: <a title="PHPIDS" href="http://php-ids.org/">http://php-ids.org/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2010/01/30/intrusion-detection-mit-phpids/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einsamer Wolf Neuauflage</title>
		<link>http://blog.aditu.de/2009/10/04/einsamer-wolf-neuauflage/</link>
		<comments>http://blog.aditu.de/2009/10/04/einsamer-wolf-neuauflage/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 12:17:39 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Abenteuerspielbuch;Spielbücher]]></category>
		<category><![CDATA[Einsamer Wolf]]></category>
		<category><![CDATA[Joe Dever]]></category>
		<category><![CDATA[Lone Wolf]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=255</guid>
		<description><![CDATA[An der Stelle mal nach einiger Zeit wieder ein Beitrag, der etwas aus der Reihe tanzt und nichts mit Webentwicklung oder Fotografie zu tun hat. Vielleicht ist er aber doch f&#252;r den ein oder anderen interessant. Ich habe ja ungef&#228;hr vor einem Jahr bereits &#252;ber die Abenteuerspielbuchserie Einsamer Wolf geschrieben. F&#252;r alle Fans der Spielbuchserien [...]]]></description>
			<content:encoded><![CDATA[<p>An der Stelle mal nach einiger Zeit wieder ein Beitrag, der etwas aus der Reihe tanzt und nichts mit Webentwicklung oder Fotografie zu tun hat. Vielleicht ist er aber doch f&uuml;r den ein oder anderen interessant.</p>
<p>Ich habe ja ungef&auml;hr vor einem Jahr bereits &uuml;ber die Abenteuerspielbuchserie Einsamer Wolf <a href="2008/09/27/Abenteuer-Spielbuecher-Lone-Wolf" title="Abenteuer Spielb&uuml;cher Lone Wolf">geschrieben</a>. F&uuml;r alle Fans der <a href="http://de.wikipedia.org/wiki/Einsamer_Wolf" title="Einsamer Wolf bei Wikipedia">Spielbuchserien</a> aus den 80er gibt es nun eine Neuauflage. Der <a href="http://www.mantikore-verlag.de" title="Mantikore Verlag">Mantikore-Verlag</a> hat es sich auf die Fahne geschrieben alle B&uuml;cher der Serie nach und nach zu ver&ouml;ffentlichen. Der erste Band kam im April 2009 und der zweite Band ist seit diesem Monat zu haben.</p>
<p>Ich kann die B&uuml;cher nur empfehlen, den es handelt sich hier um ein ganz besonderes Lesevergn&uuml;gen. Besonders interessant sind die B&uuml;cher f&uuml;r alle, die auch die Originale aus den 80er gelesen haben: irgendwie ist es auch die pers&ouml;nliche Nostalgie, es ist wie eine Reise in die Vergangenheit. Beide B&uuml;cher enthalten neue Passagen, so wird beim ersten Band die Zerst&ouml;rung der Abtei genauer beschrieben. Der zweite Band soll ein zus&auml;tzlichen Handlungsstrang enthalten. F&uuml;r mich ist klar, dass ich mir alle B&uuml;cher der Serie holen werde. Besonders freue ich mich auf Band 13-32, die nie in deutscher Sprache ver&ouml;ffentlicht wurden.</p>
<p><a href="http://www.mantikore-verlag.de/index2.php"><img src="wp-content/uploads/2009/10/04/band1.jpg" alt="Einsamer Wolf Band 1" width="264" height="400" />&nbsp;<img src="wp-content/uploads/2009/10/04/band2.jpg" alt="Einsamer Wolf Band 2" width="264" height="400" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/10/04/einsamer-wolf-neuauflage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Poster und Prints</title>
		<link>http://blog.aditu.de/2009/08/23/poster-und-prints/</link>
		<comments>http://blog.aditu.de/2009/08/23/poster-und-prints/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 20:28:10 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Fotografie]]></category>
		<category><![CDATA[Poster]]></category>
		<category><![CDATA[Prints]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=239</guid>
		<description><![CDATA[Auch an dieser Stelle ein Hinweis: wer Poster von meinen Fotos haben will, der kann mir gerne direkt mailen: tobias.zeising@aditu.de. Einfach die gewünschten Fotos mit Größe angeben und ich gebe Bescheid was es kostet. Alle meine Fotos findet ihr auf meiner Homepage oder in meiner deviantArt Galerie.]]></description>
			<content:encoded><![CDATA[<p>Auch an dieser Stelle ein Hinweis: wer Poster von meinen Fotos haben will, der kann mir gerne direkt mailen: <a title="tobias.zeising@aditu.de" href="mailto:tobias.zeising@aditu.de">tobias.zeising@aditu.de</a>. Einfach die gewünschten Fotos mit Größe angeben und ich gebe Bescheid was es kostet.</p>
<p>Alle meine Fotos findet ihr auf meiner <a title="aditu.de" href="http://www.aditu.de">Homepage</a> oder in meiner <a title="ssilence.deviantart.com" href="http://ssilence.deviantart.com/gallery/#_popular">deviantArt Galerie</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/08/23/poster-und-prints/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moo MiniCards</title>
		<link>http://blog.aditu.de/2009/03/14/moo-minicards/</link>
		<comments>http://blog.aditu.de/2009/03/14/moo-minicards/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 19:38:18 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[MiniCards]]></category>
		<category><![CDATA[moo]]></category>
		<category><![CDATA[Visitenkarten]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=201</guid>
		<description><![CDATA[Manuela hat letzte Woche in ihrem Design-Blog &#252;ber die MiniCards von Moo geschrieben. Da konnte ich nicht widerstehen und musste mir auch sofort ein P&#228;ckchen holen. Ich find die kleinen Karten klasse, da man wirklich 100 verschiedene Motive w&#228;hlen kann und somit 100 individuelle Mini-Visitenkarten hat. Als Motiv habe ich nat&#252;rlich meine Fotos gew&#228;hlt und [...]]]></description>
			<content:encoded><![CDATA[<p>Manuela hat letzte Woche in ihrem <a href="http://www.surfgarden.de" title="Manuela Hoffmann">Design-Blog</a> &uuml;ber die <a href="http://de.moo.com/" title="Moo">MiniCards von Moo</a> <a href="http://www.surfgarden.de/blog/2009-03/moo-ich-durfte-testen/" title="Manuela Moo: Ich durfte testen">geschrieben</a>. Da konnte ich nicht widerstehen und musste mir auch sofort ein P&auml;ckchen holen. Ich find die kleinen Karten klasse, da man wirklich 100 verschiedene Motive w&auml;hlen kann und somit 100 individuelle Mini-Visitenkarten hat. Als Motiv habe ich nat&uuml;rlich meine <a href="http://www.aditu.de/photography/" title="Tobias Zeising Fotografie">Fotos</a> gew&auml;hlt und bin durchweg mit der Qualit&auml;t und Verarbeitung zufrieden. &Uuml;ber ein bequemes Web-Frontend kann man die Bilder hochladen, Fotos von flickr importieren und den endg&uuml;ltigen Ausschnitt mittels drag-n-drop w&auml;hlen. Alles geht also ziemlich einfach und schnell. Einziger Nachteil: wenn man Bilder direkt bei Moo hochl&auml;dt, kann man nur zwischen wenigen, vorgefertigten Avataren w&auml;hlen. Daher hab ich meine Fotos erst bei flickr hochgeladen und bei Moo den flickr import gew&auml;hlt, dann erscheint auch (optional) der eigene Avatar auf der R&uuml;ckseite.</p>
<p>Lange Rede, kurzer Sinn: ich kann die K&auml;rtchen nur empfehlen.</p>
<p><img src="wp-content/uploads/2009/03/14/minicards1.jpg" alt="Moo MiniCard" width="480" height="332" /></p>
<p><img src="wp-content/uploads/2009/03/14/minicards2.jpg" alt="Moo MiniCards" width="480" height="262" /></p>
<p><img src="wp-content/uploads/2009/03/14/minicards3.jpg" alt="Moo MiniCards" width="480" height="300" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/03/14/moo-minicards/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ein frohes neues Jahr 2009</title>
		<link>http://blog.aditu.de/2008/12/31/ein-frohes-neues-jahr-2009/</link>
		<comments>http://blog.aditu.de/2008/12/31/ein-frohes-neues-jahr-2009/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 22:01:54 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Silvester]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=175</guid>
		<description><![CDATA[Um in die Gl&#252;ckw&#252;nsche aller anderen Blogs einzustimmen, w&#252;nsche ich allen meinen Lesern und Besuchern einen guten Rutsch und ein erfolgreiches neues Jahr 2009 !!! Ich werde auch im neuen Jahr wieder &#252;ber interessantes aus dem Web berichten und hoffe Ihr seit wieder dabei. Gerne k&#246;nnt ihr auch eure Themenw&#252;nsche hier kommentieren. Ich freue mich [...]]]></description>
			<content:encoded><![CDATA[<p>Um in die Gl&uuml;ckw&uuml;nsche aller anderen Blogs einzustimmen, w&uuml;nsche ich allen meinen Lesern und Besuchern einen guten Rutsch und ein erfolgreiches neues Jahr 2009 !!!</p>
<p>Ich werde auch im neuen Jahr wieder &uuml;ber interessantes aus dem Web berichten und hoffe Ihr seit wieder dabei. Gerne k&ouml;nnt ihr auch eure Themenw&uuml;nsche hier kommentieren. Ich freue mich &uuml;ber jedes Feedback.</p>
<p><img src="wp-content/uploads/2008/12/31/fireworks.jpg" alt="Feuerwerk" width="400" height="307" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2008/12/31/ein-frohes-neues-jahr-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frohe Weihnachten</title>
		<link>http://blog.aditu.de/2008/12/23/frohe-weihnachten/</link>
		<comments>http://blog.aditu.de/2008/12/23/frohe-weihnachten/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 21:53:55 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Weihnachten]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=171</guid>
		<description><![CDATA[Ich w&#252;nsche euch allen (meinen treuen Leser und Besucher) frohe Weihnachten und entspannte und besinnliche Feiertage! Geniest die Zeit und vergesst nicht hier mal vorbei zu schauen. Eventuell werd ich die n&#228;chsten Tage wieder interessante Artikel schreiben. Sonst kommt am Ende noch Langeweile auf]]></description>
			<content:encoded><![CDATA[<p>Ich w&uuml;nsche euch allen (meinen treuen Leser und Besucher) frohe Weihnachten und entspannte und besinnliche Feiertage! Geniest die Zeit und vergesst nicht hier mal vorbei zu schauen. Eventuell werd ich die n&auml;chsten Tage wieder interessante Artikel schreiben. Sonst kommt am Ende noch Langeweile auf <img src='http://blog.aditu.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><img src="wp-content/uploads/2008/12/23/xmas.jpg" alt="Weihnachten" width="400" height="267" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2008/12/23/frohe-weihnachten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
