<?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>lemmingzshadow.net &#187; PHPIDS - lemmingzshadow.net - a webdevel&#039;s weblog</title>
	<atom:link href="http://lemmingzshadow.net/tag/phpids/feed/" rel="self" type="application/rss+xml" />
	<link>http://lemmingzshadow.net</link>
	<description>a webdevel&#039;s weblog</description>
	<lastBuildDate>Fri, 27 Apr 2012 20:35:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>jitt.cc &#8211; neue Funktion: Twitter Walls</title>
		<link>http://lemmingzshadow.net/166/jittcc-neue-funktion-twitter-walls/</link>
		<comments>http://lemmingzshadow.net/166/jittcc-neue-funktion-twitter-walls/#comments</comments>
		<pubDate>Sun, 10 May 2009 17:45:45 +0000</pubDate>
		<dc:creator>Lemmingz Shadow</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jitt.cc]]></category>
		<category><![CDATA[PHPIDS]]></category>
		<category><![CDATA[Websockets]]></category>

		<guid isPermaLink="false">http://lemmingzshadow.net/?p=166</guid>
		<description><![CDATA[Soeben habe ich das erste Update an meinem Websocket-Projekt jitt.cc live geschaltet. Ab sofort können neben der Public Timeline von twitter auch Walls &#8220;live&#8221; angeschaut werden. In Twitter-Walls werden nur Tweets gelistet welche einen bestimmten Suchbegriff enthalten. Neue Tweets erscheinen auch hier direkt ohne das der Client einen Reload o.Ä. machen muss. (Beispiel: http://jitt.cc/wall/simpsons/) Ansonsten [...]]]></description>
			<content:encoded><![CDATA[<p>Soeben habe ich das erste Update an meinem Websocket-Projekt <a href="http://jitt.cc">jitt.cc</a> live geschaltet. Ab sofort können neben der Public Timeline von twitter auch Walls &#8220;live&#8221; angeschaut werden. In Twitter-Walls werden nur Tweets gelistet welche einen bestimmten Suchbegriff enthalten. Neue Tweets erscheinen auch hier direkt ohne das der Client einen Reload o.Ä. machen muss. (Beispiel: <a href="http://jitt.cc/wall/simpsons/">http://jitt.cc/wall/simpsons/</a>)<br />
<span id="more-166"></span><br />
Ansonsten gab es noch ein paar interne Änderungen von denen man (hoffentlich) als Besucher nichts mitbekommt. Unter anderem habe ich die aktuelle Version von <a href="http://php-ids.org/">PHPIDS</a> integriert. Hier lasse ich ein Cache und die Logs in die Datenbank schreiben um zu sehen ob man so die Performance von PHPIDS noch etwas steigern kann. Natürlich macht sich das erst bemerkbar wenn das Projekt etwas an Fahrt aufgenommen hat. Ich werde dann darüber berichten.</p>
<p>Zum Schluss noch einmal der Hinweis: jitt.cc ist nach wie vor ein Testprojekt und es kann durchaus vorkommen, dass mal etwas nicht richtig funktioniert <img src='http://lemmingzshadow.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://lemmingzshadow.net/166/jittcc-neue-funktion-twitter-walls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPIDS im Praxistest</title>
		<link>http://lemmingzshadow.net/10/phpids-im-praxistest/</link>
		<comments>http://lemmingzshadow.net/10/phpids-im-praxistest/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 21:33:56 +0000</pubDate>
		<dc:creator>Lemmingz Shadow</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPIDS]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://lemmingzshadow.net/?p=10</guid>
		<description><![CDATA[Nachdem ich in letzter Zeit einiges über das Intrusion-Detection-System PHPIDS gelesen habe, habe ich es nun selbst einmal getestet. Hier meine bisherigen Erfahrungen: Testumgebung Für den Test habe ich Projekt genutzt welches sich derzeit noch in der Entwicklung befindet. Das Projekt liegt lokal auf einem Thinkpad T42 (1,7Ghz und 2GB Ram) in einer XAMPP-Umgebung mit [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich in letzter Zeit einiges über das Intrusion-Detection-System <a href="http://php-ids.org/">PHPIDS</a> gelesen habe, habe ich es nun selbst einmal getestet. Hier meine bisherigen Erfahrungen:</p>
<p><strong>Testumgebung</strong><br />
Für den Test habe ich Projekt genutzt welches sich derzeit noch in der Entwicklung befindet.<br />
Das Projekt liegt lokal auf einem Thinkpad T42 (1,7Ghz und 2GB Ram) in einer XAMPP-Umgebung mit XDEBUG.<br />
<span id="more-10"></span><br />
<strong>Installation / Integration</strong><br />
Zunächst müssen die PHPIDS-Dateien (es reicht das Verzeichnis &#8220;lib/IDS&#8221;) auf den Server geladen werden. Das Verzeichnis &#8220;IDS/tmp&#8221; benötigt Schreibrechte falls man dort Log- oder Cache-Files ablegen möchte. Anschließend  müssen in der Datei Config.ini (IDS/Config) ein paar Einstellungen angepasst werden. Die Datei ist selbsterklärend, ich habe jedoch nur die Pfade angepasst da ich für meinen Test auf Logging oder Caching in einer Datenbank verzichtet habe.</p>
<p>Die Integration von PHPIDS in ein bestehendes Projekt hängt natürlich sehr stark vom Projekt selbst ab. In meinem Testfall werden sämtliche Anfragen per mod_rewrite auf die Datei index.php umgeleitet. Dort wird unter anderem eine Klasse <em>security</em> instanziert welche verschiedene Methoden zur Input-Validierung enthält. Eine dieser Methoden (<em>validate_request</em>) wird bei jedem Aufruf des Projektes ausgeführt und ist somit der ideale Ansatzpunkt für PHPIDS.<br />
Das ist der hier relevante Teil der<em> security</em>-Klasse:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// include-path auf den Ordner mit IDS setzen:</span>
<span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'include_path'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/path/to/libs'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// IDS einbinden:</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'IDS/Init.php'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Array mit möglichen User-Inputs bilden:</span>
<span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'REQUEST'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_REQUEST'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'GET'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_GET'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'POST'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_POST'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'COOKIE'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_COOKIE'</span><span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// IDS initialisieren:</span>
<span style="color: #000088;">$init</span> <span style="color: #339933;">=</span> IDS_Init<span style="color: #339933;">::</span><span style="color: #004000;">init</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/path/to/libs/IDS/Config/Config.ini'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Caching ausschalten:</span>
<span style="color: #000088;">$init</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Caching'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'caching'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'none'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Request-Array analysieren:</span>
<span style="color: #000088;">$ids</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> IDS_Monitor<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #339933;">,</span> <span style="color: #000088;">$init</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ids</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">run</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Impact abfragen und ggf. reagieren:</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getImpact</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Hacking attempt detected. IP logged.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// include-path auf seinen ursprünglichen Wert zurücksetzten:</span>
<span style="color: #990000;">ini_restore</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'include_path'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Was hier passiert ist schnell erklärt:<br />
Es wird ein Array gebildet welches alle Variablen enthält die vom Benutzer beeinflusst werden können, etwa durch Formulareingaben oder Ähnliches. Der Inhalt dieses Arrays wird nun von PHPIDS auf mögliche Angriffsversuche untersucht. Mögliche Angriffe wären z.B. XSS oder SQL-Injection Attacken. Erkannte Angriffe werden von PHPIDS bewertet. Je &#8220;gefährlicher&#8221; oder &#8220;bedrohlicher&#8221; ein Angriff ist, desto höher ist der Impact-Wert. Im obigen Beispiel wird das Script sofort beendet sobald der Wert größer als 1 ist.</p>
<p><strong>Performance</strong><br />
Aufgrund vieler regulärer Ausdrücke u.Ä. ist PHPIDS sicherlich nicht extrem Performant, aber es ist auch nicht extrem langsam. In meinen Test gab es nur einen Angriff der PHPIDS quasi in die Knie gezwungen hat. (Genaueres weiter unten) Ob man dieses Tool nun auf einer High-Performance Webseite einsetzen kann ist schwer zu sagen. Hier kommt es sicherlich auf die Server, das Caching und viele andere Dinge an.<br />
Hier jedoch ein kurzer Vergleich der Methode validate_request mit und ohne PHPIDS (eingebunden wie oben beschrieben). Es handelt sich um einen einfachen Aufruf der Seite ohne dass irgendwelche Angriffe versucht werden.<br />
<a href='http://lemmingzshadow.net/files/2008/06/phpids_performance1.jpg' rel="facebox"><img src="http://lemmingzshadow.net/files/2008/06/phpids_performance1-150x150.jpg" alt="" title="phpids_performance1" width="150" height="150" class="alignnone size-thumbnail wp-image-11" style="float: left; margin: 5px;" /></a> <a href='http://lemmingzshadow.net/files/2008/06/phpids_performance2.jpg' rel="facebox"><img src="http://lemmingzshadow.net/files/2008/06/phpids_performance2-150x150.jpg" alt="" title="phpids_performance2" width="150" height="150" class="alignnone size-thumbnail wp-image-12" style="margin: 5px;" /></a></p>
<p>Bei Standard-XSS-Angriffsversuchen wie man sie z.B. <a href="http://ha.ckers.org/xss.html">hier</a> findet gehen die Zeiten leicht nach oben, bleiben aber immer im Rahmen. Hier das Ergebnis bei einem GET-Parameter mit folgendem Imhalt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;img SRC=&quot;javascript:alert('XSS');&quot;&gt;</pre></td></tr></table></div>

<p><a href='http://lemmingzshadow.net/files/2008/06/phpids_performance3.jpg' rel="facebox"><img src="http://lemmingzshadow.net/files/2008/06/phpids_performance3-150x150.jpg" alt="" title="phpids_performance3" width="150" height="150" class="alignnone size-thumbnail wp-image-13" style="margin: 5px;" /></a></p>
<p>Einen Fall konnte ich jedoch finden, bei dem PHPIDS stark einbricht. Es handelt sich um einen SQL-Injection Angriff der kürzlich verwendet wurde um Javascript auf vielen Webseiten einzuschleusen. <a href="http://www.heise.de/security/Hunderttausende-Webseiten-mit-schaedlichem-JavaScript-infiziert--/news/meldung/106959">(Artikel bei heise.de</a>)<br />
Wird der String aus diesem Angriff per GET-Parameter übergeben steigt die Prozessorlast extrem an und das Script braucht lange für die Ausführung. Verantwortlich dafür sind 164 Aufrufe der Funktion preg_match die extrem lange brauchen. In meinem Test waren es über 4000ms.<br />
<a href='http://lemmingzshadow.net/files/2008/06/phpids_performance4.jpg' rel="facebox"><img src="http://lemmingzshadow.net/files/2008/06/phpids_performance4-150x150.jpg" alt="" title="phpids_performance4" width="150" height="150" class="alignnone size-thumbnail wp-image-14" style="float: left; margin: 5px;" /></a> <a href='http://lemmingzshadow.net/files/2008/06/phpids_performance5.jpg' rel="facebox"><img src="http://lemmingzshadow.net/files/2008/06/phpids_performance5-150x150.jpg" alt="" title="phpids_performance5" width="150" height="150" class="alignnone size-thumbnail wp-image-15" style="margin: 5px;" /></a></p>
<p><strong>Fazit</strong><br />
PHPIDS ist ein sehr nützliches Hilfsmittel um viele Angriffe auf Webprojekte zu erkennen. Die Installation ist kinderleicht und auch bei der Integration in ein bestehendes Projekt sollte es keine größeren Probleme geben.<br />
Auf zwei Dinge möchte ich jedoch Hinweisen:<br />
1. PHPIDS ist ein System zur <strong>Erkennung</strong> von Angriffen, es ist nicht dazu da sie zu verhindern oder zu blockieren. Diese Aufgabe muss ein Entwickler selbst übernehmen.<br />
2. PHPIDS verwendet teilweise viele reguläre Ausdrücke welche resourcenhungrig sind. Bei High-Traffic Projekten sollte man deshalb ein Auge auf die Serverlast haben und sich das PHPIDS-Caching genauer anschauen.</p>
]]></content:encoded>
			<wfw:commentRss>http://lemmingzshadow.net/10/phpids-im-praxistest/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

