<?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>benjamin erhart &#187; http</title>
	<atom:link href="http://benjaminerhart.com/tag/http/feed/" rel="self" type="application/rss+xml" />
	<link>http://benjaminerhart.com</link>
	<description>web &#38; mobile dev / it sec</description>
	<lastBuildDate>Wed, 01 Feb 2012 15:41:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>HTTP Caching Einmaleins</title>
		<link>http://benjaminerhart.com/2011/02/http-caching-einmaleins/</link>
		<comments>http://benjaminerhart.com/2011/02/http-caching-einmaleins/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 00:28:37 +0000</pubDate>
		<dc:creator>tla</dc:creator>
				<category><![CDATA[Technik]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Page Speed]]></category>
		<category><![CDATA[YSlow]]></category>

		<guid isPermaLink="false">http://benjaminerhart.com/?p=550</guid>
		<description><![CDATA[Letzte Woche mußte ich in einem Kundensystem das Caching optimieren. Damit dieses Wissen nicht wieder verloren geht, habe ich dabei gleich mal die wichtigsten Grundlagen hier zusammengetragen.
Die wichtigsten Tools

	Firebug, Netzwerk Tab -&#62; zeigt Ladezeiten und Cache Hits
	Firbug Add-Ons machen Performance Analyse und geben viele gute Hinweise:

	Yahoo's YSlow (Erläuterungen)
	Google's Page Speed (Erläuterungen)



Die relevanten HTTP Header

Quelle: ...]]></description>
			<content:encoded><![CDATA[<p>Letzte Woche mußte ich in einem Kundensystem das Caching optimieren. Damit dieses Wissen nicht wieder verloren geht, habe ich dabei gleich mal die wichtigsten Grundlagen hier zusammengetragen.</p>
<h2>Die wichtigsten Tools</h2>
<ul>
<li><a href="http://getfirebug.com/network">Firebug, Netzwerk Tab</a> -&gt; zeigt Ladezeiten und Cache Hits</li>
<li>Firbug Add-Ons machen Performance Analyse und geben viele gute Hinweise:
<ul>
<li><a href="http://developer.yahoo.com/yslow/">Yahoo&#8217;s YSlow</a> (<a href="http://developer.yahoo.com/performance/rules.html">Erläuterungen</a>)</li>
<li><a href="http://code.google.com/intl/de/speed/page-speed/">Google&#8217;s Page Speed</a> (<a href="http://code.google.com/intl/de/speed/page-speed/docs/caching.html">Erläuterungen</a>)</li>
</ul>
</li>
</ul>
<h2>Die relevanten HTTP Header</h2>
<p><span id="more-550"></span><br />
Quelle: <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">HTTP/1.1 Header Field Definition</a></p>
<h3>Expires</h3>
<ul>
<li>Erklärt Ablaufdatum der Resource</li>
<li>Browser macht keinen Request mehr vor Ablauf dieses Datums</li>
</ul>
<h3>Cache-Control</h3>
<ul>
<li><em>public</em>: Aktiviert Proxy Caching und Caching im Firefox bei SSL Verschlüsselung</li>
<li><em>no-cache</em>: Deaktiviert Caching</li>
<li><em>no-store</em>: Keinerlei Speicherung, noch härter als &#8220;no-cache&#8221; (gedacht für Backups etc&#8230;)</li>
<li><em>max-age</em>: Ablaufzeit in Sekunden, redundant zu Expires</li>
<li><em>must-revalidate</em>: Immer Server fragen, ob Resource abgelaufen ist</li>
<li>(es gibt weitere, die vor allem für Proxies relevant sind)</li>
</ul>
<h3>Last-Modified</h3>
<ul>
<li>Erklärt letztes Änderungsdatum</li>
<li>Browser schickt einen <strong>If-Modified-Since</strong> Header beim nächsten Request</li>
<li>Server kann ein <em>403 Not Modified</em> zurückschicken, Browser nutzt Caching Daten</li>
</ul>
<h3>ETag</h3>
<ul>
<li>&#8220;Entity Tag&#8221;</li>
<li>Ist eindeutige ID bzw. Hash einer Resource</li>
<li>Apache verwendet z.B. dafür Last-Modified-Timestamp, Dateigröße und iNode ID, kann aber beliebig gewählt werden</li>
<li>Browser schickt einen <strong>If-None-Match</strong> Header beim nächsten Request</li>
<li>Server kann ein <em>403 Not Modified</em> zurückschicken, Browser nutzt Caching Daten</li>
</ul>
<h2>Erkenntnisse</h2>
<ul>
<li><strong>Expires</strong> und <strong>Cache-Control: max-age</strong> sind gut, um Anzahl der Requests zu drücken</li>
<li><strong>Last-Modified</strong> und <strong>ETag</strong> sind gut, um die Datenmenge zu reduzieren</li>
<li><strong>Expires</strong> und <strong>Cache-Control: max-age</strong> sind redundant, besser nur eins von beiden verwenden
<ul>
<li>Weniger HTTP Overhead</li>
</ul>
</li>
<li><strong>Last-Modified</strong> und <strong>ETag</strong> sind redundant, besser nur eins von beiden
<ul>
<li>Weniger HTTP Overhead</li>
<li>Wenn beides verwendet wird, muß auch beides geprüft werden!</li>
</ul>
</li>
<li>Optimales Caching: Resource muß nur ein einziges Mal geladen werden, dann keine weiteren Requests mehr
<ul>
<li><strong>Expires</strong> in Jahr in die Zukunft setzen</li>
<li>Wenn sich Resource ändert, URL ändern (z.B. mit Versionsnummer oder Hash)</li>
<li>Das geht nur, wenn das gesamte System (die Webapplikation) darauf ausgelegt ist!</li>
</ul>
</li>
</ul>
<h2>Diskussion</h2>
<p><strong>ETags</strong> sind in Applikationen etwas leichter zu handhaben als <strong>Last-Modified</strong> Timestamps, da ein einfacher Stringvergleich ausreicht. Timestamps müssen erst umständlich in <a href="http://de.wikipedia.org/wiki/Unixzeit">UNIX Epochen</a> umgewandelt und verglichen werden, bzw. durch aufwändige <a href="http://search.cpan.org/~drolsky/DateTime-0.66/lib/DateTime.pm">Klassen</a> gejagt werden.</p>
<p>Dabei sind sie flexibler zu handhaben &#8211; Ein ETag kann aus irgendwelchen Daten bestehen, nötigenfalls aus der Summe mehrerer Metadaten mehrerer Elemente.</p>
<p>Für einfache Szenarios (z.B. Bilder, die von der Applikation serviert werden) reicht als Seed für den ETag ironischerweise meist ein Timestamp einer Datei. Mehrere Seeds erhöhen den I/O oft unnötig, können jedoch im Zweifelsfall jederzeit leicht hinzugefügt werden.</p>
<p>Empfehlung von YSlow und Page Speed ist, immer ein <strong>Expires</strong> und/oder ein <strong>Cache-Control</strong> zu senden. Bei Resourcen, die sich jederzeit ändern <em>könnten</em>, fühlt sich das allerdings relativ nutzlos an. Der Selbstversuch bestätigt das erwartete Standardverhalten der Browser, immer beim Server nachzufragen, solange der Server nicht explizit ein <strong>Expires</strong> gesetzt hat. Von <a href="http://code.google.com/intl/de/speed/page-speed/docs/caching.html">öminösen Heuristiken</a> war nichts zu bemerken. Insofern verbrauchen diese Header bei derartigen Resourcen erst einmal nur Bandbreite.</p>
<p>Dennoch bin ich natürlich an guten Gründen interessiert, Expires und/oder Cache-Control bei Resourcen mit unbekanntem Ablaufdatum einzusetzen!</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://benjaminerhart.com/2011/02/http-caching-einmaleins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slowloris &#8211; neuer DoS Angriff auf Webserver</title>
		<link>http://benjaminerhart.com/2009/07/slowloris-neuer-dos-angriff-auf-webserver/</link>
		<comments>http://benjaminerhart.com/2009/07/slowloris-neuer-dos-angriff-auf-webserver/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 07:24:20 +0000</pubDate>
		<dc:creator>tla</dc:creator>
				<category><![CDATA[Technik]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[DoS]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[it-security]]></category>
		<category><![CDATA[it-sicherheit]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[slowloris]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://benjaminerhart.com/?p=75</guid>
		<description><![CDATA[Die Abkürzung DoS bedeutet "Denial of Service" - es handelt sich also um eine Attacke, die darauf abzielt, ein Ziel unerreichbar zu machen für echte Benutzer.

Robert Hansen hat ein neues Verfahren entwickelt, DoS Attacken auf Webserver (z.B. Apache) durchzuführen und dieses "Slowloris" genannt. Er beschreibt es ausführlich auf seiner Homepage http://ha.ckers.org/slowloris/

Dabei wird nicht ein ...]]></description>
			<content:encoded><![CDATA[<p>Die Abkürzung DoS bedeutet &#8220;Denial of Service&#8221; &#8211; es handelt sich also um eine Attacke, die darauf abzielt, ein Ziel unerreichbar zu machen für echte Benutzer.</p>
<p>Robert Hansen hat ein neues Verfahren entwickelt, DoS Attacken auf Webserver (z.B. <a href="http://de.wikipedia.org/wiki/Apache_HTTP_Server">Apache</a>) durchzuführen und dieses &#8220;Slowloris&#8221; genannt. Er beschreibt es ausführlich auf seiner Homepage <a href="http://ha.ckers.org/slowloris/">http://ha.ckers.org/slowloris/</a></p>
<p><img title="Weiterlesen..." src="http://netznomaden.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" />Dabei wird nicht ein übliches <a href="http://de.wikipedia.org/wiki/Flooding_(Informatik)">Flooding</a>, also eine Überhäufung des Webservers mit Anfragen, durchgeführt, sondern im Gegenteil ein recht langsamer Angriff, der  durch ein absichtliches Verlangsamen und Hinauszögern korrekter gültiger Anfragen dafür sorgt, daß er nach und nach sämtliche Requestlimits des Webservers belegt.<span id="more-75"></span></p>
<p>Das Gefährliche dabei ist, daß diese Art von Angriff kaum bemerkbar ist &#8211; in den Logdateien des Webservers tauchen keine merkwürdigen Einträge auf, denn die werden ja erst geschrieben, wenn die Anfrage fertig bearbeitet ist, bzw. fehlerhaft abbricht. Beides passiert hier aber nicht, es sind ja gültige Anfragen. Seeeehr langsaaaame.</p>
<p>Die Resourcen des Servers werden auch nicht übermäßig beansprucht, so daß in Monitoring Tools wie <a href="http://de.wikipedia.org/wiki/Munin_(Software)">Munin</a> und <a href="http://de.wikipedia.org/wiki/Cacti">Cacti</a> kaum Auffälligkeiten zu beobachten sind. Der Server muß im Gegenteil immer weniger tun, er wartet ja darauf, daß die Requests endlich einmal korrekt zu Ende gebracht werden.</p>
<p>Prozessorientierte Webserver wie Apache, dhttpd, GoAhead WebServer und Squid sind übrigens anfälliger: Sie erzeugen pro Request einen Prozess auf dem Server und limitieren die Anzahl derselben, um einen anderen Angriff zu verhindern: Daß der Webserver durch zu viele Requests die Resourcen der Hardware (v.a. RAM Speicher und Prozessorzeit) aufbraucht.</p>
<p>Außerdem scheint es einen Seiteneffekt zu geben: Bei Webapplikationen taucht zusätzlich das Problem auf, daß die Datenbank, die dort im Normalfall verwendet wird, noch weniger gleichzeitige Verbindungen akzeptiert, als der Webserver. Diese gibt also zuerst auf. Damit wird der Angriff noch effektiver, erzeugt dann allerdings schneller Fehlermeldungen, die denselben leichter identifizierbar machen.</p>
<p>Die gute Nachricht ist außerdem: Der Angriff wird durch geeignete Auswahl von <a href="http://de.wikipedia.org/wiki/Proxy_(Rechnernetz)#Reverse_Proxy">Reverse Proxies</a>, <a href="http://de.wikipedia.org/wiki/Load_Balancing">Load Balancern</a> u.ä. Strukturen verhindert, da diese Systeme eben meist nicht prozessorientert arbeiten &#8211; das ist allerdings nichts, was man normalerweise in kleinen Umgebungen vorfindet. Es dürfte also eine Menge gute Ziele da draußen geben!</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://benjaminerhart.com/2009/07/slowloris-neuer-dos-angriff-auf-webserver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

