<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/templates/default/atom.css" type="text/css" ?>

<feed 
   xmlns="http://www.w3.org/2005/Atom"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <link href="http://octavian.supersized.org/feeds/atom.xml" rel="self" title="blOgtave" type="application/atom+xml" />
    <link href="http://octavian.supersized.org/"                        rel="alternate"    title="blOgtave" type="text/html" />
    <link href="http://octavian.supersized.org/rss.php?version=2.0"     rel="alternate"    title="blOgtave" type="application/rss+xml" />
    <title type="html">blOgtave</title>
    <subtitle type="html">Octave's wacher Mund des arg geschlauchten Gartenkohls</subtitle>
    <icon>http://octavian.supersized.org/templates/square/img/s9y_banner_small.png</icon>
    <id>http://octavian.supersized.org/</id>
    <updated>2008-04-27T22:56:12Z</updated>
    <generator uri="http://www.s9y.org/" version="1.3-alpha1">Serendipity 1.3-alpha1 - http://www.s9y.org/</generator>
    <dc:language>de</dc:language>

    <entry>
        <link href="http://octavian.supersized.org/archives/17-CSRF-Protection-Updated.html" rel="alternate" title="CSRF Protection (Updated)" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2008-04-22T11:12:49Z</published>
        <updated>2008-04-27T22:56:12Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=17</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=17</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/10-todoyode" label="todoyo.de" term="todoyo.de" />
            <category scheme="http://octavian.supersized.org/categories/3-ZendFramework" label="ZendFramework" term="ZendFramework" />
    
        <id>http://octavian.supersized.org/archives/17-guid.html</id>
        <title type="html">CSRF Protection (Updated)</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Nachdem <a href="http://blog.fukami.io/">fukami</a> beim letzten Bonner <a href="http://www.webmontag.de/doku.php?id=07.04.2008_bonn">WebMontag</a> erläutert hatte was <a href="http://de.wikipedia.org/wiki/CSRF">CSRF</a> ist und was man alles damit anrichten kann, war mir zunächst nicht ganz klar, wie so etwas in der Praxis ausgenutzt wird und welche Schutzmaßnahmen man dagegen implementieren kann.

<br /><br />

Netterweise demonstrierte mir mein Kollege <a href="http://usrportage.de/">Lary Strojny</a> anhand meines Projekts <a href="http://todoyo.de">todoyo.de</a> wie so etwas genau aussieht. Er schickte mir einen unscheinbaren Link, den ich natürlich sofort öffnete und gelangte auf eine einfache Seite mit 3 Images, welche allerdings nicht richtig geladen wurden. Die Bilderpfade lauteten in etwa "http://todoyo.de/task/delete/id/1234". Wäre ich nun bei todoyo eingeloggt gewesen, wären ohne, dass ich etwas gemerkt hätte, einige meiner Aufgaben gelöscht worden. Die IDs der Aufgaben besorgte er sich aus der öffentlichen todoyo-Entwicklerliste. Glücklicherweise war ich nicht eingeloggt ;)

<br /><br />

Dadurch wurde mir schlagartig klar, wie CSRF Angriffe funktionieren und welchen Schaden man damit alles anrichten kann, wenn die Seite nicht entsprechend geschützt ist.

<br /><br />

Wie sehen nun die Gegenmaßnahmen aus, um so etwas zu verhindern? Folgende Schritte habe ich unternommen: - Aufgaben-IDs aus öffentlichen Listen entfernt<br />
- Bei allen Formularen POST Requests erzwungen<br />
- und anschließend nur POST Variablen auswerten<br />
- Tokens in jedes Formular eingebaut<br />
- Tokens auch für Links zu Datenänderungen benutzen (z.B. einfaches Löschen von Aufgaben per Link statt per Formular)

<br /><br />

Im Code sieht das Ganze jetzt so aus:

<br />

<div class="php" style="text-align: left"><br /><span style="color: #000000; font-weight: bold;">&lt;?php</span><br /><span style="color: #808080; font-style: italic;">// Todoyo/View/Helper/CsrfKey.php</span><br /><span style="color: #000000; font-weight: bold;">class</span> Todoyo_View_Helper_CsrfKey<br /><span style="color: #66cc66;">&#123;</span><br />&#160; &#160; protected <span style="color: #0000ff;">$_token</span> = <span style="color: #ff0000;">''</span>;<br /><br />&#160; &#160; public <span style="color: #000000; font-weight: bold;">function</span> csrfKey<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />&#160; &#160; <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;_token<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$this</span>-&gt;_token = <a href="http://www.php.net/md5"><span style="color: #000066;">md5</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/uniqid"><span style="color: #000066;">uniqid</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/rand"><span style="color: #000066;">rand</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #0000ff;">$this</span>-&gt;_token;<br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array_slice"><span style="color: #000066;">array_slice</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span>, -<span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;_token;<br />&#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><span style="color: #66cc66;">&#125;</span><br /><br /><br /><span style="color: #808080; font-style: italic;">// Todoyo/Controller/Action.php</span><br /><span style="color: #000000; font-weight: bold;">class</span> Todoyo_Controller_Action extends Zend_Controller_Action<br /><span style="color: #66cc66;">&#123;</span><br />&#160; &#160; <span style="color: #808080; font-style: italic;">// Prüft ob aktuelle Action geschützt ist und ob CSRF Key gültig ist</span><br />&#160; &#160; public <span style="color: #000000; font-weight: bold;">function</span> checkCsrfKey<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$actions</span><span style="color: #66cc66;">&#41;</span><br />&#160; &#160; <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; <span style="color: #808080; font-style: italic;">// Keine CSRF geschützen Actions? Weiter</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$actions</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br />&#160; &#160; &#160; &#160; <span style="color: #808080; font-style: italic;">// Action nicht eine der CSRF geschützen Actions? Weiter</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<a href="http://www.php.net/in_array"><span style="color: #000066;">in_array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;_request-&gt;<span style="color: #006600;">getActionName</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$actions</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><br />&#160; &#160; &#160; &#160; <span style="color: #0000ff;">$token</span> = <span style="color: #0000ff;">$this</span>-&gt;_getParam<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'x'</span><span style="color: #66cc66;">&#41;</span>;<br /><br />&#160; &#160; &#160; &#160; <span style="color: #808080; font-style: italic;">// Kein Token oder Token nicht in Session? Abbruch!</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span> or !<a href="http://www.php.net/in_array"><span style="color: #000066;">in_array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$token</span>, <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$this</span>-&gt;_flash-&gt;<span style="color: #006600;">addMessage</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Unerlaubte Aktion'</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$this</span>-&gt;_redirect<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><br />&#160; &#160; &#160; &#160; <span style="color: #808080; font-style: italic;">// Token war gültig? Token löschen und weiter</span><br />&#160; &#160; &#160; &#160; <span style="color: #0000ff;">$pos</span> = <a href="http://www.php.net/array_search"><span style="color: #000066;">array_search</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$token</span>, <span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; <a href="http://www.php.net/unset"><span style="color: #000066;">unset</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tokens'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$pos</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;<br />&#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><br />&#160; &#160; <span style="color: #808080; font-style: italic;">// Prupft ob für aktuelle Action POST erzwungen wurde und wirklich POST ist</span><br />&#160; &#160; public <span style="color: #000000; font-weight: bold;">function</span> checkPost<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$actions</span><span style="color: #66cc66;">&#41;</span><br />&#160; &#160; <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; <span style="color: #808080; font-style: italic;">// Keine POST Actions erzwungen? Weiter</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$actions</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br />&#160; &#160; &#160; &#160; <span style="color: #808080; font-style: italic;">// Action keine erzwungene POST Action? Weiter</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<a href="http://www.php.net/in_array"><span style="color: #000066;">in_array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;_request-&gt;<span style="color: #006600;">getActionName</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$actions</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><br />&#160; &#160; &#160; &#160; <span style="color: #808080; font-style: italic;">// Action ist kein POST? Abbruch!</span><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #0000ff;">$this</span>-&gt;_request-&gt;<span style="color: #006600;">isPost</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$this</span>-&gt;_flash-&gt;<span style="color: #006600;">addMessage</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Fehler beim Verarbeiten der Formulareingaben'</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; &#160; &#160; <span style="color: #0000ff;">$this</span>-&gt;_redirect<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><br />&#160; &#160; &#160; &#160; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">checkCsrfKey</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$actions</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><span style="color: #66cc66;">&#125;</span><br /><br /><span style="color: #808080; font-style: italic;">// TaskController.php</span><br /><span style="color: #000000; font-weight: bold;">class</span> TaskController extends Todoyo_Controller_Action<br /><span style="color: #66cc66;">&#123;</span><br />&#160; &#160; public <span style="color: #000000; font-weight: bold;">function</span> init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />&#160; &#160; <span style="color: #66cc66;">&#123;</span><br />&#160; &#160; &#160; &#160; parent::<span style="color: #006600;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">checkCsrfKey</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'insert'</span>, <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; &#160; &#160; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">checkPost</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'insert'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />&#160; &#160; <span style="color: #66cc66;">&#125;</span><br /><span style="color: #66cc66;">&#125;</span><br /><br /><span style="color: #808080; font-style: italic;">// index/index.phtml</span><br />&lt;form action=<span style="color: #ff0000;">"/task/insert"</span> method=<span style="color: #ff0000;">"post"</span>&gt;<br />&#160; &#160; &lt;input type=<span style="color: #ff0000;">"text"</span> name=<span style="color: #ff0000;">"title"</span> value=<span style="color: #ff0000;">""</span>&gt;<br />&#160; &#160; &lt;input type=<span style="color: #ff0000;">"hidden"</span> name=<span style="color: #ff0000;">"x"</span> value=<span style="color: #ff0000;">"&lt;?=$this-&gt;csrfKey()?&gt;"</span>&gt;<br />&#160; &#160; &lt;input type=<span style="color: #ff0000;">"submit"</span> name=<span style="color: #ff0000;">"submit"</span> value=<span style="color: #ff0000;">"Speichern"</span>&gt;<br />&lt;/form&gt;<br /><br />&lt;a href=/task/delete/id/<span style="color: #cc66cc;">1234</span>/x/<span style="color: #000000; font-weight: bold;">&lt;?</span>=<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">csrfKey</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>?&gt;&gt;Aufgabe löschen&lt;/a&gt;<br />&#160;</div>

Was geschieht im Detail?

<br /><br />

Im Template wird nun bei jeder Aktion, die geschützt werden soll, ein CSRF Key (Token) entweder als Hidden Input Feld eingefügt, oder bei Links mit an die URL angehangen.
Der CsrfKey-View-Helper liefert bei jedem Aufruf einen neuen zufälligen String, der in der Session gespeichert wird. Pro Seitenaufruf wird ein einziger Token erzeugt und für alle Elemente verwendet. Die Anzahl der gültigen Tokens wurde auf 100 beschränkt, um die Session nicht unnötig aufzublähen und dennoch gültige Requests bei mehreren Tabs/Seiten zu ermöglichen.

<br /><br />

Nach dem Abschicken eines Formulars, wird bevor die eigentliche Action ausgeführt wird, geprüft, ob die Aktion durch einen POST-Request entstanden sein muss, was bei Formularen klar der Fall ist. Der Methode "checkPost" werden also alle Actions übergeben, bei denen wir POST erzwingen wollen. Zusätzlich wir bei definierten Actions geprüft, ob sie einen CSRF Key besitzen müssen, und falls ja, ob dieser auch gültig ist (=in der Session vorhanden ist). Wenn ja, dann wird der benutzte Token aus der Session gelöscht und die Action wir ausgeführt. Bei der Verwendung von "checkPost()" wird automatisch auch der CSRF Key überprüft, weil alle Formulare zwingend einen gültigen Token haben müssen, URLs hingegen nur bei Bedarf.

<br /><br />

Somit kann man für jeden Controller ganz einfach definieren, welche Actions ausschließlich per POST aufgerufen werden dürfen und welche durch CSRF geschützt werden sollen. In der Regeln ist dies bei allen Aktionen der Fall, bei denen Daten geändert werden (insert, update, delete,...). Bei Anzeige-Aktionen legt man eher Wert auf schöne URLs ohne einen Token.

<br /><br />

Für weitere Verbesserungsvorschläge oder Fehlerhinweise wäre ich sehr dankbar :)

<br /><br />

<strong>UPDATE:</strong>

<br />

Im <a href="http://www.zfforum.de/showthread.php?t=1808">deutschen Zend Framework Forum</a> wurden ein paar Vorschläge geäußert:

<br /><br />

- Auslagerung der "checkPost()" und "checkCsrf()" Funktionalität in einen eigenen <a href="http://framework.zend.com/manual/de/zend.controller.actionhelpers.html#zend.controller.actionhelper.writingyourown">ActionHelper</a><br />
- Nutzung von <a href="http://framework.zend.com/manual/de/zend.session.html">Zend_Session_Namespace</a> zum Zugriff auf die Session Tokens<br />
- Erstellung eines <a href="http://framework.zend.com/manual/de/zend.form.elements.html#zend.form.elements.custom">Zend_Form_Element</a> um z.B. automatisch bei jedem Form das Hidden Token Element hinzuzufügen<br /> 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/16-Videos-vom-WebMontag-in-Bonn-online.html" rel="alternate" title="Videos vom WebMontag in Bonn online" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2008-04-18T13:33:25Z</published>
        <updated>2008-04-18T18:33:43Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=16</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=16</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/11-KonferenzenBarCamps" label="Konferenzen/BarCamps" term="Konferenzen/BarCamps" />
    
        <id>http://octavian.supersized.org/archives/16-guid.html</id>
        <title type="html">Videos vom WebMontag in Bonn online</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Mittlerweile sind auch die Aufzeichnungen einiger Vorträge des <a href="http://www.webmontag.de/doku.php?id=07.04.2008_bonn">WebMontags vom 7. April</a> online:<br />
<br />
- <a href="http://www.cafe-podcast.de/video.php?v=2907b411eb1712c08b5ab8894bc08b48">Christian Scholz - Data Portability</a><br />
- <a href="http://www.cafe-podcast.de/video.php?v=1ae363c6d1ddd517dd849e1179fa1acd">Roland Schäfer und Nico Zorn - Produki.de</a><br />
- <a href="http://www.cafe-podcast.de/video.php?v=b9a9dda0f176b13ee1da7ca578a6af72">Thomas Schindler - Cellcast.de</a><br />
- <a href="http://www.cafe-podcast.de/video.php?v=be1a263db19d66646dda7a308c9c0d2e">Philipp Strube - myPEAK.net</a><br />
<br />
Leider scheinen die Vortragenden zu den Themen "CSRF" (fukami) und "Das chinesische Web" (Oliver Ueberholz) einer Veröffentlichung nicht zugestimmt zu haben, schade.<br />
<br />
UPDATE: Tollerweise habe ich gerade ein <a href="http://www.elektrischer-reporter.de/index.php/site/film/38/">Video gefunden</a>, wo <a href="http://www.webworkblogger.de/">Oliver</a> quasi den gleichen Vortrag hält wie beim WebMontag :)  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/15-Mein-neues-Projekt-todoyo.de.html" rel="alternate" title="Mein neues Projekt: todoyo.de" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2008-04-16T22:10:20Z</published>
        <updated>2008-04-22T12:30:47Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=15</wfw:comment>
    
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=15</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/10-todoyode" label="todoyo.de" term="todoyo.de" />
    
        <id>http://octavian.supersized.org/archives/15-guid.html</id>
        <title type="html">Mein neues Projekt: todoyo.de</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Seit ca 2 Wochen arbeite ich an einem neuen Projekt, welches ich auf den Namen <a href="http://todoyo.de">"todoyo - notieren. erledigen. freigeben."</a> bzw auf Englisch <a href="http://todoyo.net">"todoyo - note. do. share"</a> getauft habe.<br />
Wie man am Namen erkennen kann geht es um das Thema ToDo-Listen.<br />
<br />
Wie kam es dazu?<br />
 Nun, seit geraumer Zeit bin ich begeisterter Nutzer diverser Google Services wie <a href="http://mail.google.com">Gmail</a>, <a href="http://www.google.com/reader">Google Reader</a>, <a href="http://www.google.com/calendar">Google Calendar</a> oder <a href="http://docs.google.com/">Google Docs</a>.<br />
Diese Anwendungen finde ich deshalb so toll, weil sie großen Wert auf intuitive Bedienbarkeit und Übersichtlichkeit legen und trotzdem eine Menge an Funktionalität bieten. So gibt es jeweile eine Hauptansicht, welche alle Informationen schlicht darstellt und dank <a href="http://de.wikipedia.org/wiki/Ajax_(Programmierung)">Ajax </a>Spielereien eine unterbrechungsfreie Bearbeitung ermöglichen. Hinzu kommt noch, dass ich keine Lust habe Datenbestände zwischen meinem Home-PC und meinem Arbeits-Macbook zu synchronisieren und ich von überall Zugriff darauf habe.<br />
<br />
Etwas was mir noch fehlte war eine entsprechende Anwendung um meine privaten Erledigungen und auch Arbeitsaufgaben und Projektschritte zu verwalten. Dafür habe ich eine zeitlang <a href="http://www.rememberthemilk.com/">Remember-The-Milk</a> genutzt und auch dessen GMail Integration, aber irgendwie war mir das nicht schlicht genug und zu umständlich. Warum also nicht selbst versuchen es besser zu machen, wenn man schonmal PHP Entwickler ist ;)<br />
<br />
Hinzu kam noch, dass ich unbedingt einmal ein paar neue Komponenten des <a href="http://framework.zend.com">Zend Frameworks</a> ausprobieren wollte, welche ich bislang noch nicht direkt genutzt hatte, wie z.B. <a href="http://framework.zend.com/manual/en/zend.layout.html">Zend_Layout</a> mit dem <a href="http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.viewrenderer">ViewRenderer</a>, <a href="http://framework.zend.com/manual/en/zend.translate.html">Internationalisierung</a> oder die diversen <a href="http://framework.zend.com/manual/en/zend.service.html">Service</a> Komponenten. <a href="http://jquery.com">jQuery</a> wollte ich mir in dem Zusammenhang auch einmal genauer anschauen.<br />
<br />
Nach ein paar Überlegungen wie ich die Handhabung der Anwendung am effektivsten gestalten könnte, legte ich los und begann erst einmal mit der Kernfunktionalität: den Listen und Aufgaben. Dies ging alles überraschend einfach, da das ZendFramework einem extrem viel des MVC Designs abnimmt und die Applikationsstruktur grob vorgibt. Danach folgten Schritt für Schritt immer mehr Features und Optimierungen.<br />
<br />
Als Template Engine habe ich nach jahrelanger <a href="http://www.smarty.net/">Smarty</a> Nutzung mal wieder reines PHP (mit Short-Open-Tags) benutzt, was einem etwas mehr Freiheiten als Smarty bietet, wobei man aufpassen muss nicht plötzlich Logik in die somit mächtigen Templates zu packen.<br />
Zwischenzeitlich hatte ich einmal versucht, das Projekt auf Smarty umzuschreiben, bin aber daran gescheitert, dass eine Zend_Layout Nutzung dadurch quasi unmöglich wurde und nur mit hässlichen Workarounds funktioniert hätte. Also Änderungen verworfen und weiter mit PHP als Template Sprache.<br />
<br />
Praktisch war, dass ich die Listen- und Aufgaben Funktionalität von todoyo selbst für dessen eigene Entwicklung nutzen und gleichzeitig testen konnte. Mittlerweile ist die <a href="http://todoyo.de/index.php/list/show/Octavian/todoyo">Entwicklungs-Todo-Liste</a> Liste immer länger geworden, da einem natürlich immer mehr interessante Features einfallen, die man realisieren könnte.<br />
<br />
Also auf jeden Fall ein nettes Projekt für zwischendurch. Auch wenn es später vielleicht kaum jemand nutzen wird, so erfüllt es auf jeden Fall meine eigenen Anforderungen, die ich an ToDo-Listen stelle und wird mich in Zukunft in meinem Alltag unterstützen.<br />
<br />
Also, schaut es euch doch einmal an :) 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/13-Mein-erster-Webmontag.html" rel="alternate" title="Mein erster Webmontag" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2008-04-14T19:22:33Z</published>
        <updated>2008-04-22T12:30:10Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=13</wfw:comment>
    
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=13</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/11-KonferenzenBarCamps" label="Konferenzen/BarCamps" term="Konferenzen/BarCamps" />
    
        <id>http://octavian.supersized.org/archives/13-guid.html</id>
        <title type="html">Mein erster Webmontag</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Vor mittlerweile genau einer Woche war ich zum ersten Mal bei einem <a href="http://webmontag.de/doku.php?id=bonn" title="Webmontag">Webmontag</a>. Dieser fand in Bonn im <a href="http://www.cafe-podcast.de/" title="Café Podcast">Café Podcast</a> statt. Das ist ein nettes Café, welches mit einer kleinen Bühne für Vorträge ausgestattet ist und sich somit optimal für solch eine Veranstaltung eignet.<br />
<br />
Anwesend waren geschätzte 40-50 Leute, was die Erwartungen übertraf. Meine Kollegen <a href="http://www.lostfocus.de/">Dominik</a>, Ben und <a href="http://jm.tosses.info/">Jan Manuel</a> waren ebenfalls am Start.<br />
<br />
Folgende Themen/Projekte wurden in den Sessions vorgestellt: <a href="http://www.mypeak.net">myPEAK.net</a>, <a href="http://cellcast.de">cellcast.de</a>, <a href="http://www.produki.de">produki</a>, <a href="http://dataportability.org">DataPortability Project</a>, <a href="http://de.wikipedia.org/wiki/CSRF">CSRF</a>, Internet in China.<br />
 <a href="http://www.mypeak.net">myPEAK.net</a> ist eine Art Community in der die Mitglieder selbst Wettbewerbe erstellen können. So gibt es zum Beispiel Wettbewerbe wie "Schönster Sonnenuntergang", wo Bilder gepostet werden können und darüber abgestimmt wird, welcher Sonnenuntergang am schönsten abgelichtet wurde. Oder zum Beispiel das beste Musikvideo. Externe Medien können dabei einfach eingebunden werden. Der Sieger dieser Wettstreits erhält Punkte.<br />
<br />
<a href="http://cellcast.de">cellcast.de</a> ist eine Plattform, bei der man eine bestimmte Telefonnummer anruft hinter der sich ein digitaler Anrufbeantworter befindet, der dann das Gespräch aufzeichnet und danach als Podcast zur Verfügung stellt. So kann man mit dem Handy von überall Podcasts oder gar Videocasts aufzeichnen, was unter anderem als Live-Berichterstattung für regionale Sportveranstaltungen genutzt werden könnte. Dazu wurde dann noch eine handliche API präsentiert.<br />
<br />
<a href="http://www.produki.de">produki</a> setzt sich auf den Begriffen "Produkt" und "Wiki" zusammen und ist also ein Produkt-Wiki. Der Sinn besteht darin Pro und Contra Listen über alle möglichen Produkte an einer Stelle zusammenzutragen, so dass man nicht mehr ziellos nach Produktrezensionen googeln muss. Zu jedem Produkt gibt es eine ausführliche Beschreibung mit Bildern und Links. Die Kommentare können je nach Nützlichkeit bewertet werden, so dass für Suchende die hilfreichsten Meinungen zu einem Produkt knapp zusammengefasst werden können. Man kann ebenfalls eine Liste mit allen Produkten, Geräten, Fahrzeugen etc anlegen, die man so besitzt, was ein Zuhörer für potenzielle Einbrecher sehr nützlich fand, wenn der Benutzer zusätzlich seine Adresse hinterlegt ;) Das vorgestellte Geschäftsmodell dazu war ebenfalls etwas dubios.<br />
<br />
Das <a href="http://dataportability.org">DataPortability Project</a> ist eine im Moment sehr gehypte Anstrengung mehrer namhafter Firmen, sich auf technische und strategische Konventionen zu einigen wenn es darum geht, Datenbestände von einem (Web 2.0) Portal in ein anderes zu überführen, so dass Benutzer mehrerer solcher Seiten nich überall separat ihre Profile und Datenbestände pflegen müssen. Dabei ist noch nicht ganz klar, ob neben einer Export/Import Lösung auf Benutzerseite, Portale auch direkt Daten miteinander austauschen oder ob es zentrale Server geben soll wo man seine Daten pflegt und die dann von anderen Diensten angezapft werden. Ich halte nur für fragliche wie viele der bekanntesten Seiten überhaupt Interesse daran haben ihr Daten zu teilen oder auf einem gemeinsamen Server zu belassen. Die Antwort des Vortragenden war in etwa "Wenn ein paar kleine erstmal den Anfang gemacht haben, werden die großen, wie Facebook, mitziehen müssen". Würde mich wundern, da die Benutzerdaten ja das einzige sind, was diese milliardenschweren Verkaufsbeträge der SocialNetworks annähernd rechtfertigen.<br />
<br />
Danach versuchte <a href="http://blog.fukami.io">fukami</a> (übrigens ein ex-Kollege, den ich leider nicht mehr kennengelernt habe) dem Publikum, in dem sich "angeblich" (hat sich auf Nachfrage keiner gemeldet) keine Entwickler befanden, die CSRF Problematik näher zu bringen. Das Thema war nich so ganz einfach zu erklären, aber am Ende konnte sich doch jeder etwas darunter vorstellen. Zumindest sollte jedem klar geworden sein, welche Gefahren von dieser Manipulationstechnik ausgehen können. Auf entsprechende Gegenmaßnahmen (neben Form-Token) hätte gerne auch noch ausführlicher eingegangen werden können.<br />
<br />
Zum Schluß kam der meiner Meinung nach interessanteste Vortrag, indem es um das "Internet in China" ging. Der Referent erzählte dabei von seiner Reise durch Asien und wie Chinesen das Internet erleben, vor allem mit starken Bezug zu ihrer Kultur und Geschichte. So lernte man beispielsweise, dass sie den ganzen Tag in gigantischen Internet Cafés abhängen wobei es eine 20%ige Nichtraucherquote gibt ;D Es wurde von "Kreisen" erzählt, in denen sie die Welt begreifen und wie das Regime ihre Zensur durchsetzt. Ich war erstaunt, dass dort die hier so bekannten Seiten wie Google oder Youtube garnicht genutzt werden, sondern dass sie einen eigenen Gegenpart zu Google haben und 140 konkurrierende Videoportale statt nur Youtube. Es wurde auch auf das Thema "Kopien" eingegangen. In China ist es für jemanden eine Ehre, wenn er so gut in seinem Handwerk (z.b. Kaligraphie) ist, dass andere ihn kopieren, also wird solang geübt bis die Kopie exakt so aussieht wie das Original des Gurus. Nur blöd, dass die hiesigen Erfinder diese Ehre nicht zu schätzen wissen ;)<br />
Bleibt abzuwarten wann die ersten erfolgreichen Seiten aus China auch nach Europa rüberschwappen und den Markt aufmischen.<br />
<br />
Neben den Sessions wurde natürlich auch reichlich gefachsimpelt, Fotos gemacht und Bier und Kaffee geschlürft.<br />
Angeblich sollten auch noch Videomitschnitte der Vorträge veröffentlich werden.<br />
<br />
Ingesamt war es eine sehr angenehme Veranstaltung, die anscheinend am 2. Juni 2008 wiederholt wird und ich mir sicherlich nicht entgehen lassen werden. <br />
Vielleicht werde ich ja dort auch mal etwas präsentieren :) 
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/12-me-PHP-Unconference.html" rel="alternate" title="me @ PHP Unconference" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2008-03-27T09:22:04Z</published>
        <updated>2008-04-18T13:41:36Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=12</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=12</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/11-KonferenzenBarCamps" label="Konferenzen/BarCamps" term="Konferenzen/BarCamps" />
    
        <id>http://octavian.supersized.org/archives/12-guid.html</id>
        <title type="html">me @ PHP Unconference</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Am 26/27. April diesen Jahres werde ich das erste Mal das Vergnügen haben an einer <a href="http://en.wikipedia.org/wiki/Unconference">Unconference</a> teilzunehmen.<br />
Genauer gesagt geht es mit meinem Kollegen <a href="http://usrportage.de">Lars Strojny</a> zur <a href="http://www.php-unconference.de/">PHP Unconference</a> nach Hamburg.<br />
<br />
Nachdem ich in den letzten Jahren Entwickler-Veranstaltungen wie <a href="http://www.multimediatreff.de/">Multimediatreff</a>, <a href="http://froscon.de/">frOSCon</a> und <a href="http://weekender.hartes-php.de/">PHP Weekender</a> besucht habe, wird dies nun meine erste Unconference sein. Ich weiß noch nicht genau was mich dort erwartet und wie das Ganze ablaufen wird, aber von der Beschreibung her scheint es ein angenehmes Zusammentreffen von Gleichgesinnten und bekannten Personen aus der PHP-Welt zu werden, wobei mehr oder weniger spontan zahlreiche Sessions zu den verschiedensten Themen rund um Softwareentwicklung gehalten werden.<br />
<br />
Wahrscheinlich werde ich mit Lars zusammen unsere Business-Erweiterung zum <a href="http://framework.zend.com">Zend Framework</a> vorstellen bzw. damit verbundene Themen. Ansonsten interessieren mich natürlich alles rund um Communities,  Social Networking und das Zend Framework. Ob ich daraus selbst noch eine Session basteln könnte werden die nächsten Wochen zeigen.<br />
<br />
Bin gespannt :)  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/11-Neues-Blog-Theme.html" rel="alternate" title="Neues Blog Theme" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2008-02-26T15:22:40Z</published>
        <updated>2008-03-04T13:48:00Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=11</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=11</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/1-Sonstiges" label="Sonstiges" term="Sonstiges" />
    
        <id>http://octavian.supersized.org/archives/11-guid.html</id>
        <title type="html">Neues Blog Theme</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Wie man sieht habe ich mich für ein neues Theme für mein Blog entschieden.<br />
Das alte hatte ein paar merkwürdige Fehler, so dass im IE der Text zu einem lustigen Buchstabengulasch zusammengestaucht wurde.<br />
Das hier find ich nun schön schlicht und klar strukturiert. Gefällt :)<br />
<br />
Vielleicht motiviert mich das neue Theme ja auch dazu etwas mehr zu bloggen ;)<br />
<br />
Achja, <a href="http://garv.in/serendipity/archives/1226-Jetzt-vorbestellen-Das-Serendipity-Handbuch.html" title="Garvin Hicking">Garvin</a> hat sein <a href="http://www.amazon.de/dp/3937514546" title="Serendipity Buch">Buch</a> zu <a href="http://s9y.org/" title="Serendipity">Serendipity</a> fertiggestellt (der besten Blog-Software der Welt, mit der auch dieses Blog hier läuft), also los kaufen!  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/10-Debuglib-fuer-PHP5.html" rel="alternate" title="Debuglib für PHP5" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-11-12T15:01:05Z</published>
        <updated>2007-11-12T15:10:14Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=10</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=10</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/2-Web-Entwicklung" label="Web / Entwicklung" term="Web / Entwicklung" />
    
        <id>http://octavian.supersized.org/archives/10-guid.html</id>
        <title type="html">Debuglib für PHP5</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Tulpe hat eine neue Version seiner netten Debug-Bebliothek veröffentlicht, zu finden unter <a href="http://www.atomar.de/debuglib/"  title="Debuglib">http://www.atomar.de/debuglib/</a>.<br />
<br />
Das Tool ist sehr schick um alle Variablen, die während der Scriptlaufzeit gesetzt wurden, strukturiert auszugeben. Arrays und Objekte werden dabei verschachtelt dargestellt wobei einige Formatierungsoptionen zur Verfügung stehen.<br />
<br />
Auf jeden Fall um einiges schicker als echo, var_dump oder print_r ;)  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/9-Dont-be-evil.html" rel="alternate" title="Don´t be evil" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-09-06T10:45:07Z</published>
        <updated>2007-09-07T15:16:10Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=9</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=9</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/1-Sonstiges" label="Sonstiges" term="Sonstiges" />
    
        <id>http://octavian.supersized.org/archives/9-guid.html</id>
        <title type="html">Don´t be evil</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                So lautet Googles Motto. <br />
Spätestens aber wenn man so lustige Sachen wie <a href="http://www.golem.de/0709/54556.html"  title="Artikel">das hier</a> liest, möchte man meinen, dass die doch nicht so nett sind.<br />
<br />
Aber immerhin sind sie ja so nett und warnen einen in den AGBs, dass sie die Daten nach belieben nutzen wollen, wobei dies andere Seiten wohl genauso machen, nur heimlich.<br />
Bei GMail fand ichs ja schon lustig, dass man bei der Anzeige einer Email passend zum Inhalt der Mail Werbung angezeigt bekommt, aber könnte man ja noch als nette Dienstleistung auslegen ;)<br />
<br />
Naja ich nutze trotzdem regelmäßig diverse Produkte von Google, wie zum Beispiel GMail, Calendar, Reader, AdSense, Maps weil es einfach innovative Angebote sind die großen Wert auf Nutzbarkeit und Einfachheit legen was ich sehr ansprechend finde. Muss man eben nur aufpassen was man dort für Daten zur Verfügung stellen möchte.<br />
<br />
UPDATE: <a href="http://www.heise.de/newsticker/meldung/95613/from/rss09"  title="Gegendarstellung">Laut einem Google Pressesprecher</a> ist es wohl doch nicht so schlimm wie befürchtet ;)  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/8-Alles-NEUe-macht-der-Juli.html" rel="alternate" title="Alles NEUe macht der Juli" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2007-07-30T07:16:38Z</published>
        <updated>2008-02-26T10:03:46Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=8</wfw:comment>
    
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=8</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/9-Persoenliches" label="Persönliches" term="Persönliches" />
    
        <id>http://octavian.supersized.org/archives/8-guid.html</id>
        <title type="html">Alles NEUe macht der Juli</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Was ein aufregender Monat :)<br />
Da schaut man einmal völlig unbedarft im Netz nach was der Markt im Moment an Stellenangeboten hergibt und ehe man sich versieht hat man einen neuen Job.<br />
<br />
In meinem Fall schaute ich mich bei <a href="http://www.xing.de"  title="Xing">Xings</a> neuer Jobbörse nach Angeboten als PHP Entwickler im Raum Köln-Bonn um und wurde relativ schnell fündig. <a href="http://neu.de"  title="Neu.de">Neu.de</a> war auf der Suche nach Entwicklern mit Erfahrung und Interesse an <a href="http://de.wikipedia.org/wiki/Web_2.0"  title="Web2.0">Web 2.0</a> Technologien. Also genau das, womit ich mich seit Jahren beschäftige.<br />
Habe daraufhin einen Entwickler angeschrieben, der mich ermutigte mich einfach mal zu bewerben. Dies tat ich dann auch, wobei es garnicht so einfach war nach 6 Jahren wieder eine Email-Bewerbung zu schreiben, aber war doch recht zufrieden mit dem Ergebnis. Kurz darauf erhielt ich die Einladung zum Vorstellungsgespräch, welches sehr positiv verlief, so dass ich eine Zusage erhielt und nun voraussichtlich im Oktober anfange :)<br />
<br />
Einziger Wermutstropfen ist noch die Vorstellung meine netten Kollegen hier hinter mir zu lassen, aber im Gegenzug freue ich mich auch schon auf die neuen Herausforderungen und das neue Team, welches einen sehr sympathischen Eindruck machte.<br />
<br />
Also, falls du Single bist, einfach mal bei <a href="http://neu.de"  title="Neu.de">neu.de</a> vorbeischauen =)  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/7-Deutsches-ZendFramework-Forum.html" rel="alternate" title="Deutsches ZendFramework Forum" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-12-28T15:31:14Z</published>
        <updated>2006-12-28T15:31:14Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=7</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=7</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/3-ZendFramework" label="ZendFramework" term="ZendFramework" />
    
        <id>http://octavian.supersized.org/archives/7-guid.html</id>
        <title type="html">Deutsches ZendFramework Forum</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Seit kurzem gibt es unter <a href="http://www.zfforum.de"  title="zfforum">zfforum.de</a> endlich ein deutschsprachiges Forum, welches das <a href="http://framework.zend.com"  title="ZF">ZendFramework</a> zum Thema hat.<br />
Bis dato spielte sich die Kommunikation lediglich über die <a href="http://framework.zend.com/wiki/display/ZFDEV/Contributing+to+Zend+Framework#ContributingtoZendFramework-Subscribetotheappropriatemailinglists"  title="ZF Mailinglisten">ZF-Mailinglisten</a> ab, wobei dort jedoch ausschließlich auf Englisch geschrieben wird und der Zugang für ZF-Einsteiger und Mailinglisten-Unerfahrene doch etwas umständlich ist.<br />
<br />
Aber das ist ja jetzt vorbei ;) <br />
Nachdem bis letzte Woche noch am Aufbau der Kategorien und Foren gefeilt wurde, ist die Seite nun seit einer Woche offiziell online und es wurden bereits viele interessante Themen behandelt, seien es Einsteigerproblemchen oder spezielle Fragestellungen zu den einzelnen Komponenten. Qualifizierte Schreiber sind auf jeden Fall genug an Bord, so dass eigentlich keine Frage unbeantwortet bleiben dürfte.<br />
<br />
Wer sich also mit dem ZendFramework beschäftigt und sich mit anderen Entwicklern austauschen möchte, der ist dort bestens aufgehoben :)  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/4-Schwverlaengerung-fuer-meine-D50.html" rel="alternate" title="Schw***verlängerung für meine D50" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-09-21T22:55:05Z</published>
        <updated>2006-10-16T21:10:09Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=4</wfw:comment>
    
        <slash:comments>4</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=4</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/5-Freizeit" label="Freizeit" term="Freizeit" />
    
        <id>http://octavian.supersized.org/archives/4-guid.html</id>
        <title type="html">Schw***verlängerung für meine D50</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Heute kam es an, das kleine Päckchen, dessen Inhalt ich vor 2 Tagen über einen eBay Sofortkauf  geordert hatte:<br />
<br />
Mein brandneues <strong>Sigma 70-300mm F4-5.6 DG MACRO Objektiv</strong> für meine silberne Nikon D50.<br />
Zuvor hatte ich mir immer das alte 200er von meinem Vater geliehen um Aufnahmen von entfernten Objekten zu machen, aber irgendwie zoomte mir das Teil nicht nah genug ran und ist auch nicht immer für mich verfügbar, was ich bei einem Besuch im Kölner-Zoo vor 2 Wochen schmerzlich hinnehmen musste. Macht einfach keinen Spaß die lustigen Tierchen mit nem 18-55mm Objektiv aus der Ferne abzulichten. Jetzt ist auf jeden Fall nichts mehr in einem Umkreis von 300m vor mir sicher *g*<br />
<br />
Hier ein paar Bilder von dem Gerät in diversen Ausbaustufen:<br />
<br />
<table><tr><td><a href="http://www.portey.de/extra/octavian/blog/objektiv1.jpg"><img src="http://www.portey.de/extra/octavian/blog/objektiv1_k.jpg" alt=""  /></a></td><td><a href="http://www.portey.de/extra/octavian/blog/objektiv2.jpg"><img src="http://www.portey.de/extra/octavian/blog/objektiv2_k.jpg" alt=""  /></a></td></tr><tr><td><a href="http://www.portey.de/extra/octavian/blog/objektiv3.jpg"><img src="http://www.portey.de/extra/octavian/blog/objektiv3_k.jpg" alt=""  /></a></td><td><a href="http://www.portey.de/extra/octavian/blog/objektiv4.jpg"><img src="http://www.portey.de/extra/octavian/blog/objektiv4_k.jpg" alt=""  /></a></td></tr></table><br />
Wenn das Wetter morgen schön ist, werde ich mal was durch den Ort laufen und ein Paar Bilder schiessen, konnte gerade nur die Macro Funktion testen, die auch schon nette Resultate lieferte.  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/3-German-Translation-Team.html" rel="alternate" title="German Translation Team" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-09-15T06:43:34Z</published>
        <updated>2006-10-16T21:08:17Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=3</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=3</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/3-ZendFramework" label="ZendFramework" term="ZendFramework" />
    
        <id>http://octavian.supersized.org/archives/3-guid.html</id>
        <title type="html">German Translation Team</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Seit gestern bin ich Mitglied im <a href="http://framework.zend.com/wiki/display/ZFDEV/German+%28Deutsch%29"  title="Übersetzungs Team">Übersetzungs Team</a> für die deutsche Version des <a href="http://framework.zend.com/manual/de"  title="Deutsche Übersetzung">ZendFramework Manuals</a>.<br />
<br />
Nachdem der Teamleiter <a href="http://www.ralfeggert.de"  title="Ralf Eggert">Ralf Eggert</a> in seinem Blog einen <a href="http://www.ralfeggert.de/2006/08/19/deutsches-zend-framework-manual-braucht-deine-hilfe/"  title="Aufruf">Aufruf</a> gestartet hatte in dem er um Mithilfe bei den Übersetzungstätigkeiten bat, und mir eine etwas merkwürdige Übersetzung einer ZF-Komponente auffiel, habe ich mich nun entschlossen etwas auszuhelfen.<br />
<br />
Zunächst gilt es also die bereits übersetzten Texte korrektur zu lesen und danach noch nicht übersetzte Komponenten aus dem Incubator ins Deutsche zu übertragen.<br />
<br />
Bin mal gespannt wie gut ich da mit meinem Schul-LK-Englisch zurecht komme :]  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/2-Googles-Image-Labeler.html" rel="alternate" title="Googles Image Labeler" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2006-09-06T09:36:40Z</published>
        <updated>2006-10-16T21:08:02Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=2</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=2</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/7-Folksonomy" label="Folksonomy" term="Folksonomy" />
    
        <id>http://octavian.supersized.org/archives/2-guid.html</id>
        <title type="html">Googles Image Labeler</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Vor ein paar Tagen meldete mein Feed Reader mal wieder eine neue Kreation aus dem Google Labor: Den <a href="http://images.google.de/imagelabeler" title="ImageLabeler">Google ImageLabeler</a><br />
<br />
Nachdem nun also web2.0 in aller Munde ist und allerorts die gängige Kategorisierung nach vorgegebenen Begriffen durch von Benutzern festgelegte Tags ersetzt wird, springt nun auch Google auf den Zug auf und möchte anscheinend seine Bildersuche verbessern, in dem der Benutzer dazu aufgefordert wird, zu zufällig ausgewählten Bildern Tags einzugeben.<br />
<br />
Weil aber wahrscheinlich niemand Lust dazu hätte, das gigantische Archiv von vorne bis hinten durchzutaggen, hat Google einfach ein Spiel daraus gemacht. Auf der schlichten Startseite befindet sich lediglich ein Button um das Spiel zu starten; entweder anonym oder wenn man mit seinem Google Account eingeloggt ist, dann mit seinem Nickname. Nach dem Drücken des Buttons beginnt das System einen Mitspieler zu finden, der ebenfalls gerade auf den Startknopf gedrückt hat. Wurde jemand gefunden, so wird ein zufälliges Bild angezeigt, was es nun zu taggen gilt. Dabei gibt man beliebig viele Tags in das Eingabefeld ein, wobei man jedes einzeln abschickt und rechts in einer Liste angezeigt bekommt. Der Mensch am anderen Ende der Leitung tut nun das gleiche bis beide Personen mindestens einen gleichen Tag für das Bild abgeschickt haben, dann kommt das nächste. Wenn sich keine Übereinstimmungen finden, kann man auch das Bild überspringen, was dann vom Gegenüber bestätigt werden muss, das gibt allerdings keine Punkte.<br />
Nach 90 Sekunden ist eine Partie vorbei und man bekommt den Punktestand für die Übereinstimmungen angezeigt. Es scheint echt einige Leute zu geben die viel zu viel Zeit haben, wenn man sich die Highscores anguckt *g*<br />
<br />
Also wieder mal ne Luste Idee von Google, mal schauen was als nächstes kommt.  
            </div>
        </content>
        
    </entry>
    <entry>
        <link href="http://octavian.supersized.org/archives/1-me-supersized.html" rel="alternate" title="me @ supersized" />
        <author>
            <name>Marc Jakubowski</name>
            <email>nospam@example.com</email>
        </author>
    
        <published>2005-02-22T08:44:29Z</published>
        <updated>2008-02-26T10:08:07Z</updated>
        <wfw:comment>http://octavian.supersized.org/wfwcomment.php?cid=1</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://octavian.supersized.org/rss.php?version=atom1.0&amp;type=comments&amp;cid=1</wfw:commentRss>
    
            <category scheme="http://octavian.supersized.org/categories/2-Web-Entwicklung" label="Web / Entwicklung" term="Web / Entwicklung" />
    
        <id>http://octavian.supersized.org/archives/1-guid.html</id>
        <title type="html">me @ supersized</title>
        <content type="xhtml" xml:base="http://octavian.supersized.org/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Nachdem ich schon in diversen anderen Blogs und Seiten gelesen hatte, dass supersized.org dieses kostenlose und unglaublich einfache Angebot bereitstellt ein serendipity Blog zu nutzen, konnte ich nun doch nich widerstehen.<br />
Letztendlich dazu bewogen hat mich aber die Tatsache, dass der unglaubliche <a href="http://garv.in/"  title="Garvins Homepage">Supergarv</a> am kommenden Donnerstag einen Vortrag über sein Baby, diese tollste Blogsoftware der Welt, halten wird und ich mir dieses einmal anschauen wollte.  
            </div>
        </content>
        
    </entry>

</feed>