<?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>World Comes Home &#187; Blog</title>
	<atom:link href="http://www.worldcomeshome.com/category/artikel/feed" rel="self" type="application/rss+xml" />
	<link>http://www.worldcomeshome.com</link>
	<description>webdesign &#38; more by w.c.h. internet media</description>
	<lastBuildDate>Tue, 28 Feb 2012 12:20:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Facebook Apps und Datenschutz</title>
		<link>http://www.worldcomeshome.com/artikel/facebook-apps-und-datenschutz.html</link>
		<comments>http://www.worldcomeshome.com/artikel/facebook-apps-und-datenschutz.html#comments</comments>
		<pubDate>Wed, 08 Feb 2012 13:38:25 +0000</pubDate>
		<dc:creator>o.d.</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[Datenschutz]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Geburtstagskalender]]></category>

		<guid isPermaLink="false">http://www.worldcomeshome.com/?p=229</guid>
		<description><![CDATA[&#8230;passen zumindest nach den Datenschutzrichtlinien in Deutschland nicht ganz zusammen. Wieder und wieder wird fast gebetsmühlenartig darauf hingewiesen, daß es Facebook mit der Datensicherheit nicht so ganz genau nimmt. Eigentlich ist es jedem bewusst, nur beachtet wird es so gut wie nie. Die Social Media Marketing Agentur Regensburg hat am Beispiel der oft genutzten Geburtstagskalender-App sehr anschaulich aufgezeigt, was mit ...]]></description>
			<content:encoded><![CDATA[<p>&#8230;passen zumindest nach den Datenschutzrichtlinien in Deutschland nicht ganz zusammen. Wieder und wieder wird fast gebetsmühlenartig darauf hingewiesen, daß es Facebook mit der Datensicherheit nicht so ganz genau nimmt. Eigentlich ist es jedem bewusst, nur beachtet wird es so gut wie nie.</p>
<p>Die <a title="Warum man nicht jede App auf Facebook nutzen sollte" href="http://www.smmar.de/2012/01/geburtstagskalender-warum-man-nicht-jede-app-auf-facebook-nutzen-sollte/" target="_blank">Social Media Marketing Agentur Regensburg</a> hat am Beispiel der oft genutzten Geburtstagskalender-App sehr anschaulich aufgezeigt, was mit den eigentlich persönlichen Daten der Facebook-User passiert und wie sie weiterverarbeitet werden.</p>
<p><a href="http://www.smmar.de/2012/01/geburtstagskalender-warum-man-nicht-jede-app-auf-facebook-nutzen-sollte/" class="fancy_link target_blank">zum Artikel &#x2192;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.worldcomeshome.com/artikel/facebook-apps-und-datenschutz.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress, TinyMCE &amp; der iFrame</title>
		<link>http://www.worldcomeshome.com/artikel/wordpress-tinymce-und-der-iframe.html</link>
		<comments>http://www.worldcomeshome.com/artikel/wordpress-tinymce-und-der-iframe.html#comments</comments>
		<pubDate>Tue, 31 Jan 2012 12:06:18 +0000</pubDate>
		<dc:creator>o.d.</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[iFrame]]></category>
		<category><![CDATA[TinyMCE]]></category>
		<category><![CDATA[Wordpress]]></category>
<category>Code</category><category>iFrame</category><category>TinyMCE</category><category>Wordpress</category>
		<guid isPermaLink="false">http://www.worldcomeshome.com/?p=226</guid>
		<description><![CDATA[Wer schon einmal versucht hat, unter WordPress in der visuellen Ansicht des TinyMCE-Editors einen iFrame einzusetzen, kennt das Problem: nach dem Speichern ist der iFrame weg. Auch das Arbeiten in der HTML-Ansicht hilft nur bedingt, spätestens beim Wechsel zur visuellen Ansicht verschwinden die Tags wieder. Um dieses etwas zu selbstständige Verhalten zu unterbinden, helfen diese paar Zeilen Code in der ...]]></description>
			<content:encoded><![CDATA[<p>Wer schon einmal versucht hat, unter WordPress in der visuellen Ansicht des TinyMCE-Editors einen iFrame einzusetzen, kennt das Problem:<br />
nach dem Speichern ist der iFrame weg. Auch das Arbeiten in der HTML-Ansicht hilft nur bedingt, spätestens beim Wechsel zur visuellen Ansicht verschwinden die Tags wieder.<br />
Um dieses etwas zu selbstständige Verhalten zu unterbinden, helfen diese paar Zeilen Code in der functions.php des gerade verwendeten Themes:</p>
<pre class="fancy_code_box">
add_filter('tiny_mce_before_init', create_function( '$a',
'$a["extended_valid_elements"] =
"iframe[id|class|title|style|align|frameborder|height|longdesc|marginheight|marginwidth|name|scrolling|src|width]";
return $a;') );
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.worldcomeshome.com/artikel/wordpress-tinymce-und-der-iframe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>17 Kostenlose Brushes</title>
		<link>http://www.worldcomeshome.com/artikel/17-kostenlose-brushes.html</link>
		<comments>http://www.worldcomeshome.com/artikel/17-kostenlose-brushes.html#comments</comments>
		<pubDate>Fri, 27 Jan 2012 10:38:50 +0000</pubDate>
		<dc:creator>o.d.</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Freebies]]></category>
		<category><![CDATA[Brushes]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[Photoshop]]></category>
		<category><![CDATA[Pinsel]]></category>
<category>Brushes</category><category>Download</category><category>free</category><category>Freebies</category><category>Photoshop</category><category>Pinsel</category>
		<guid isPermaLink="false">http://www.worldcomeshome.com/?p=223</guid>
		<description><![CDATA[Hier ist eine Sammlung von 17 großen Photoshop Pinsel-Sets, die frei download- und benutzbar sind. Die Brushes sind meist CS2 und CS3 kompatibel und frei für kommerziellen und nicht-kommerzielle Projekte zu verwenden. Viel Spaß!]]></description>
			<content:encoded><![CDATA[<p>Hier ist eine Sammlung von 17 großen Photoshop Pinsel-Sets, die frei download- und benutzbar sind. Die Brushes sind meist CS2 und CS3 kompatibel und frei für kommerziellen und nicht-kommerzielle Projekte zu verwenden. Viel Spaß!</p>
<p><a href="http://photoshop-freebies.com/photoshop-brushes/17-amazing-free-photoshop-brushes.php" class="fancy_link">zum Download &#x2192;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.worldcomeshome.com/artikel/17-kostenlose-brushes.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress und Webseiten absichern</title>
		<link>http://www.worldcomeshome.com/artikel/wordpress-und-webseiten-absichern.html</link>
		<comments>http://www.worldcomeshome.com/artikel/wordpress-und-webseiten-absichern.html#comments</comments>
		<pubDate>Wed, 25 Jan 2012 16:50:08 +0000</pubDate>
		<dc:creator>o.d.</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[absichern]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Webseite]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[WordPress Codex]]></category>
<category>.htaccess</category><category>absichern</category><category>Code</category><category>Security</category><category>Webseite</category><category>Wordpress</category><category>WordPress Codex</category>
		<guid isPermaLink="false">http://www.worldcomeshome.com/?p=76</guid>
		<description><![CDATA[In den letzten Jahren ist Sicherheit zu einem der wichtigsten Anliegen im Web geworden. Hacker gab es schon immer, aber mit der Zunahme der EDV-Kenntnisse und der Erleichterung des Zugangs für praktisch alle Daten ist das Problem exponentiell größer geworden. Dieser Anstieg hat jedoch die Entwickler vorangetrieben, besseren Code zu schreiben und die Framework-Anbieter haben viele neue Funktionen implementiert, um ...]]></description>
			<content:encoded><![CDATA[<p>In den letzten Jahren ist Sicherheit zu einem der wichtigsten Anliegen im Web geworden. Hacker gab es schon immer, aber mit der Zunahme der EDV-Kenntnisse und der Erleichterung des Zugangs für praktisch alle Daten ist das Problem exponentiell größer geworden. Dieser Anstieg hat jedoch die Entwickler vorangetrieben, besseren Code zu schreiben und die Framework-Anbieter haben viele neue Funktionen implementiert, um Programmierer in ihrem Kampf gegen die &#8220;dunkle Seite&#8221; zu helfen.</p>
<p>Weil Daten-Validierung und -Kontrolle bereits einen Großteil sowohl der internen Sicherheitsmaßnahmen als auch der normalen Input-Verarbeitung ausmachen, sollte durch die Sicherung des Quellcodes nicht nur der Schutz unserer Backends verbessert werden, sondern auch eine bessere, solidere User Experience bieten.</p>
<p>Obwohl ein großer Teil dieses Artikels ist speziell für WordPress gilt, sind dies doch zu einem erheblichen Teil allgemeine Praktiken, die jeder nutzen kann und sollte. Selbst die WordPress-spezifischen Abschnitte enthalten nützliche &amp; lesenswerte Logiken, auch wenn ein anderes Framework verwendet wird.<br />
<span id="more-76"></span></p>
<h3>Exploits</h3>
<p>Mit URL-basierten Exploits suchen Hacker Schwachstellen auf Ihrer Website, indem sie URLs aufrufen, die in aller Regel einen Fehler zurückgeben &#8211; aber manchmal eben doch funktionieren.</p>
<blockquote><pre class="fancy_code_box">http://mysite.com/trying/to/exploit/%2F/config</pre>
</blockquote>
<p>Die oben aufgeführte hypothetische  URL ist im Wesentlichen nichts anderes als ein &#8220;Schuß ins Blaue&#8221;. Aber wenn der Server dem Aufruf stattgibt, obwohl die URL eindeutig nicht dazu geeignet ist, eine Seite aufzurufen, kann ihm diese URL von Nutzen sein.</p>
<p><strong>Die .htaccess als Firewall nutzen</strong></p>
<p>Eine der besten Methoden gegen Angriffe dieser Art ist eine .htaccess-Firewall. Sie beruht im Wesentlichen auf Regeln, die automatisch string-basierte Aufrufe aus URLs blockiert.</p>
<p>Beispiel: Es gibt keinen vernünftigen Grund, öffnende eckige Klammern in einer URL zu nutzen. Wenn ein URL-Aufruf eckige Klammern enthält, dann hat sich der User entweder vertippt, oder ein Angreifer sucht nach einer Sicherheitslücke: In jedem Fall ist die Ausgabe einer &#8220;403 &#8211; Forbidden&#8221; &#8211; Seite erste Wahl:</p>
<blockquote><pre class="fancy_code_box">RedirectMatch 403 \[</pre>
</blockquote>
<p>Kopieren Sie diese Code-Zeile einfach in Ihre .htaccess, damit werden alle Aufrufe mit eckigen Klammern geblockt.</p>
<p>Um mehr als nur eckige Klammern zu überwachen, wird ein komplexeres Regelwerk benötigt. Zum Glück gibt es Programmierer wie <a href="http://perishablepress.com" class="fancy_link">Jeff Starr &#x2192;</a>, der sich eingehend mit diesem Thema beschäftigt und ein großartiges Regelwerk für .htaccess-gesteuerte Zugriffskontrollen erarbeitet hat. Die neueste Variante nennt sich 5G Firewall und ist komplett kostenlos.</p>
<p style="text-align: center;"><a href="http://perishablepress.com/5g-firewall-beta/" class="fancy_link"><strong>5G Firewall Copy &amp; Paste HIER</strong> &#x2192;</a></p>
<p>Die Firewall ist modular, Sie können Zeilen löschen, ohne die Funktionalität einzuschränken. Falls etwas schiefgeht, können Sie sich problemlos Zeile für Zeile durcharbeiten, bis der Eintrag gefunden ist, der den Fehler verursacht. Die betreffende Zeile löschen oder auskommentieren - den Rest weiterverwenden, einfacher geht es kaum.</p>
<h3>Verzeichnisschutz</h3>
<p>Auf vielen Servern ist es möglich, den Inhalt eines Verzeichnisses anzuzeigen, indem man einfach dessen URL angibt.</p>
<blockquote><pre class="fancy_code_box">http://myblog.com/wp-content/uploads/2011/08/</pre>
</blockquote>
<p>Der Aufruf dieser typischen WordPress URL listet den gesamten Inhalt des Ordners auf, alle Uploads vom August 2011 sind sichtbar. Möglicherweise ist das gewollt, kann (und sollte) aber abgeschaltet oder eingeschränkt werden - mit der guten alten .htaccess.</p>
<blockquote><pre class="fancy_code_box">Options -Indexes</pre>
</blockquote>
<p>Dieser Eintrag in der .htaccess verhindert das Auflisten des Verzeichnisinhaltes, der User erhält eine "403 - Forbidden" Fehlermeldung, sobald er das Verzeichnis direkt aufruft. Die allermeisten Webseitenbetreiber kennen diese Regel, wissen aber nicht, daß diese Regel mittels der "IndexIgnore"-Direktiven verfeinert werden können:</p>
<blockquote><pre class="fancy_code_box">IndexIgnore *
IndexIgnore *.php
indexIgnore *.jpg *.gif *.png</pre>
</blockquote>
<p>Wenn das Verzeichnislisting nicht deaktiviert ist, dann wird:</p>
<ul class="fancy_list">
<li class="arrow_list">mit der ersten Zeile zwar das Verzeichnis angezeigt, aber keine Datei</li>
<li class="arrow_list">mit der zweiten Zeile der Inhalt des Verzeichnisses mit Ausnahme der .php-Files angezeigt</li>
<li class="arrow_list">mit der dritten Zeile werden alle Dateien außer .jpg, .gif und .png-Files aufgelistet</li>
</ul>
<p>Die meisten Hoster haben das Verzeichnislisting standardmäßig deaktiviert, so daß keine Änderungen an der .htaccess nötig sind, falls Sie sich nicht sicher sein sollten, tippen Sie einfach einen Verzeichnispfad ein und sehen, was passiert.</p>
<p><strong>Zusätzlicher Server-Level Schutz</strong></p>
<p>Bisher haben die Maßnahmen, die wir ergriffen haben nichts mit dem eigentlichen Code unserer Webseite zu tun. Egal wie sicher Ihr Code ist, Sie MÜSSEN den bisher angegebenen Tipps Ihr Augenmerk schenken. Wir haben leider keine Zeit, alle Tipps und Tricks für die .htaccess auszuarbeiten, aber Sie können durchaus noch mehr tun:</p>
<ul class="fancy_list">
<li class="arrow_list">Verzeichnisse mit Passwörtern absichern</li>
<li class="arrow_list">Intelligente Redirects</li>
<li class="arrow_list">IP- oder IP-Bereichsabhängige Zugriffssteuerung</li>
<li class="arrow_list">Hotlink-Schutz</li>
<li class="arrow_list">Download-Management</li>
<li class="arrow_list">...</li>
</ul>
<p>Wir empfehlen an dieser Stelle die <a href="#weiterlesen" class="fancy_link">Weiterführende Literatur &#x2192;</a> - Sektion am Ende dieses Artikels. Dort finden Sie mit Sicherheit genügend weiterführende Informationen, so daß Sie sich am Ende doch noch mit Ihrer .htaccess anfreunden können.<br />
Sicherlich wird das Eine oder Andere anfangs eher verwirrend wirken, und ein solides Wissen ist sicher nicht leicht zu erarbeiten - doch wer dieses Wissen einmal hat, kann es sehr wirksam einsetzen.</p>
<h3>Schutz vor böswilligen Benutzern</h3>
<p>Die zweite Art von Problemen kann immer dann auftauchen, wenn jemand etwas tut, was er nicht hätte tun sollen. Damit sind sowohl User gemeint, die wissentlich Aktionen ausführen, als auch die berühmt-berüchtigten DAU's (<em>Dau: Dümmster anzunehmender User</em>) und/oder PEBKAC's (<em>PEPCAC:Problem exists between keyboard and chair - Problem existiert zwischen Tastatur und Stuhl</em>).</p>
<p>Falls sich beispielsweise User irgendwo im Administrationsbereich befinden können, könnte z.B. die Möglichkeit bestehen, daß ein Link zum löschen von Usern angezeigt wird. Dieser Link zeigt beispielsweise auf dieses Script:</p>
<blockquote><pre class="fancy_code_box">http://mysite.com/admin/scripts/delete_user.php?user_id=5</pre>
</blockquote>
<p>Dieses Szenario scheint zugegebenermaßen etwas weit hergeholt, die Chance, daß jemand über solch einen Link stolpert ist relativ gering. Aber:<br />
Wenn Verzeichnislisting aktiviert und kein Verzeichnisschutz eingerichtet ist, könnte auch ein Unbefugter über den Verzeichnisaufruf (http://mysite.com/admin/scripts/) das Script delete_user.php finden und damit versuchen einen oder mehrere User zu löschen.<br />
Falls nun das Script nicht prüft, ob der User die Aktion ausführen DARF (<strong>Authority</strong>) und WILL (<strong>Intent</strong>), ja dann können die User von jedem, der dieses Script ausführen KANN (<strong>Knowledge</strong>), gelöscht werden.</p>
<h3>Authority, Intent &amp; Knowledge</h3>
<p>Wann immer ein User eine Aktion ausführen will, haben wir zwei Dinge zu berücksichtigen:<br />
Hat der User die nötige Berechtigung, um die Aktion durchzuführen? Wenn der User über die nötigen Rechte verfügt, weiß er dann auch, was er tut?</p>
<p>Beispiel: Sie haben festgelegt, daß nur Administratoren Inhalte Ihrer Webseite bearbeiten und/ oder löschen können. Immer wenn ein User versucht, Inhalte zu verändern/ zu löschen, ist damit sichergestellt, daß er als Administrator angemeldet sein MUSS. Soweit zum Part Authority.</p>
<p><strong>Intent</strong> läßt sich ebenfalls mit einem Beispiel beschreiben. Denken wir uns, man kann den folgenden Link zum Löschen von Kommentaren verwenden:</p>
<blockquote><pre class="fancy_code_box">http://mysite.com/admin/scripts/delete_comment.php?comment_id=5</pre>
</blockquote>
<p>Das Script selbst prüft, ob der betreffende User momentan als Administrator angemeldet ist - die Frage der Berechtigung wäre ja soweit geklärt, kann er jetzt noch Schaden anrichten? Sicher kann er!<br />
Ein Hacker könnte auf einer Webseite einen Link zu diesem Script setzen:</p>
<blockquote><pre class="fancy_code_box">&lt;a href="http://mysite.com/admin/scripts/delete_comment.php?comment_id=5"&gt;
Super-Happy Times Here!
&lt;/a&gt;</pre>
</blockquote>
<p>Weil so ziemlich jedermann "Super-Happy Times" mag, werden viele User den Link auch anklicken. In 99% der fälle passiert - nichts. Wenn aber ein User als Admin auf <em>mysite.com</em> angemeldet ist und gleichzeitig den Link auf der Webseite des Hackers klickt, wird die Aktion ausgeführt - ohne weitere Rückfrage, obwohl der betreffende User diese Aktion ja nicht ausführen will.</p>
<p>Sie denken jetzt sicher, die Chancen, daß so etwas passiert, sind astronomisch gering. Einerseits stimmt das, andererseits aber auch nicht, denn ein Hacker kann so etwas extrem einfach und vor allem automatisiert ausführen. Millionen Menschen erhalten täglich Spam-Emails mit falschen Links. Die meisten von Ihnen löschen diese, oder markieren Sie als Spam, aber einer wird die Mail sicher öffnen und den Link klicken. Ein Hacker wird den Link sicher auch nicht auf seiner eigenen Webseite haben - es genügt eine fremde Webseite zu knacken und den Link dort einzubetten. Bis das jemand bemerkt kann (und wird) es zu spät sein.</p>
<h4>Berechtigungen in WordPress</h4>
<p>WordPress hat ein integriertes Berechtigungs-System. Sogenannte "integrierte Berechtigungen (Capabilities)" sind die Grundlage des ganzen Systems "Rollen und Berechtigungen." Rollen (Roles) sind nur eine Möglichkeit, einen Satz von Berechtigungen zusammenzustellen.</p>
<p>Wenn ein User die "<code>delete_posts</code>" Berechtigung hat, dann darf er auch nur Posts löschen. Darf er Posts bearbeiten, darf er auch nur das. Es sind einige Berechtigungen vorgegeben, die zu einer Rolle zusammengefasst werden können, es können aber auch eigene Berechtigungen vergeben werden.</p>
<p>Rollen sind vom Grundsatz her erstmal nur ein "Bündel" Berechtigungen. Ein User mit der Rolle "Mitarbeiter" hat standardmäßig drei Berechtigungen: <code>read, delete_posts, edit_posts</code>. Damit kann der User (alle) Posts lesen, aber nur EIGENE Posts bearbeiten oder löschen. Berechtigungen können jedem User einzeln zugewiesen werden, sie sinnvoll als Rolle zusammenzufassen und an User-Gruppen zu vergeben, ist aber einfacher und praktikabler.</p>
<p>Das behalten wir im Hinterkopf und sehen, wie WordPress-Funktionen genutzt werden können, um sicherzustellen, daß User die benötigte Berechtigung besitzen, um Aktionen auszuführen.</p>
<blockquote><pre class="fancy_code_box">
if(current_user_can("delete_users")) {
wp_delete_user(5);
}
else {
die("Sie haben nicht die nötige Berechtigung");
}
</pre>
</blockquote>
<p>Hier ist sichergestellt, daß der User andere Benutzer löschen darf. Die Funktion <code>current_user_can()</code> benötigt ein Argument. Dies kann sowohl eine Rolle als auch eine Berechtigung sein. Wir könnten z.B. Editoren, (die das normalerweise nicht dürfen) diese Aktion trotzdem ausführen lassen:</p>
<blockquote><pre class="fancy_code_box">
if(current_user_can("editor")) {
wp_delete_user(5);
}
else {
die("Sie müssen Editor sein, um User löschen zu können");
}
</pre>
</blockquote>
<p>Mit dieser Variante sollten Sie aber vorsichtig sein, denn Rollen sind hierfür (eigentlich) nicht vorgesehen. Diese Funktion benötigt nicht mindestens die Rolle "Editor", sondern EXAKT die Rolle "Editor". Das bedeutet im Umkehrschluß natürlich, daß ein Administrator diese Funktion nicht ausführen kann, obwohl er in der Rollen-Hierarchie oberhalb des Editors steht. Aus diesem Grund sollten in diesen Funktionen Berechtigungen an Stelle von Rollen angegeben werden.</p>
<p><strong>Zwei ähnliche Aufrufe</strong></p>
<p>Zwei weitere ähnliche Funktionen ermöglichen es Ihnen, die Berechtigungen von anderen Benutzern als dem aktuell Angemeldeten untersuchen.</p>
<blockquote><pre class="fancy_code_box">
// Funktion 01:
if(user_can(5, "manage_links")) {
echo "User 5 darf Links managen";
}
else {
echo "User 5 ist nicht berechtigt, Links zu managen";
}

// Funktion 02
if(author_can(1879, "update_themes")) {
echo "Der Autor des Artikels #1879 darf Themes updaten";
}
else {
echo "Der Autor des Artikels #1879 darf Themes nicht updaten";
}
</pre>
</blockquote>
<p>Die Funktion 01 <code>user_can(Argument 01, Argument 02)</code> prüft, ob der angegebene User die angegebene Rolle (oder Berechtigung) besitzt, also User und Berechtigung zusammenpassen. Das erste Argument ist die User-ID oder ein User-Objekt (Post, Seite...), das zweite Argument ist die Rolle oder Berechtigung, die geprüft wird.</p>
<p>Gleiches gilt für die Funktion 02 <code>author_can(Argument 01, Argument 02)</code> mit dem Unterschied, daß hier der Zusammenhang zwischen Autor und Artikel geprüft wird.</p>
<h4>"Wollen Sie das wirklich?" in WordPress</h4>
<p>Zu prüfen, ob die gewählte Aktion wirklich gewollt ausgeführt werden soll (Intent), ist etwas schwieriger zu prüfen. In den "guten, alten Zeiten" war die Referrer-Überprüfung (<code>$_SERVER['HTTP_REFERRER']</code>) der geeignete Weg. Hier wird (wurde) die Seite abgefragt, von der der User kam. War der Domainname derselbe wie der Eigene, war der User erst einmal OK...bis etwas schiefging.</p>
<p>Eine sicherere Methode wurde mit WordPress 2.03 (lang ist's her...) eingeführt - die sogenannten "Nonces". Nonce bedeutet "<strong>Number used once</strong>" und wird in der Kryptographie für sichere Kommunikation benutzt. Die Nonce ist eine Nummer die generiert wird, bevor die Aktion initialisiert ist, an den Aktionsaufruf (Link, Formular-Buttons) angehängt und überprüft wird, bevor die Aktion ausgeführt wird.</p>
<p>In WordPress werden Nonces generell in Formularen und Links genutzt. Sehen wir uns an, wie eine Nonce in einem Formular generiert wird:</p>
<h4>Nonces in Formularen</h4>
<blockquote><pre class="fancy_code_box">
&lt;form id="myform" action="mein-script.php" method="post"&gt;
&lt;strong&gt;Geben Sie ein Wort ein:&lt;/strong&gt; &lt;input type="text" name="word" /&gt;
&lt;?php wp_nonce_field('meine_nonce') ?&gt;&lt;/form&gt;
</pre>
</blockquote>
<p>Das generiert ein hidden-field in Ihrem Formular, das die generierte Nonce enthält. Die WordPress-interne Funktion <code>wp_nonce_field(1,2,3,4)</code> verwendet vier Parameter:</p>
<ol>
<li>Der erste Parameter ist optional, aber empfohlen. Er gibt der Nonce eine eindeutige Kennung.</li>
<li>Der zweite Parameter ist der Name des Feldes. Auch dieser Parameter ist optional, standardmäßig lautet er <code>_wpnonce</code></li>
<li>Der dritte Parameter ist Boolean (true/false). ist er auf "True" gesetzt, sendet er den Referrer mit zur Überprüfung)</li>
<li>Der vierte Parameter ist ebenfalls Boolean, er prüft, ob das Feld korrekt gefüllt ist und stoppt bei Bedarf.</li>
</ol>
<p>Das generierte hidden-field sollte so aussehen:</p>
<blockquote><pre class="fancy_code_box">
&lt;input id="_wpnonce" type="hidden" name="_wpnonce" value="d6d71w4664" /&gt;</pre>
</blockquote>
<p>Jetzt haben wir zu prüfen, ob alle Werte vorhanden sind und stimmen, bevor das Formular verarbeitet wird:</p>
<blockquote><pre class="fancy_code_box">
if (!wp_verify_nonce($_POST['_wpnonce'],'meine_nonce') ) {
die('Oops, Ihre Nonce stimmt nicht');
}
else {
mein_inserter($_POST["word"]);
}
</pre>
</blockquote>
<p>Zur Überprüfung verwenden wir die Funktion <code>wp_verify_nonce()</code>. Diese Funktion verwendet ebenfalls zwei Parameter: der erste ist der Wert des Nonce-Feldes, der zweite der Name der Aktion, den wir festgelegt haben. (Erster Wert in der Funktion <code>wp_nonce_field()</code>). Passt der Wert, wird das Formular verarbeitet (<em>true</em>), wenn nicht, wird die Verarbeitung abgebrochen (<em>false</em>).</p>
<h4>Nonces in Links</h4>
<p>Hin und wieder verwenden Sie eventuell einen Link anstelle eines Formulars, um eine Aktion auszulösen. Das sollte typischerweise so aussehen:<br />
<code>http://mysite.com/admin/scripts/mach-das.php?mach-das_id=231</code></p>
<p>Um eine Nonce dafür zu generieren, können wir diese Funktion verwenden:</p>
<blockquote><pre class="fancy_code_box">
$base_url = "http://mysite.com/admin/scripts/mach-das.php?mach-das_id=231";
$nonce_url = wp_nonce_url( $base_url, "mach-das_nonce");
echo "&lt;a href="".$nonce_url.""&gt;Mach das&lt;/a&gt;";
</pre>
</blockquote>
<p>Der Link sollte dann in Etwas so aussehen:<br />
<code>http://mysite.com/admin/scripts/mach-das.php?mach-das_id=231&amp;_wpnonce=d6f77f1364</code></p>
<p>Die Überprüfung erfolgt, wie bereits oben beschrieben:</p>
<blockquote><pre class="fancy_code_box">
if (!wp_verify_nonce($_GET['_wpnonce'],'mach-das_nonce') ) {
die('Oops, Ihre Nonce stimmt nicht.');
}
else {
mach-das($_GET["mach-das_id"]);
}
</pre>
</blockquote>
<h4>Alles gleichzeitig?</h4>
<p>Wir müssen aber auf beide Aspekte gleichzeitig achten, es ist aber lange nicht so kompliziert, wie man meinen könnte. Nehmen wir als Beispiel einen Link, mit dem Kommentare gelöscht werden können:</p>
<blockquote><pre class="fancy_code_box">
$nonce_url = wp_nonce_url("http://mysite.com/scripts/delete_comment.php?comment_id=1451", "delete_comment_nonce");
echo "&lt;a href='".$nonce_url."'&gt;dispose of this comment&lt;/a&gt;";
</pre>
</blockquote>
<p>Hier überprüfen wir die Berechtigungen und die Nonce:</p>
<blockquote><pre class="fancy_code_box">
if (wp_verify_nonce($_GET['_wpnonce'],'delete_comment_nonce') AND current_user_can("edit_comment")) {
wp_delete_comment($_GET["comment_id"]);
}
else {
die('Oops, Ihre Nonce stimmt nicht, oder Sie haben nicht genügend Rechte.');
}
</pre>
</blockquote>
<h4>Datensicherheit und -Validierung</h4>
<p>Unsere Arbeit ist soweit erstmal getan, aber wenn Sie schon eine Weile als Entwickler gearbeitet haben, dann wissen Sie - fertig ist man nie. Eine weitere Sicherheitsebene sollte verwendet werden, um unsaubere bzw.unsichere Daten von unserer Datenbank fernzuhalten. Diese Ebene nennt man dan Daten-Desinfektion (<em>Sanitization</em>).</p>
<p>Eine kurze Erklärung: Daten-Desinfektion bedeutet nichts anderes, als den Datensatz zu prüfen und bei Bedarf zu "reinigen", um verdächtige Inhalte gar nicht erst den Weg in die Datenbank finden zu lassen. Daten-Validierung bezieht sich auf ALLE Arten der Datenprüfung und wird daher landläufig auch bei Formularprüfungen (Feld ausgefüllt, richtiger Inhalt im Formularfeld...) verwendet. Dieser Aspekt der Datenprüfung ist zwar auch wichtig, wir wollen uns aber an dieser Stelle mehr mit den sicherheitsrelevanten Überprüfungen befassen.</p>
<p>Das wichtigste, wogegen wir unsere Datenbank absichern müssen,ist die SQL-Injection. Das ist eine Technik, die von Hackern angewendet wird, um Schwächen innerhalb der Datenbank(struktur) aufzuspüren und natürlich auszunutzen. Auch hier natürlich ein Beispiel:<br />
Jemand besucht Ihre Webseite und und tippt in die Suchmaske das Wort <strong>Elefant'</strong>. Zu beachten ist hier das Apostroph am Ende des Wortes. Ein Suchscript arbeitet jetzt wie folgt:</p>
<blockquote><pre class="fancy_code_box">
SELECT ID, post_title FROM wp_posts WHERE post_title LIKE '%elephant'%'
</pre>
</blockquote>
<p>In diesem Beispiel wird die Suche mit einer Fehlermeldung abgebrochen, da das Apostroph zuviel ist, und as nachfolgende damit nicht geschlossen ist. Passieren kann hier erstmal nichts, da das Script ja mit einer Fehlermeldung abgebrochen wurde, aber derjenige der diese Suche ausgeführt hat, weiß jetzt natürlich, daß hier keine Datenvalidierung ausgeführt wird. Da können die Probleme beginnen.<br />
In manchen Fällen kann auch SQL selbst gefährlich agieren, oder dem potentiellen Hacker mehr Informationen liefern, als Ihnen lieb sein kann. Auch hier ein Beispiel:</p>
<p>Als Seitenadministrator versuchen Sie über eine Suchfunktion die passende Email-Adresse zu einem Benutzernamen zu finden:<br />
"Normale" Abfrage:</p>
<blockquote><pre class="fancy_code_box">
SELECT user_email FROM wp_users WHERE user_login = 'danielp'
</pre>
</blockquote>
<p>Wenn unser Hacker nun eine SQL Injection ausführen will, könnte er ein <code>OR 1=1</code> in das Suchfeld eingeben, was in folgender Abfrage enden würde:</p>
<blockquote><pre class="fancy_code_box">
SELECT user_email FROM wp_users WHERE user_login = '' OR 1=1 ''
</pre>
</blockquote>
<p>Als Suchergebnis erhält er nun ALLE Email-Adressen aus der Datenbank, denn er erhält die Adressen, bei denen der Benutzername leer ist (<code>user_login=''</code>), und er erhält alle Adressen, bei denen 1=1 ist (<code>OR 1=1</code>). Da 1=1 immer TRUE zurückgibt, werden alle Adressen ausgeliefert.</p>
<p>Es gibt zwei Wege, dieses Problem zu beseitigen, beide zu verwenden ist der sicherere Weg.<br />
In Runde 1 überprüfen wir die Daten in den Formularfeldern auf korrekte Eingabe. Wenn eine Email-Adresse angegeben werden soll, können wir dafür sorgen, daß auch nur eine Email-Adresse eingetragen ist. Das ist zu prüfen, <strong>bevor</strong> das Formular abgesendet werden kann.<br />
In Runde 2 werden alle Zeichen entfernt, die die datenbankabfrage stören könnten. Dazu gehört typischerweise das Entwerten von Apostrophen und Anführungszeichen per Backslash (<code>\"Diese Zeichen sind entwertet...\"</code>), um die Datenbankabfrage sauber zu halten. Für den Fall, daß ohne ein Framework (gleich welcher Art) gearbeitet wird, würde man hier <code>addslashes()</code> oder ähnliches verwenden, WordPress verwendet hier einen eigenen Weg.</p>
<p><strong>Datenvalidierung in WordPress</strong></p>
<p>Um mit der datenbank zu kommunizieren, verwendet WordPress die Klasse <code>$wpdb</code>. Alles darüber können Sie in dem Artikel <a href="http://wp.smashingmagazine.com/2011/09/21/interacting-with-the-wordpress-database/" class="fancy_link">WordPress Essentials: Interacting With the WordPress Database. <em>(engl.)</em> &#x2192;</a> lesen. Die Klasse bietet eine ganze Reihe an Möglichkeiten, Ihre Sorge um mögliche SQL_Injections zu vermindern.</p>
<p>Bevor wir uns tiefer in die Materie stürzen sehen wir uns natürlich wieder ein Beispiel an, um zu sehen, wie die Klasse arbeitet:</p>
<blockquote><pre class="fancy_code_box">
// einfache Datenbankabfrage
$wpdb-&gt;query("DELETE FROM wp_users WHERE user_id = 5");
// Abfrage für eine Zeile Daten
$posts = $wpdb-&gt;get_col("SELECT post_title FROM wp_posts WHERE post_status = 'publish' ORDER BY comment_count DESC LIMIT 0,10");
// Abfrage für eine Spalte daten
$post = $wpdb-&gt;get_row("SELECT * FROM wp_posts WHERE ID = 1453");
// Mehrere Zeilen und Spalten
$posts = $wpdb-&gt;get_results("SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'publish' ORDER BY post_date DESC LIMIT 0, 12 ");
// Einzelner Wert
$author_id = $wpdb-&gt;get_var("SELECT post_author FROM wp_posts WHERE ID = 2563");
// Eintrag in Datenbank einfügen
$wpdb-&gt;insert("wp_postmeta", array("post_id" =&gt; 2323, "meta_key" =&gt; "favorite_count", "meta_value" =&gt; 224 ), array("%d", "%s", "%d"));
// Eintrag in Datenbank updaten
$wpdb-&gt;update("wp_postmeta", array("meta_value" =&gt; 225), array("meta_key" =&gt; "favorite_count", "post_id" =&gt; 2323), array("%d"), array("%s", "%d"));
</pre>
</blockquote>
<p>Die <code>insert()</code> und <code>update()</code>-Methoden sind gute Hilfsmethoden, weil sie, abgesehen von einer gewissen Modularisierung Ihrer Datenbank-Interaktionen auch die Datenüberprüfung übernehemen. Falls Sie die allgemeinen <code>query()</code>-Methoden verwenden wollen, müssen Sie die Datenvalidierung selbst übernehmen.<br />
Der einfachere Weg ist die Nutzung der <code>escape()</code>-Methode:</p>
<blockquote><pre class="fancy_code_box">
$data = $wpdb-&gt;escape($_POST[about_me]);
$wpdb-&gt;query("UPDATE wp_usermeta SET meta_value = '$data' WHERE meta_key = 'description' AND user_id = 154 ");
</pre>
</blockquote>
<p>Ein etwas schwierigerer, aber besserer Weg ist die<code>prepare()</code>-Methode: Ein Beispiel aus dem <a href="http://codex.wordpress.org/" class="fancy_link">WordPress-Codex &#x2192;</a> demonstriert das perfekt:</p>
<blockquote><pre class="fancy_code_box">
$metakey = "Harriet's Adages";
$metavalue = "WordPress' database interface is like Sunday Morning: Easy.";
$wpdb-&gt;query( $wpdb-&gt;prepare(
"
INSERT INTO $wpdb-&gt;postmeta
(post_id, meta_key, meta_value)
VALUES (Â %d,Â %s,Â %s)
",
10,
$metakey,
$metavalue
) );
</pre>
</blockquote>
<h4>Mehr Schutz durch weitere Daten-Desinfektion</h4>
<p>Sanitization ist ein ziemlich großes Thema und erfordert einige Zeit, um es zu meistern. Denn jetzt werden Sie vor allem damit beschäftigt sein, zu bestimmen welche Zeichen erlaubt, welche verboten sind und müssen Wege finden, letztere zu analysieren. Einige allgemeine Anforderungen an Sie sind das Herausfiltern von HTML aus Adressen, Zahlen aus Strings filtern, Email-Adressen validieren und so weiter. Allerdings werden Sie sicherlich Ihre eigenen Lösungen verwenden müssen, um komplexere Anforderungen zu meistern.<br />
Im Abschnitt <a href="#weiterlesen" class="fancy_link">Weiterführende Literatur &#x2192;</a> finden Sie mehr zu diesem Thema.</p>
<h4>Abschließende Gedanken</h4>
<p>Das Ausmaß an Aufwand, eine Webseite abzusichern, kann nicht in nur einem Buch behandelt werde, gaz zu schweigen von einem Artikel. Es gibt noch Unmengen Wege und Methoden, die hier nicht aufgeführt sind, wie z.B. Passwort-Verschlüsselung, Salts und so weiter. Aber wenn Sie die hier angeführten Methoden auf Ihren Webseiten einsetzen, haben Sie schon ein gutes Stück auf dem Weg zu einer sichereren Webseite getan.</p>
<h3><a name="weiterlesen"></a>Weiterführende Literatur</h3>
<div class="fancy_box">
<div class="fancy_box_content">
<strong>Allgemeine Links:</strong></p>
<ul class="fancy_list">
<li class="arrow_list"><a href="http://perishablepress.com/5g-firewall-beta/" class="fancy_link"><strong>5G Firewall</strong>, Perishable Press &#x2192;</a></li>
<li class="arrow_list"><a href="http://users.telenet.be/ws36178/security/webmaster/htaccess.html" class="fancy_link"><strong>Sicherheitstipps für die .htaccess</strong> &#x2192;</a></li>
<li class="arrow_list"><a href="http://en.wikipedia.org/wiki/SQL_injection" class="fancy_link"><strong>SQL Injection</strong>, Wikipedia &#x2192;</a></li>
<li class="arrow_list"><a href="http://www.unixwiz.net/techtips/sql-injection.html" class="fancy_link"><strong>SQL Injection Attacks by Example</strong>, Steve Friedl &#x2192;</a></li>
<li class="arrow_list"><a href="http://www.unixwiz.net/techtips/sql-injection.html" class="fancy_link"><strong>MySQL: SQL Injection Prevention</strong>, Tizag &#x2192;</a></li>
<li class="arrow_list"><a href="http://www.php.net/manual/en/function.filter-var.php" class="fancy_link"><strong>filter_var</strong>, PHP.net &#x2192;</a></li>
<li class="arrow_list"><a href="http://net.tutsplus.com/tutorials/php/sanitize-and-validate-data-with-php-filters/" class="fancy_link"><strong>Sanitize and Validate Data with PHP Filters</strong>, Nettuts+ &#x2192;</a></li>
</ul>
</div>
</div>
<div class="fancy_box">
<div class="fancy_box_content">
<strong>WordPress-spezifische Links:</strong></p>
<ul class="fancy_list">
<li class="arrow_list"><a href="http://codex.wordpress.org/Roles_and_Capabilities" class="fancy_link"><strong>Roles &amp; Capabilities</strong>, WordPress Codex &#x2192;</a></li>
<li class="arrow_list"><a href="http://www.garyc40.com/2010/04/ultimate-guide-to-roles-and-capabilities/" class="fancy_link"><strong>Ultimate Guide to Roles and Capabilities</strong>, Gary Cao &#x2192;</a></li>
<li class="arrow_list"><a href="http://markjaquith.wordpress.com/2006/06/02/wordpress-203-nonces/" class="fancy_link"><strong>WordPress 2.0.3: Nonces</strong>, Mark Jaquith &#x2192;</a></li>
<li class="arrow_list"><a href="http://www.prelovac.com/vladimir/improving-security-in-wordpress-plugins-using-nonces" class="fancy_link"><strong>Improving Security in WordPress Plugins using Nonces</strong>, Vladimir Prelovac &#x2192;</a></li>
<li class="arrow_list"><a href="http://codex.wordpress.org/WordPress_Nonces" class="fancy_link"><strong>WordPress Nonces</strong>, WordPress Codex &#x2192;</a></li>
<li class="arrow_list"><a href="http://codex.wordpress.org/Class_Reference/wpdb" class="fancy_link"><strong>Class Reference wpdb</strong>, WordPress Codex &#x2192;</a></li>
<li class="arrow_list"><a href="http://codex.wordpress.org/Data_Validation" class="fancy_link"><strong>Data Validations</strong>, WordPress Codex &#x2192;</a></li>
</ul>
</div>
</div>
<p><em>Dieser Artikel ist eine Übersetzung des des Posts "Securing your wordpress site" vom <a href="http://wp.smashingmagazine.com/2011/11/10/securing-your-wordpress-website/" class="fancy_link">Smashing Magazine &#x2192;</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.worldcomeshome.com/artikel/wordpress-und-webseiten-absichern.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Werbung im Content</title>
		<link>http://www.worldcomeshome.com/artikel/werbung-im-content.html</link>
		<comments>http://www.worldcomeshome.com/artikel/werbung-im-content.html#comments</comments>
		<pubDate>Fri, 25 Feb 2011 18:21:03 +0000</pubDate>
		<dc:creator>o.d.</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[adSense]]></category>
		<category><![CDATA[Banner]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[more Tag]]></category>
		<category><![CDATA[shorttag]]></category>
		<category><![CDATA[Werbung]]></category>
		<category><![CDATA[Wordpress]]></category>
<category>adSense</category><category>Banner</category><category>Code</category><category>more Tag</category><category>shorttag</category><category>Werbung</category><category>Wordpress</category>
		<guid isPermaLink="false">http://www.worldcomeshome.com/?p=53</guid>
		<description><![CDATA[Viele Blogger nutzen AdSense oder eines der bekannten Affiliate-Programme. Es ist ja auch relativ simpel, die dazugehörigen Codes in einem der Theme-Files wie <code>header.php, sidebar.php</code> oder <code>footer.php</code> unterzubringen.]]></description>
			<content:encoded><![CDATA[<p>Viele Blogger nutzen Google AdSense oder eines der bekannten Affiliate-Programme. Es ist ja auch relativ simpel, dazugehörigen Codes in einem der Theme-Files <code>header.php, sidebar.php</code> oder <code>footer.php</code> unterzubringen.</p>
<p>Erfolgreiche Webmaster wissen aber, dass Banner öfter angeklickt werden, wenn sie direkt im Text selbst eingebettet sind. Dafür gibt es in WordPress verschiedene Möglichkeiten, von denen hier zwei näher beleuchtet werden sollen.</p>
<p>Eine Möglichkeit ist, das <code>&lt;!-- more--&gt;</code> Tag durch ein Banner zu ersetzen. Für den Blogger, der dieses Tag häufig benutzt, ist dies ein relativ unkomplizierter Weg, seine Banner innerhalb seines Contents zu schalten. Dazu sind lediglich die folgenden Zeilen in der <code>functions.php</code> zu ergänzen:</p>
<pre class="fancy_code_box">
function more_ad($content) {
if ( !is_single() )
return $content;
$banner = '&lt;center&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-XXXXXXXXXXXXXX";
google_ad_slot = "XXXXXXXXXX";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/center&gt;';
$content = preg_replace('/&lt;span id\=\"(more\-\d+)"&gt;&lt;/span&gt;/', $banner, $content);
return $content;
}
add_filter( 'the_content', 'more_ad' );
</pre>
<p><em>Wichtig: Natürlich die beiden XXX-Blöcke durch die eigenen ID&#8217;s ersetzen&#8230;</em></p>
<p>Auf diese Weise wird in der <code>single.php</code> an der Stelle, an der das <code>&lt;!--more--&gt;</code> Tag gesetzt ist, das Banner eingeblendet.</p>
<blockquote class="pro"><p><strong>pro:</strong> Das Banner wird immer eingeblendet, wenn das <code>&lt;!--more--&gt;</code> Tag gesetzt ist, weitere Anpassungen sind nicht nötig.</p></blockquote>
<blockquote class="contra"><p><strong>contra:</strong> Das Banner wird nur eingeblendet, wenn das <code>&lt;!--more--&gt;</code> Tag gesetzt ist, die Position im Content ist abhängig von der Position des Tags.</p></blockquote>
<p>Variante zwei ist die Einbindung in den Content mittels <code>[shortcode]</code>, eine Variante, die eine größere Flexibilität in der Positionierung des Banners gewährleistet. Auch hier ist ein Eintrag in der <code>functions.php</code> des Themes notwendig:</p>
<pre class="fancy_code_box">
function my_ad() {
return '&lt;div id="my_adsense"&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-XXXXXXXXXXXXXX";
google_ad_slot = "XXXXXXXXXX";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/div&gt;';
}
add_shortcode( 'my_adsense', 'my_ad' );
</pre>
<p><em>Wichtig: Natürlich auch hier die beiden XXX-Blöcke durch die eigenen ID&#8217;s ersetzen&#8230;</em></p>
<p>Der Aufruf erfolgt dann mittels dem Shortcode <code>[my_adsense]</code>. In diesem Beispiel ist der AdSense-Code von einer <code>&lt;div id&gt;</code> umgeben, diese kann in der <code>style.css</code> nach belieben formatiert werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.worldcomeshome.com/artikel/werbung-im-content.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

