<?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>Lieber Linux &#187; HTML</title>
	<atom:link href="http://www.lieber-linux.de/category/html/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lieber-linux.de</link>
	<description>Linux und Open Source Software im Blog</description>
	<lastBuildDate>Thu, 26 Jan 2012 17:58:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>HTML-Tabellen per Javascript sortieren lassen</title>
		<link>http://www.lieber-linux.de/2010/03/html-tabellen-per-javascript-sortieren-lassen/</link>
		<comments>http://www.lieber-linux.de/2010/03/html-tabellen-per-javascript-sortieren-lassen/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 18:20:39 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Tipp]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sortierung]]></category>
		<category><![CDATA[Tabelle]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=751</guid>
		<description><![CDATA[&#8230;Ich habe zulange gewartet &#8230;meine Schmerzgrenze war vielleicht zu hoch &#8230;aber heute tat ich diesen Schritt &#8230;und suchte nach &#8220;javascript sort table&#8221; &#8230;und die Lösung lag doch nur einen Steinwurf entfernt &#8230;und schmeichelte mit einer kinderleichten Installation &#8230;warum habe ich so lange gewartet?! Ich kann es nicht mehr nachvollziehen&#8230; Hier verkünde ich: Wer dieses tolle [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;Ich habe zulange gewartet &#8230;meine Schmerzgrenze war vielleicht zu hoch &#8230;aber heute tat ich diesen Schritt &#8230;und suchte nach &#8220;javascript sort table&#8221; &#8230;und die Lösung lag doch nur einen Steinwurf entfernt &#8230;und schmeichelte mit einer kinderleichten Installation &#8230;warum habe ich so lange gewartet?! Ich kann es nicht mehr nachvollziehen&#8230;</p>
<h3>Hier verkünde ich: Wer <span style="text-decoration: underline;"><a href="http://www.kryogenix.org/code/browser/sorttable/">dieses tolle Tool zum Sortieren von HTML-Tabellen</a></span> NICHT einsetzt, gehört zurückversetzt nach Klasse <strong>Web 0.9</strong>! So, basta!</h3>
<p>Ich möchte es nie mehr missen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2010/03/html-tabellen-per-javascript-sortieren-lassen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSL-Angriffe und ihre Abwehr</title>
		<link>http://www.lieber-linux.de/2009/03/ssl-angriffe-und-ihre-abwehr/</link>
		<comments>http://www.lieber-linux.de/2009/03/ssl-angriffe-und-ihre-abwehr/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 19:37:26 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Angriff]]></category>
		<category><![CDATA[Client]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[Man-in-the-middle]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=315</guid>
		<description><![CDATA[Wer auf seiner Webseite per SSL Inhalte vor unberechtigten Augen schützen möchte, ist zur Zeit mächtig gebeutelt: Jeden Tag hört man neue Schreckensmeldungen über Angriffsmethoden gegen den verschlüsselten Daten-Austausch zwischen Client und Server. Jetzt fragt man sich natürlich, ob SSL überhaupt noch sicher ist und wenn ja, mit welchen Methoden man sich und die Nutzer [...]]]></description>
			<content:encoded><![CDATA[<p>Wer auf seiner Webseite per <strong>SSL</strong> Inhalte vor unberechtigten Augen schützen möchte, ist zur Zeit mächtig gebeutelt: Jeden Tag hört man neue Schreckensmeldungen über Angriffsmethoden gegen den verschlüsselten Daten-Austausch zwischen <strong>Client</strong> und <strong>Server</strong>. Jetzt fragt man sich natürlich, ob <strong>SSL</strong> überhaupt noch sicher ist und wenn ja, mit welchen Methoden man sich und die Nutzer seiner <strong>Website</strong> schützt. Man muss dazu die vorgestellten Angriffsszenarien analysieren.</p>
<p><span id="more-315"></span></p>
<h3>Man-in-the-middle zwischen Client und Server</h3>
<p>Ersteinmal beziehen sich alle Angriffe auf eine Situation namens <strong><em>Man-in-the-middle</em></strong>. Das heißt, der Angreifer sitzt zwischen Nutzer und Server. Er muss also einen Rechner besitzen, der die Anfragen des Client mitliest, an den Server weiterleitet und später dessen Antwort an den Client vermittelt. Ein <strong>Proxy</strong>, <strong>Gateway</strong> oder <strong>Router</strong> erfüllt diese Voraussetzung. Nennen wir ihn einfach mal Proxy. Ohne diese Gegebenheit ist ein SSL-basierter Datenaustausch grundlegend sicher, das ist schon einmal ein guter Ausgangspunkt. Doch wie nutzt nun der Proxy seine Rolle aus?</p>
<p>Während des Datenaustausches zwischen Client und Server kann der Proxy zum Beispiel einen Login-Ablauf des Client am Server mitlauschen und nachspielen. Er tauscht dazu innerhalb einer <strong>HTML</strong>-Seite mit Verweis zum Login-Bereich alle Aufrufe von <em>https://meinhost.de/login.php</em> durch <em>http://meinhost.de/login.php</em> aus. Der Benutzer wechselt also beim Eintippen gar nicht in den HTTPS- (also SSL-)Modus &#8211; und gibt dem Angreifer die gewünschten Informationen per <strong>POST-Formular</strong> bekannt. Jetzt kann der Proxy die Daten dem Server übergebenÂ  &#8211; hier kann er verschlüsselt arbeiten &#8211; und dadurch sowohl Client als auch dem Server eine funktionierende, direkte Verbindung vortäuschen. Später kann er die Daten für Spionage nach Zahlungsdaten missbrauchen, verkaufen, vom Server aus weitere Angriffe im Namen des Clients starten oder darüber <strong>Spam</strong> versenden.</p>
<p>Wie kann man nun diesen Angriffen begegnen? Alle Ideen sind hier gefragt! Denn sollte sich herausstellen, dass die verschlüsselte, intime Kommunikation zweier Internet-Teilnehmer untereinander nicht gesichert ist, so ist das Fortbestehen sämtlicher netzbasierten Dienste in Frage gestellt. Zwar ist solch eine Proxy-Situation heutzutage noch sehr selten gegeben. Doch wenn die Möglichkeiten infolge des Problems erst einmal bekannt sind, wird sich das schnell ändern. Ein Angriff auf die Vertrauenswürdigkeit der Internet-Infrastruktur hat im Informationszeitalter durchaus katastrophale Folgen &#8211; eine Schande, warum <strong>DNS</strong> noch so schwächelt!</p>
<h3>Ideen sind gefragt</h3>
<p>Der wunde Punkt ist wohl das Wissen der Kommunikations-Partner übereinander. Was weiß der Client über den Server? Was weiß der Server über den Client, was er gegen den Angreifer nutzen kann? Leider ist ein Service, zum Beispiel ein Shop oder eine Plattform, grundsätzlich für jedermann offen und auch bisher unbekannte Gäste sind herzlich eingeladen, den Server zu kontaktieren. Doch gibt es etwas, was sie vom <em>Man-in-the-middle</em> unterscheidet?</p>
<p>Mir ist folgendes dazu eingefallen: Wir könnten dem Client signalisieren, er müsse auf die Verschlüssung achten. Zum Beispiel an verschiedenen Stellen darüber informieren, dass wir grundsätzlich sicher kommunizieren wollen. Der Nutzer soll doch darauf achten, dass immer das Verschlüsselungssymbol aktiviert ist. Der Angreifer müsste dann diverse Ausgabetexte manipulieren, um dessen Anzeige zu verhindern. Aber nicht jeder Benutzer liest Hinweise oder folgt diesen gar, zu lange war Software so unausgereift, sodass eine grundsätzliche Ignoranz gegenüber Fehlermeldungen festzustellen ist.</p>
<p>Damit würde man auch nur den Punkt der Nicht-Verschlüsselung der Proxy-Client-Verbindung beheben. Letztenendes könnte auch der Proxy selbst mit dem Client verschlüsselt kommunizieren, mit seinem eigenen <strong>Zertifikat</strong> natürlich. Wir können aber kaum erwarten, dass der Nutzer nach dem Aufbau der verschlüsselten Verbindung zum Proxy das übermittelte Zertifikat prüft.</p>
<p>Desweiteren könnte man die Verschlüsselung per <strong>JavaScript</strong> testen. Dazu ruft man nach dem Aufbau der Seite deren URL im Browser ab. Dessen Filterung wäre allerdings sehr einfach und nicht jeder Browser kommt mit JavaScript daher, wenn auch viele. Ich weiß gar nicht, ob es JavaScript-Funktionen zum Auslesen der Zertifikatinformationen gibt. Falls überhaupt, wäre ein einfacher Austausch der JavaScript-Funktionsnamen alles, was der Proxy tun müsste, um seine Tarnung aufrecht zu erhalten.</p>
<p>Eine Idee wäre weiterhin, immer in SSL zu kommunizieren. Da SSL immer auf eine <strong>IP-Adresse</strong> bezogen ist, wüsste der Proxy im Falle eines Multihosters von vornherein nicht, um welche <strong>Domain</strong> es sich handelt. Größere Webauftritte haben eher mehrere IPs für eine Domain, da wäre es wieder einfacher &#8211; eine leichte Verwirrung also nur für kleinere Seiten, das ist keine Lösung.Â  Was er definitiv nicht weiß, ist, um welche <strong>URI</strong>, also abgerufene Seite mit Parametern, es sich handelt. Er müsste also darauf setzen, dass eine Session zumeist in einer der Index-Dateien beginnt und an sich keine Parameter mit sich bringt. Mißtrauen wir also allen Besuchern einer Index-Seite? Das geht ebensowenig.</p>
<p>Da das Zertifikat jedoch definitiv nicht passt (es sei denn, es ist für Kollisionen manipuliert), würde der Browser beim Aufbau der SSL-Verbindung zumindest eine Warnung ausgeben. Na das ist ja schon mal etwas. Jetzt muss man nur noch a) den Nutzer dazu bringen, seine eigene URL immer im SSL-Modus zu bookmarken und b) dafür sorgen, dass SSL-Fehler-Warnungen ganz deutlich wahrgenommen werden. Letztlich ist die SSL-Methode weiterhin sicher, nur der Wechsel von HTTP auf HTTPS nicht, weil die Inhalte im HTTP-Modus manipulierbar sind.</p>
<h3>Theorie und Praxis</h3>
<p>Leider erlebt man jeden Tag den umgekehrten Weg: Statt wenigstens nach dem Login die Session verschlüsselt weiterzuführen, wechseln große Provider gerne mal nach dem Login-Prozedere zurück in den HTTP-Modus. Ist ja auch schneller. Dass sie dabei ihre Nutzer Gefahren aussetzen, wird dabei schnell mal in Kauf genommen. Zum Beispiel <strong>ebay</strong>. Was man da alles machen könnte &#8211; dazu braucht man nicht einmal als Proxy mit SSL arbeiten. Sogar in das eigene Konto kann man per HTTP wechseln! Sicherlich besteht die Seite aus sehr, sehr vielen Bildern, und die müssten alle per HTTPS einzeln abgerufen werden. Das kostet Kondition für Client und Server. Doch was nützt Geschwindigkeit ohne Integrität? Da kann ich gleich eine Seite aus <em>/dev/random</em> ziehen. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>In unserem <a title="ebrosia Wein-Shop" href="http://www.ebrosia.de">ebrosia Wein-Shop</a> ist eine Bestellung oder das Betreten des Konto-Bereichs ohne HTTPS-Modus gar nicht möglich. Selbst wenn man als Nutzer aus <strong>https://</strong> ein <strong>http://</strong> macht &#8211; unser Shop verlangt einfach die Verschlüsselung und korrigiert es entsprechend. Natürlich ist das heute keine Garantie gegen eine <em>Man-in-the-middle</em>-Attacke. Dazu müssten wir unsere Nutzer zu reinen SSL-Nutzern erziehen. Doch wenn es nötig sein sollte, wird das getan werden. Wir als Service-Betreiber sind das unseren Nutzern einfach schuldig.</p>
<h3>Fazit</h3>
<p>Nun, mit durchgehender Verschlüsselung wäre schon ein großer Schritt getan. Wenn wir jetzt noch einen Weg fänden, Server-initiiert das eigene Zertifikat auf Seiten des Nutzers zu prüfen, könnten wir den Proxy aus dem Rennen zu werfen&#8230;hat dazu jemand eine Idee? Vielleicht braucht man einen dritten Host, der das Geschehen von außen beobachten kann?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2009/03/ssl-angriffe-und-ihre-abwehr/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Warum es immer neue Sicherheitslücken gibt</title>
		<link>http://www.lieber-linux.de/2008/10/sicherheit-luecken/</link>
		<comments>http://www.lieber-linux.de/2008/10/sicherheit-luecken/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 20:18:06 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=160</guid>
		<description><![CDATA[Heute war es wieder soweit: Das sogenannte Clickjacking wurde als neueste Sicherheitslücke bekannt, vor dem sich der Internet-Nutzer fürchten muss. Doch warum gibt es immer wieder neue Sicherheitslücken? Hier überlagern sich meines Erachtens mehrere Teilprobleme: Technologie-Wandel: Die Welt ist im stetigen Wandel. Software bildet aber immer nur einen Snapshot, einen momentanen Wissenstand ab. Was zukünftig [...]]]></description>
			<content:encoded><![CDATA[<p>Heute war es wieder soweit: Das sogenannte <a href="http://www.heise.de/open/Clickjacking-Jeder-Klick-im-Browser-kann-der-falsche-sein--/news/meldung/117055">Clickjacking</a> wurde als neueste Sicherheitslücke bekannt, vor dem sich der Internet-Nutzer fürchten muss.</p>
<h3>Doch warum gibt es immer wieder neue Sicherheitslücken?</h3>
<p>Hier überlagern sich meines Erachtens mehrere Teilprobleme:</p>
<ol>
<li>Technologie-Wandel: Die Welt ist im stetigen Wandel. Software bildet aber immer nur einen Snapshot, einen momentanen Wissenstand ab. Was zukünftig damit zu verarbeiten ist, ist bei Erstellung der Software unklar.</li>
<li>Die Kommerzialisierung der Netzkultur fordert ihre Opfer: Das Netz wird zum Angriffsziel derer, die nicht zur Loge seiner offiziellen Beherrscher gehören. Im Zeitalter der Information ist der Besitz von Daten, Servern, Technologien wie auch das Wissen zur Manipulation und Zerstörung von Infrastruktur bares Geld wert.</li>
<li>Die Geschwindigkeit, in der Software erstellt, konsumiert (benutzt) und entsorgt wird, ist gegenüber traditionellen Produkten unvergleichbar erhöht. Die Kosten durch Schaden aus Software-Fehlfunktionen wird weiterhin unterschätzt &#8211; Software macht ja (zunächst) nichts wirklich kaputt. Aus diesem Kreativitätsdruck heraus wird viel zu unreife Software auf den Markt geworfen: Früher oft Bananensoftware &#8211; reift beim Kunden &#8211; genannt, findet im Netz seine Fortsetzung in der beta-Kultur des Web 2.0.</li>
<li>Die Schnittstellen von verschiedenen technologischen Bereichen sind inkompatibel. An diesen Reibepunkten entstehen Konvertierungsverluste, die nur mit ungemein hohem Aufwand optimal unterdrückt werden können. Gerade hier wird oft die 80:20-Regel der Softwareerstellung zugunsten der schnellen 80%-Funktionalität vorgezogen: Es funktioniert, im Prinzip, wenn man es so oder so benutzt. Ein Beispiel: Desktop und Netz. Sie funktionieren anders und sind für andere Daten konzipiert. Ein Übergang Netz -&gt; Desktop oder Desktop -&gt; Netz ist extrem fehleranfällig.</li>
<li>Software ist nicht immer frei. Unfreie Software kann weder von Sicherheitsexperten begutachtet, noch von so vielen freiwilligen Helfern verbessert werden. Firmen glauben leider immer noch an das Mysterium Software-Monopol. Aber das weiß der geneigte Leser dieses Blogs sicherlich besser&#8230; <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ol>
<p>In eingangs genannten Fall sind</p>
<ul>
<li>die Sicherheitsfunktionen der Browser auf dem Stand der Netzangriffe vor Erstellung der jeweiligen Version</li>
<li>der Flash-Player eine proprietäre unkontrollierbare Software</li>
<li>die Schnittstelle zwischen HTML und Flash mehr als unausgereift und nicht standisiert</li>
<li>die Rückverfolgbarkeit von Angriffen auf das eigene System nur für Experten machbar</li>
</ul>
<p>Man kann nur hoffen, dass der kommende Standard von HTML 5.0 unter Webentwicklern angenommen und durch die Integration von Ogg Theora und SVG die Verbreitung binärer Plugins eingedämmt wird.</p>
<p>just my 2 cents</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2008/10/sicherheit-luecken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problem mit T-Online Browser erkannt</title>
		<link>http://www.lieber-linux.de/2008/10/problem-mit-t-online-browser-erkannt/</link>
		<comments>http://www.lieber-linux.de/2008/10/problem-mit-t-online-browser-erkannt/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 15:03:20 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[AOL]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Client]]></category>
		<category><![CDATA[Cookie]]></category>
		<category><![CDATA[Hijacking]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Session]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[T-Online]]></category>
		<category><![CDATA[TOB]]></category>
		<category><![CDATA[User-Agent]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=152</guid>
		<description><![CDATA[Shops und Foren gegen Session-Hijacking zu schützen ist kein leichtes Spiel. Vor allem, wenn an anderer Stelle ebenso Datenschutz betrieben wird, zum Beispiel beim Internet-Provider oder beim Browser...]]></description>
			<content:encoded><![CDATA[<p>Dieser Beitrag bezieht sich auf einen früheren Artikel unter <a title="PHP Session-Problem mit dem T-Online Browser" href="http://www.lieber-linux.de/2008/08/php-session-problem-mit-dem-ie-tob-605/" target="_self">http://www.lieber-linux.de/2008/08/php-session-problem-mit-dem-ie-tob-605/</a>.</p>
<p>Ich habe nun endlich das Problem, welches viele T-Online-Kunden beim Surfen auf so vielen Portalen haben, erkannt. Schuld ist der Browser selbst (Oh, welch Wunder!), der seine User-Agent-Kennung nach Lust und Laune wechselt!</p>
<p><span id="more-152"></span></p>
<p>So meldet sich der T-Online-Browser zunächst in dieser Form:</p>
<pre>Mozilla/4.0 (compatible; MSIE 6.0; TOB 6.05; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)</pre>
<p>Später erscheint folgende Kennung am Server:</p>
<pre>Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)</pre>
<p>Wie man sieht, wurde die spezielle T-Online-Kennung &#8221; TOB 6.05;&#8221; in den späteren Clicks entfernt. Dies scheint ein nicht seltenes Phänomen zu sein, wenn ich unsere Logs richtig interpretiere. So liegt die durchschnittliche Click-Anzahl eines TOB-Surfers zwischen 1 und 2, d.h. die Session ging meist zwischen dem 1. und 2. Click verloren. Das ist nicht nur ärgerlich, das ist einfach katastrophal für jeden sicherheitsbewussten Webserver-Administrator.</p>
<h3>Das Problem mit der Browser-Kennung</h3>
<p>Viele Portale bieten Login-basierte Services an. Durch diese personalisierte Interaktion entstehen jedoch sensible, d.h. vertrauliche, Daten. Die Portale müssen daher sicherstellen, dass diese Daten nur der entsprechende Benutzer und ansonsten kein anderer Mensch der Welt sieht. Dabei verlassen sich Web-Applikationen unter anderem auf die Browser-Kennung des Gegenübers als eines von vielen Sicherheitsmerkmalen, um eine aktive Sitzung einem Kunden zuverlässig zuweisen zu können. Damit soll das sogenannte Session-Hijacking verhindert werden.</p>
<h3>Session-Hijacking im Details</h3>
<p>Session-Hijacking bedeutet das Kapern von aktiven Sitzungen eines Benutzers durch fremde Angreifer ohne Kenntnis von Passwörtern oder Login-Daten. Vielmehr zielt der Angreifer auf einen Sitzungsschlüssel, der vom Webserver zufällig für eine Sitzung als Schlüssel (Session-Key) erzeugt wird. Dabei wird die Tatsache ausgenutzt, dass Web-Server nur eine begrenzte Anzahl von Session-Keys generiert werden können, denn die Schlüssel sind immer 32-stellig und hexadezimal.</p>
<p>Durch genügendes Probieren kann bei einem sehr frequentierten Server in hinreichender Zeit ein aktiver Schlüssel entdeckt werden. Normalerweise wird der Schlüssel per Session-Cookie weitergegeben. Jedoch erlauben nicht alle Browser das Setzen eines Cookies, sodass die Weitergabe in der URL als Fallback-Methode häufig angeboten wird. Dort kann der Angreifer ansetzen und zufällige Session-Keys in hoher Geschwindigkeit durchprobieren. Hat er gar Kenntnis über die Existenz eines aktiven Session-Keys, so kann er mit deren Hilfe versuchen, die entfernte Sitzung zu übernehmen. Der betroffene Nutzer bekommt dies nicht unbedingt zu spüren.</p>
<h3>Prävention: Die IP-Adresse</h3>
<p>Neben der Browser-Kennung ist zum Beispiel die IP eine gute Methode, um Session Hijacking zu verhinden. Diese ist für einen Rechner im Internet eindeutig, allerdings nur für die Zeit der aktiven Nutzung, was in diesem Falle reicht. Durch die Knappheit der IP-Adressen halten Provider einen gewissen Pool von IP-Adressen bereit, von denen bei der Einwahl eine mehr oder weniger zufällig vergeben wird.</p>
<p>Allerdings ist hier Vorsicht geboten, da viele Nutzer hinter Web-Proxies surfen, die ihn in gewisserweise anonymisieren. Dies ist dem Surfer nicht immer bekannt, da große Zugangsprovider oft eigenes transparentes Proxy-Caching betreiben. In diesem Fall liegen viele Nutzer hinter nur einer sichtbaren IP-Adresse. Proxies können diese Weiterleitung über die HTTP-Header-Felder X_FORWARDED_FOR oder CLIENT_IP_ADRESS bekanntmachen. Doch die Angaben sind optional (ohne Gewähr) &#8211; verlassen kann man sich also darauf nicht.</p>
<p>Daneben gibt es fast überall lokale Netze (LANs), deren Benutzer alle mit der IP des Zugangsrechners (Gateways) surfen. Wenn wie in Firmen durch Standardisierung gleiche technische Bedingungen vorliegen, in dem Betriebssysteme und Browser vorgegeben werden, so erscheinen dem Server alle Benutzer dieses Netzwerks wie ein identischer Client.</p>
<p>Daneben kann es passieren, dass Zugangsprovider Proxying mit wechselnden End-IP-Adressen durchführen. AOL ist dafür bekannt. Dies erschwert dem Server, eine Session zumindest einer IP zuzuordnen. Um den Nutzer nicht zu verlieren, müssen Sub-Netze für die Weitergabe der Session erlaubt werden, doch selbst Class-B-Netze (zB. 123.5.xxx.xxx) werden hier oft verlassen.</p>
<h3>Fazit: Mißtrauen ist gut, Kontrolle nicht möglich</h3>
<p>In dieser Situation einen Spagat zwischen Kundendaten-Sicherheit wie den Schutz eingegebener Kreditkartendaten und das Angebot nutzerfreundlicher Sites hinzubekommen, fällt schwer. Was der Datenschutz auf der einen Seite richtig macht (das anonymisierte Surfen), erschwert den Datenschutz des Benutzers an anderer Stelle, nämlich in Online-Shops, Foren, Chat-Rooms oder Email-Services &#8211; überall dort, wo ein Login mehr als einen Click halten muss.</p>
<p>Letztendlich ist eine Sicherheitslücke wohl von schwererem Ausmaß als der Verlust einer Session &#8211; denn diese kann mit einem anderen Browser wiederholt werden. Daher gilt in meinen Augen folgende Regel: Strikte Prüfung des Logins und Vorbeugung von Session-Hijacking &#8211; kombiniert mit Empfehlungen (zB im Fehlerfall anderen Browser vorschlagen), die dem Surfer die Vertraulichkeit seiner eigenen Daten bewusst macht. Nur dies schafft langfristigen Datenschutz!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2008/10/problem-mit-t-online-browser-erkannt/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>CSS: Combined Class Selector</title>
		<link>http://www.lieber-linux.de/2008/09/css-combined-class-selector/</link>
		<comments>http://www.lieber-linux.de/2008/09/css-combined-class-selector/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 09:47:47 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Selector]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=115</guid>
		<description><![CDATA[Hallo Leute, ein leichtes Grinsen kann ich nicht unterdrücken: Endlich habe ich die Möglichkeit entdeckt, Elementen mit mehreren Klassen mit nur *einem* Selektor Formatierungen zuzuweisen. Das musste doch irgendwie gehen! Man braucht im CSS nur die beiden Klassen direkt nacheinander angeben, à la: div.klasse1.klasse2 { text-align:right; } Danach habe ich schon immer gesucht, denn es [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo Leute, ein leichtes Grinsen kann ich nicht unterdrücken: Endlich habe ich die Möglichkeit entdeckt, Elementen mit mehreren Klassen mit nur *einem* Selektor Formatierungen zuzuweisen. Das musste doch irgendwie gehen!</p>
<p>Man braucht im CSS nur die beiden Klassen direkt nacheinander angeben, à la:</p>
<pre>div.klasse1.klasse2 {
  text-align:right;
}</pre>
<p>Danach habe ich schon immer gesucht, denn es erlaubt letztendlich so etwas wie Mehrfachvererbung in objektorientierten Programmiersprachen: Das saubere Trennen verschiedener Funktionalitätsbereiche in Klassen und deren Vereinigung in einer konkreten Instanz. Sozusagen C++ statt Java. Funktioniert übrigens ab CSS 2.</p>
<p>Klar, denkt ihr vielleicht, hätte man ja einfach mal probieren können. Aber bei den diversen Browser-Bugs vor allem in Hinblick auf CSS hüte ich mich davor, von Browsern rückwärts auf den Standard zu schließen! <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2008/09/css-combined-class-selector/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML widgets: Auf jeden Fall trendy</title>
		<link>http://www.lieber-linux.de/2008/08/html-widgets-auf-jeden-fall-trendy/</link>
		<comments>http://www.lieber-linux.de/2008/08/html-widgets-auf-jeden-fall-trendy/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 12:19:32 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Widgets]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=68</guid>
		<description><![CDATA[Als Xing-Nutzer kenne ich Facebook nicht, aber es soll ja unter anderem dadurch glänzen, dass man sich tolle Widgets zusammenklicken kann. Bis auf die Tatsache, dass dies eine weitere Welle von Mashups und Re-re-re-sampling bestehenden Contents ist (Juhu!), ist es aber auch eine wirklich praktische Sache: Anstatt 12 Websites zu besuchen und sich alle gewünschten [...]]]></description>
			<content:encoded><![CDATA[<p>Als Xing-Nutzer kenne ich Facebook nicht, aber es soll ja unter anderem dadurch glänzen, dass man sich tolle Widgets zusammenklicken kann. Bis auf die Tatsache, dass dies eine weitere Welle von Mashups und Re-re-re-sampling bestehenden Contents ist (Juhu!), ist es aber auch eine wirklich praktische Sache: Anstatt 12 Websites zu besuchen und sich alle gewünschten Infos mühsam zusammenzusuchen, stellt man eine Seite aus eben diesen Fragmenten zusammen und mit einem Blick (oder auch 12 Mini-Blicken) hat man alles, was das Gehirn begehrt, erfasst und evtl. auch verstanden.</p>
<p>Jeder aktive Webmitmacher möchte natürlich auch solche Teilchen anbieten. Und der <a title="ebrosia" href="http://www.ebrosia.de">Weinshop</a>, für den ich arbeite, gehört dazu. Also habe ich mal kurz zusammengesucht, wie das ganze funktioniert und dabei festgestellt: Für den Programmierer wie mich gibt es anscheinend zwei Strömungen dieser Widgets: Erstere laufen als komplett eigenständige Mini-Site und werden über object- oder iframe-Tags eingebunden, während eine weitere Gattung per JavaScript im Ziel-Dokument dynamisch aufgebaut werden. Beides hat seine Vor- und Nachteile. Was ist also besser? Jeder muss selbst entscheiden. Der folgende Vergleich ist sicherlich nicht vollständig, aber vielleicht für den ein oder anderen hilfreich.</p>
<p><span id="more-68"></span>Die im object oder iframe eingebundenen Sites haben eine größere Unabhängigkeit vom Dokument. Sie laufen wie in einer Art Schaufenster. Dabei haben Sie einen eigenen Namespace für JavaScript und können durch andere Elemente des Dokuments nicht berührt werden. Das ist in meinen Augen zunächst ein Vorteil, vor allem was die Stabilität und Sicherheit anbelangt. Durch die Separierung kann man es jedoch nicht mit anderen Elementen interagieren lassen &#8211; also bieten sich damit funktionell weniger Möglichkeiten. Man braucht eigentlich auch nicht einmal JavaScript dafür (Vorteil) und kann auch per Ajax direkt mit dem Widget-Server kommunizieren und die eigene Widget-Seite beliebig manipulieren (Vorteil). Ein Nachteil ist, dass es schwierig ist, das Teilchen persönlich zu gestalten. Dazu ist oft Vorarbeit auf dem Widget-Server (also ein Login und die lästige Konfiguriererei) notwendig. Ein Beispiel dieser Art ist Youtube.</p>
<p>Zweitere Art arbeitet im DOM des Ziel-Dokuments und wird meist per JavaScript eingebunden. Hier braucht man keine komplette Seite zu generieren und kann sich gleich auf die klitzekleinen Elemente konzentrieren (Vorteil). Allerdings muss man die globalen JavaScript-Variablen des aktuellen Dokuments beachten (Nachteil) und ist soweit ich weiß nicht in der Lage, Ajax-Requests an den externen Server abzusetzen &#8211; korrigiert mich, sollte ich hier falsch liegen. Ein weiterer Nachteil ist, dass das parallele Laden des gesamten Dokuments jeweils pro externem Widget-Script geblockt wird. Mit jedem zusätzlichem Widget wird also die Performance immer schwächer. Hier gibts sehr viele Beispiele dafür, eins ist Google&#8217;s Adsense.</p>
<p>Für alle, dies genauer wissen wollen, gibt in Englisch <a title="QuarkRuby: Writing a web widget" href="http://www.quarkruby.com/2008/1/7/widget/comments/5138#comment-5138">diese Seite</a> zu empfehlen. Hier wird auch zwischen passiven, aktiven, JavaScript- und JSON-Widgets unterschieden wird. Ich denke jedoch: Wie dann am Ende gescriptet wird, hängt eher vom Widget-Zweck selbst ab. Aber die Code-Schnipsel sind auf jeden Fall auch ne coole Sache.</p>
<p>In nächster Zukunft werden wir an ein paar Widgets arbeiten, die unseren Kunden und Partnern erlauben werden, die nützlichen Helferlein für unsere Spezial-Angebote wie Tages- und Monatsaktionen einzublenden. Wenn diese fertig gestaltet sind, kann ich diese hier noch schnell einbauen &#8211; dafür sind sie ja geradezu geschaffen. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Das bringt mich auf eine Idee: In Zukunft hat jeder nur noch solche Mini-Homepages, die man als Signatur überall hinterlässt, so entfällt das lästige &#8220;Hey, check mal meine Seite aus&#8230;&#8221;. Allerdings kann ich mir vorstellen, dass das zu einer riesigen Traffic-Implosion führt: Irgendwann gibt es nämlich DAS RIESEN-DOKUMENT, deren Aufruf ALLE Websites mit aufruft, eingeschlossen SICH SELBST. Somit hat die Menschheit den Urknall 2.0 selbst geschaffen !!!  Die Tragik ist, dass in der Universalbibliothek in entfernter Zukunft zu lesen sein wird, dass die ausgestorbene Spezies Homo sapiens sapiens es leider nie schaffte, das Web 3.0 fertigzustellen. Aber sie waren wohl auf jeden Fall trendy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2008/08/html-widgets-auf-jeden-fall-trendy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>World Wide Web 2.0</title>
		<link>http://www.lieber-linux.de/2007/09/world-wide-web-20/</link>
		<comments>http://www.lieber-linux.de/2007/09/world-wide-web-20/#comments</comments>
		<pubDate>Fri, 07 Sep 2007 12:19:22 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Intranet]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=14</guid>
		<description><![CDATA[Also ich bin ja bekannt dafür, nicht viel von Web 2.0 zu halten. Umso erstaunlicher, dass ich selbst seit einigen Tagen an einer Web 2.0 Seite im Intranet unserer Firma bastle. Und ich muss zugeben, Web 2.0 hat etwas. Am erfreulichsten fand ich die Tatsache, dass man keinen Installationsaufwand hat. Man braucht weder Servlet-Container, Apache-Module [...]]]></description>
			<content:encoded><![CDATA[<p>Also ich bin ja bekannt dafür,  nicht viel von Web 2.0 zu halten.</p>
<p>Umso erstaunlicher, dass ich selbst seit einigen Tagen an einer Web 2.0 Seite im Intranet unserer Firma bastle. Und ich muss zugeben, Web 2.0 hat etwas.</p>
<p><span id="more-14"></span></p>
<p>Am erfreulichsten fand ich die Tatsache, dass man keinen Installationsaufwand hat. Man braucht weder Servlet-Container, Apache-Module noch irgendwelche anderen Erweiterungen auf dem Server, sondern alles läuft auf der Programmier-Ebene ab. Zumindest die technische Seite von Web 2.0 kann auf folgenden Satz reduzieren: Man instanziiert eine Javascript-Klasse namens XMLHttpRequest, führt über die Methoden open() und send() einen asynchronen Request aus und verarbeitet dessen Response auf der bestehenden Seite. That&#8217;s it.</p>
<p>Klar, neben dem Request ist vor allem der JS-Code das schwierigste, um den per Response erhaltenen Content ordentlich auf der bestehenden Seite einzubauen. Hier bin ich bisher komplett ohne XML oder XSLT gefahren (also AJ statt AJAX), habe den Response in Stino-HTML erzeugt und einfach in ein dafür angelegtes Seiten-Element als innerHTML reingeworfen. Im Response eingebaut war dann auch schon der Code, um diesen per JS-Aufrufe weiter an andere Elemente zu verteilen. Mit etwas Nachdenken kann man hier mit ein, zwei Übergabeparametern (Element-ID&#8217;s, Präfixe) wunderbar generisch arbeiten, so dass sowohl die erstellte Request-Technologie als auch der Management-Code ausgelagert und für mehr als nur eine Seite nutzbar gemacht werden können.</p>
<p>Man kann also ganz klein und leicht beginnen, sich ein paar generische Abfragen und eine JS-Skript-Datei erstellen und schon hat man neue, interessante Werkzeuge, die man sogar noch ganz leicht in bestehende Seiten einbauen kann. Damit das ganze flüssig läuft, habe ich die Indizes unserer Tabellen auf die Abfragen hin ergänzt. Der Faktor der Beschleunigung betrug etwa 2 bis 3! Die schnellen Abfragen ohne JOIN machen dann auch richtig Spaß &#8211; es flutscht einfach mal. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Der einizige Nachteil ist natürlich: Der Anwender braucht Javascript! Und der Browser muss auch noch der Site vertrauen. IE7-Nutzer müssen die Seite also evtl. explizit eintragen. Daneben braucht der Nutzer evtl. noch Session-Cookies, damit man mit PHP auch noch die Ergebnise bequem weiterverarbeiten kann, ohne sich die Finger wund zu coden. Im firmeneigenen Intranet ist das alles weniger kritisch, hier kann man die Anforderungen selbst abschätzen/austesten, definieren und für alle verbindlich umsetzen.</p>
<p>Als nächstes gehts weiter mit der Praxistauglichkeit. Wie skaliert das ganze, wenn es auf einem stark frequentiertem Server läuft? Wie stark sind die Latenzen des Netzes? Sollte sich herausstellen, dass flüssiges Arbeiten möglich ist, eröffneten sich uns dadurch ganz neue Möglichkeiten, vor allem bei der Einbindung externer Partner.</p>
<p>Also schnell weiter machen&#8230;Tschüß!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2007/09/world-wide-web-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL 5: Functions oder Views vs. Indizes</title>
		<link>http://www.lieber-linux.de/2007/03/mysql-5-functions-oder-views-vs-indizes/</link>
		<comments>http://www.lieber-linux.de/2007/03/mysql-5-functions-oder-views-vs-indizes/#comments</comments>
		<pubDate>Fri, 23 Mar 2007 14:51:18 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Indizes]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Profiling]]></category>
		<category><![CDATA[Sortierung]]></category>
		<category><![CDATA[Stored Procedure]]></category>
		<category><![CDATA[View]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=7</guid>
		<description><![CDATA[Mein Chef meinte zu unserem neuen Server, der sei &#8220;irgendwie lahm&#8221; . Ich hatte nach dem ersten Hochspielen unseres neuen Onlineshops eigentlich genau das Gegenteil als Erfahrung gemacht. Tatsächlich, die Seite war lahm. Vielleicht nur in seinem neuen IE7? Naja, im ewigen Streben nach mehr Geschwindigkeit habe ich mich diese Woche also ein wenig mit [...]]]></description>
			<content:encoded><![CDATA[<p>Mein Chef meinte zu unserem neuen Server, der sei &#8220;irgendwie lahm&#8221; . Ich hatte nach dem ersten Hochspielen unseres neuen Onlineshops eigentlich genau das Gegenteil als Erfahrung gemacht. Tatsächlich, die Seite war lahm. Vielleicht nur in seinem neuen IE7? Naja, im ewigen Streben nach mehr Geschwindigkeit habe ich mich diese Woche also ein wenig mit Indizes und Views sowie Funtionen (UDFs) in MySQL beschäftigt, um den Shop so gut wie möglich auf Trab zu bringen.</p>
<p><span id="more-7"></span>Zuerst suchte ich eine schöne handliche Funktion, die mir eine Seitenstruktur aufwärts traversiert, um meine eigene, recht grobgeschnitzte  Routine zur Anzeige  der  Navigation abzulösen.</p>
<p>Also erstmal nach CREATE FUNCTION gegoogelt, denn mein Buch <strong>PHP5/MySQL4</strong> umschifft gekonnt dieses technische Terroir. Das Google-Ergebnis war frustrierend: Der wichtigste Link war schließlich die offizielle MySQL-Doku, in den Groups gab es ein paar Beiträge auf polnisch, was ich leider gar nicht verstehe.</p>
<p>Die auf der <a title="MySQL-Doku" href="http://dev.mysql.com/doc/refman/5.1/de/create-procedure.html" target="_blank">MySQL-Doku</a> angegebene Syntax-Beschreibung waren abschreckend kompliziert dargestellt.  Da muss jemand denken &#8220;Eine EBNF sagt mehr als 1000 Worte&#8221;. Da hat er wohl recht &#8211; wenn man einmal in der Materie drin ist. Wenn mans nicht ist, siehts ganz düster aus.</p>
<p>Eine <a title="andere Seite" href="http://www.strassenprogrammierer.de/mysql-stored-procedures-trigger_tipp_469.html" target="_blank">andere Seite</a> geht dafür den Top-down-Approach, auch mein Traversal-Problem ist hier als Beispiel-Lösung angegeben (juhu! dachte ich erst). Super einfühlsam, hier bleibt man jedoch nach den Überschriften etwas stecken. Denn das Beispiel funktionierte nicht.</p>
<p>Nach etwas Fiddelei stellte sich bei mir heraus: Zunächst war die Syntax &#8220;DELIMITER ;&#8221; nicht korrekt, dann muss man der Funktion immerhin noch sagen, ob diese READ SQL DATA oder anderen Typs ist. Nach der Syntax dann die Anweisung: Die Abbruchbedingung der WHILE-Schleife haute gar nicht hin. Angeblich soll ja diese Routine in MySQL-Syntax zu beherrschen sein, aber eine WHILE (NOT ISNULL(variable)) scheints nicht zu geben, hier rennt man in eine Endlosschleife. Mit Ctrl-C schießt man dabei leider nur seinen Client ab, der Server läuft mit dem Prozess dann in aller Ruhe weiter. Andere Bedingungen wie &#8220;(variable&gt;)&#8221; stoppten bei NULL-Werten ebensowenig.</p>
<p>Nach ein paar Versuchen hatte der Server dann einen Load von 9.0 und MySQL eine Prozessorlast von konstant 200 Prozent erreicht. Mein vi hing, die Buchstaben waren eher per Fuß als per ssh auf dem Server. Mühsam schaffte ich es noch per top zu sehen, wer dran schuld war, so dass ich dann MySQL einfach stoppte und neu startete (die anderen in der Firma hatten hoffentlich gerade nix im Intranet zu tun:-)).</p>
<p>Also das war schon mal ein kleiner Reinfall. Meine Routine blieb.</p>
<p>Heute dann mehr Glück, wenn auch mit einem anderen Thema: Views und Indexes. Ich hatte zwischenzeitlich die Shop-Homepage mit einer Menge von Profiling-Anweisungen ausgestattet und konnte so die einzelnen Arbeitsschritte genau analysieren. Erstaunlich schnell konnte ich die &#8220;wunden Punkte&#8221; erkennen.</p>
<p>Mein erstes Fazit war: Lange Dateien per include in PHP-Code zu laden ist nicht schneller, als wenn es zwei kleinere Dateien sind. Meine Arbeitshypothese lautete bis dato noch: Weniger Dateien zu öffnen dauert nicht so lange wie ein sequentieller Lesevorgang einer Datei. Da lag ich wohl falsch, und bin nun froh, dass sinnvolles Strukturieren von include-Dateien &#8220;erlaubt&#8221; ist.</p>
<p>Zweites Fazit: Meine Arbeitshypothese, dass ich in Zukunft auf Apache&#8217;s mod_mem_cache setzen sollte, damit die ständig geladenen Seitenanteile nicht bei jedem Aufruf von der Platte gelesen werden müssen, ist hinfällig geworden: Nur 10% der gesamten Server-Bearbeitungszeit geht auf das Laden von Seiten zurück:</p>
<p>[PROFILING] =&gt; Array<br />
(<br />
[0] =&gt; Start<br />
[1] =&gt; 0.0000: session.inc.php geladen (0.0000)<br />
[2] =&gt; 0.0002: request.inc.php geladen (0.0002)<br />
[3] =&gt; 0.0004: ssl.inc.php geladen (0.0002)<br />
[4] =&gt; 0.0005: locale.inc.php geladen (0.0001)<br />
[5] =&gt; 0.0009: sage.inc.php geladen (0.0004)<br />
[6] =&gt; 0.0034: basic.inc.php geladen (0.0026)<br />
[7] =&gt; 0.0036: waehrungen.inc.php geladen (0.0002)<br />
[8] =&gt; 0.0040: db.inc.php geladen (0.0003)<br />
[9] =&gt; 0.0043: db verbunden (0.0004)<br />
[10] =&gt; 0.0043: Sortierung berechnet (0.0000)<br />
[11] =&gt; 0.0066: konto.inc.php geladen (0.0023)<br />
[12] =&gt; 0.0071: aktionen.inc.php geladen (0.0005)<br />
[13] =&gt; 0.0074: menue_js.inc.php geladen (0.0003)<br />
[14] =&gt; 0.0084: left.php geladen (0.0010)<br />
[15] =&gt; 0.0084: goInsite(); (0.0000)<br />
[16] =&gt; 0.0091: kategorie.inc.php geladen (0.0008)<br />
[17] =&gt; 0.0096: Kopf ausgegeben (0.0005)<br />
<strong> [18] =&gt; 0.4466: Artikel gefunden (0.4369)</strong><br />
[19] =&gt; 0.4471: Sortieren/Blaettern ausgegeben (0.0005)<br />
[20] =&gt; 0.4521: Artikel ausgegeben (0.0050)<br />
[21] =&gt; 0.4523: Blaettern ausgegeben (0.0001)<br />
[22] =&gt; 0.4524: Entering _post.php (0.0001)<br />
[23] =&gt; 0.4525: footer.inc.php geladen (0.0001)<br />
[24] =&gt; 0.4584: right.inc.php geladen (0.0059)<br />
[25] =&gt; 0.4600: menue.inc.php geladen (0.0016)<br />
[26] =&gt; 0.4605: Seitenende (0.0005)<br />
)</p>
<p>Hier sieht man schnell: von den 460 Millisekunden gehen 436 für die Artikelsuche in der Datenbank drauf.</p>
<p>Nach der Einführung von Indizes für einige Bereiche der Website und der Einführung eines Views für die Darstellung aller zur Zeit aktiven Artikel sieht das Ergebnis gleich ganz anders aus:</p>
<p>[PROFILING] =&gt; Array<br />
(<br />
[0] =&gt; Start<br />
[1] =&gt; 0.0000: session.inc.php geladen (0.0000)<br />
[2] =&gt; 0.0002: request.inc.php geladen (0.0002)<br />
[3] =&gt; 0.0004: ssl.inc.php geladen (0.0002)<br />
[4] =&gt; 0.0005: locale.inc.php geladen (0.0001)<br />
[5] =&gt; 0.0009: sage.inc.php geladen (0.0004)<br />
[6] =&gt; 0.0035: basic.inc.php geladen (0.0026)<br />
[7] =&gt; 0.0037: waehrungen.inc.php geladen (0.0002)<br />
[8] =&gt; 0.0040: db.inc.php geladen (0.0003)<br />
[9] =&gt; 0.0044: db verbunden (0.0004)<br />
[10] =&gt; 0.0044: Sortierung berechnet (0.0000)<br />
[11] =&gt; 0.0067: konto.inc.php geladen (0.0023)<br />
[12] =&gt; 0.0072: aktionen.inc.php geladen (0.0005)<br />
[13] =&gt; 0.0074: menue_js.inc.php geladen (0.0003)<br />
[14] =&gt; 0.0084: left.php geladen (0.0009)<br />
[15] =&gt; 0.0088: goInsite(); (0.0004)<br />
[16] =&gt; 0.0096: kategorie.inc.php geladen (0.0008)<br />
[17] =&gt; 0.0102: Kopf ausgegeben (0.0006)<br />
<strong> [18] =&gt; 0.0106: Artikel gefunden (0.0004)</strong><br />
[19] =&gt; 0.0111: Sortieren/Blaettern ausgegeben (0.0005)<br />
[20] =&gt; 0.0142: Artikel ausgegeben (0.0031)<br />
[21] =&gt; 0.0144: Blaettern ausgegeben (0.0001)<br />
[22] =&gt; 0.0145: Entering _post.php (0.0001)<br />
[23] =&gt; 0.0146: footer.inc.php geladen (0.0001)<br />
[24] =&gt; 0.0205: right.inc.php geladen (0.0059)<br />
[25] =&gt; 0.0236: menue.inc.php geladen (0.0031)<br />
[26] =&gt; 0.0236: Seitenende (0.0000)<br />
[max] =&gt; Array<br />
(<br />
[0] =&gt; 0.00587892532349<br />
[1] =&gt; right.inc.php geladen<br />
)<br />
)</p>
<p>Und so wurden aus 461 ms 24 ms Gesamtladezeit. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Ich muss aber dazu sagen, dass die Einführung eines Views selbst zu keiner nennenswerten Performance-Steigerung führte. Die dabei gemessenen Ergebnisse sahen genauso, wenn nicht noch schlechter als die Abfrage der Originaltabelle aus. Erst die Indizes bringen die Performance, im obigen Beispiel ist dies immerhin eine Reduktion auf 5% der Original-Antwortzeit. Das eigentliche Problem, nämlich 1-2 Sekunden Rendering der Seite im IE7, ist damit (natürlich rein statistisch) auf 0.6-1.4 Sekunden geschrumpft. Dennoch werden wir hier nochmal ran, und diesmal den CSS-Code studieren müssen.</p>
<p>PS: Ich habe das View schließlich doch benutzt, damit mein Code einfacher und leichter wartbar wird. Eventuell werde ich den View noch auf die zur Artikelsuche relevanten Felder begrenzen, und die Messung damit wiederholen. Die großen Unterschiede wird es jedoch nicht mehr machen können. Und die Abweichungen jeder Messung sind augenscheinlich. Zweimal nacheinander eine ähnlich Abfrage bringt allein durch das Caching der Datenbank alle Ergebnisse durcheinander.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2007/03/mysql-5-functions-oder-views-vs-indizes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CSS Wunderwerk</title>
		<link>http://www.lieber-linux.de/2007/02/css-wunderwerk/</link>
		<comments>http://www.lieber-linux.de/2007/02/css-wunderwerk/#comments</comments>
		<pubDate>Tue, 27 Feb 2007 17:13:56 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Firefox]]></category>

		<guid isPermaLink="false">http://www.lieber-media.de/blog/?p=3</guid>
		<description><![CDATA[Innerhalb meines relativ neuen jobs habe ich auf die Aufgabe, den Webshop umzusetzen. Dabei wird nun Inhalt und Layout getrennt (naja, zumindest zwischen HTML-Elementen und einem CSS). Dabei fiel mir vor allem auf: Klingt gut, ist aber zur Zeit eine echt reudige Angelegenheit, vor allem, wenn man die Internet Explorer Fangemeinde nicht verärgern will. Im [...]]]></description>
			<content:encoded><![CDATA[<p>Innerhalb meines relativ neuen jobs habe ich auf die Aufgabe, den Webshop umzusetzen. Dabei wird nun Inhalt und Layout getrennt (naja, zumindest zwischen HTML-Elementen und einem CSS). Dabei fiel mir vor allem auf: Klingt gut, ist aber zur Zeit eine echt reudige Angelegenheit, vor allem, wenn man die Internet Explorer Fangemeinde nicht verärgern will.</p>
<p>Im Firefox habe ich bisher nur kleine Macken entdeckt. Davon ist eine sehr witzig: In einem CSS-gesteuerten Popup-Menü hatten wir vier einfache Einträge, in einer geordneten Liste als einfaches a-href-Element. Immer wurde dieses Menü anders als alle anderen dargestellt: Der Rollover-Effekt klappte nicht, die li&#8217;s waren nicht so breit wie die Liste etc. Nachdem ich den (sehr einfachen) HTML-Code sehr lange intensiv studierte und nix, aber auch gar nix fand, habe ich die Elemente in der Reihenfolge getauscht, aber das brachte keinen Verbesserungseffekt. Schließlich benannte ich einen der Links einfach um &#8211; jetzt gehts. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2007/02/css-wunderwerk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

