<?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>Yoda Condition &#187; Sicherheit</title>
	<atom:link href="http://yoda.neun12.de/artikel-tag/sicherheit/feed" rel="self" type="application/rss+xml" />
	<link>http://yoda.neun12.de</link>
	<description>Debuggen du musst</description>
	<lastBuildDate>Sun, 18 May 2014 13:49:01 +0000</lastBuildDate>
	<language>de-DE</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Zugriffsbeschränkungen</title>
		<link>http://yoda.neun12.de/artikel-30</link>
		<comments>http://yoda.neun12.de/artikel-30#comments</comments>
		<pubDate>Sat, 12 Mar 2011 10:37:52 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Themes]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=30</guid>
		<description><![CDATA[Wer Plugins oder Themes selber schreibt wird sich früher oder später auch Gedanken über die Dateizugriffe machen müssen. Nicht jeder soll von Außen Zugriff auf unsere Dateien haben, wir möchten doch ganz gerne steuern wer welche Datei aufrufen darf. Meistens ist ein Aufruf a lá http://www.example.com/wp-content/plugins/a-plugin/conection_data.php eher harmlos, da versucht wird das Script auszuführen anstatt [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Wer Plugins oder Themes selber schreibt wird sich früher oder später auch Gedanken über die Dateizugriffe machen müssen. Nicht jeder soll von Außen Zugriff auf unsere Dateien haben, wir möchten doch ganz gerne steuern wer welche Datei aufrufen darf.</p>
<p>Meistens ist ein Aufruf a lá <code>http://www.example.com/wp-content/plugins/a-plugin/conection_data.php</code> eher harmlos, da versucht wird das Script auszuführen anstatt es anzuzeigen. Nicht zuletzt bleibt aber jedoch die Möglichkeit via <code>include(_once)</code> und <code>require(_once)</code> das Script auch von entfernten Servern aus einzubinden und auszuführen.<br />
Wie dem auch sei, ein mulmiges Gefühl bleibt immer zurück wenn jeder auf alle möglichen Dateien einfach per Browser oder PHP-Funktion zugreifen kann. Daher ist es bereits jetzt Best Practice seine Scripte und Dateien mit einer Kontrolle vor solch ungewollten Zugriffe zu schützen.</p>
<p>In vielen Plugins sieht man solchen und vergleichbaren Code</p>
<pre class="brush:php">&lt;?php 
  if ( ! defined( 'My_PLUGIN_VAR' ) ) 
    die( 'No direct script access allowed' );
?&gt;</pre>
<p>In der Plugin-Datei wird eine Konstante definiert (<code>MY_PLUGIN_VAR</code>) und in allen anderen Dateien wird abgefragt ob diese Konstante definiert ist. Ist sie es nicht, wurde womöglich direkt auf diese Datei zugegriffen was unerwünscht ist. Es gibt hier verschiedene Techniken diese Kontrolle durchzuführen.<br />
Und die Plugin-Datei selber will ja auch noch davor geschützt sein direkt aufgerufen zu werden:</p>
<pre class="brush:php">&lt;?php 
  if ( ! function_exists( 'add_action' ) ) 
    die( 'No direct script access allowed' );
?&gt;</pre>
<p>Falls die Funktion <code>add_action</code> nicht definiert wurde, was darauf schließen lässt das WordPress nicht gestartet wurde, kann man von einem direkten Zugriff auf die Plugin-Datei ausgehen. Auch hier gibt es verschiedene Wege um zu prüfen ob WordPress bereits gestartet wurde oder nicht.</p>
<p>Das ist alles schön und gut, aber auch aufwendig und fehleranfällig. Stellen wir uns mal ein Plugin mit mehreren Unterverzeichnissen und in jedem Unterverzeichnis wiederum mehreren Dateien vor. Arbeitet man alleine an dem Plugin, ist es schon schwer den Überblick zu behalten ob man wirklich jede Datei geschützt hat. Bei einem Projekt an denen mehrere Personen mitarbeiten ist die Gefahr um so größer das einer der Mitarbeiter vergisst einen entsprechenden Schutz einzubauen. Und so wie Murphy es will, ist es ausgerechnet die Datei, mit den größten Schwachstellen die niemand kontrolliert hat.<br />
Hinzu kommt das man mit diesen Techniken unter Umständen nicht jede Datei schützen kann. In JavaScript-Dateien wird es schon schwer mit diesen Techniken einen unerwünschten Zugriff zu verhindern. Spätestens bei CSS-Dateien müsste man gänzlich aufgeben.</p>
<p>Besser wäre es wenn man zentral regeln könnte auf welche Dateien zugegriffen werden darf und welche nicht. Der Apache Webserver bietet uns solch eine Möglichkeit in Form von <code>.htaccess</code>. Dazu benötigen wir im Grunde genommen nur zwei Regeln. Eine die die erlaubten Zugriffe beinhaltet und eine die die unerlaubten Zugriffe beinhaltet.</p>
<pre class="brush:shell">&lt;FilesMatch "\.(php|xml)$"&gt;
    Order allow,deny
    Deny from all
&lt;/FilesMatch&gt;

&lt;FilesMatch "(\.txt|\.htm?l|index\.php)$"&gt;
  Order allow,deny
  Allow from all
&lt;/FilesMatch&gt;</pre>
<p>Im ersten Block verbieten wir sämtliche Zugriffe auf alle PHP- und XML-Dateien. Die Liste kann man noch um weitere Dateitypen erweitern, je nach Bedarf. Da wir aber nicht alle Zugriffe grundsätzlich sperren wollen, heisst ja <code>readme.txt</code> und nicht <code>readme_not.txt</code>, erlauben wir im zweiten Block den Zugriff auf bestimmte Dateitypen (<code>.txt</code> und <code>.htm[l]</code>), sowie auf die <code>index.php</code>. Auch hier kann man je nach Bedarf bestimmte Dateitypen und Dateien hinzufügen bzw. entfernen.<br />
Das Beste an der Sache ist aber, es wirkt sich auch auf alle Unterverzeichnisse aus, wir müssen uns also keine Gedanken darüber machen ob nicht zufällig die eine Datei, die die Schwachstelle im System darstellt, nicht geschützt ist.</p>
<p>Wo viel Licht ist, ist natürlich auch viel Schatten. Denn auf anderen Webservern als den Apache (z.B. lighttpd, IIS, usw.) funktioniert das natürlich nicht. Entweder man legt für jeden Webserver dann entsprechende Konfigurations-Dateien an, sofern möglich, prüft auf die Server-Software und verweigert den Dienst oder nutzt diese Technik nur zusätzlich um auf Nummer sicher zu gehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-30/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Login-Name des Autoren verschlüsseln</title>
		<link>http://yoda.neun12.de/artikel-29</link>
		<comments>http://yoda.neun12.de/artikel-29#comments</comments>
		<pubDate>Fri, 11 Mar 2011 14:38:02 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[Code-Snippets]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=29</guid>
		<description><![CDATA[Klaus stört es das der Login-Name des Autors bei den Post-Metadaten im Link erscheint. Das ist jetzt etwas schwurbelig ausgedrückt, für eine genauere Erklärung einfach beim Klaus nachlesen was er meint. Manchmal bin ich pingelig und mich stört so etwas auch. Logindaten egal welcher Art haben in Links und anderen öffentlich zugänglichen Bereichen einfach nichts [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a title="Login-Name in den Post-Metadaten" href="http://webdesign-passau.com/wordpress/wp-3-sicherheitsluecke-ausgabe-loginname/" target="_blank">Klaus</a> stört es das der Login-Name des Autors bei den Post-Metadaten im Link erscheint. Das ist jetzt etwas schwurbelig ausgedrückt, für eine genauere Erklärung einfach beim Klaus nachlesen was er meint.</p>
<p>Manchmal bin ich pingelig und mich stört so etwas auch. Logindaten egal welcher Art haben in Links und anderen öffentlich zugänglichen Bereichen einfach nichts zu suchen. Das widerspricht auch der Idee das man neben den Login-Namen auch noch zwei andere Namen in seinem Profil angeben kann und auswählen kann welchen Namen man gerne öffentlich verwenden möchte.</p>
<h3>Der Workaround</h3>
<p>Um das Problem zu lösen gibt es einen Workaround und eine Möglichkeit mit Filtern zu arbeiten. Zuerst der Workaround. WordPress bietet nämlich die Möglichkeit für jeden Autoren eine eigene Autoren-Seite anzulegen. Dieses Template wird zuerst gezogen bevor das allgemeine Template für alle anderen Autoren verwendet wird. Anders ausgedrückt: Existiert für den Autor X ein spezielles Template, wird dieses verwendet. Existiert kein solches Template, dann wird das allgemeine Template verwendet.<br />
Dabei sucht WordPress in folgender Reihenfolge nach einem passenden Template:</p>
<ol>
<li><code>author-{autor-name}.php</code></li>
<li><code>author-{autor-ID}.php</code></li>
<li><code>author.php</code></li>
</ol>
<p>Ist der Login-Name des Autoren z.B. &#8220;Klaus&#8221; und existiert ein Template <code>author-klaus.php</code>, wird zuerst dieses Template verwendet. Dies hilft uns in diesem Fall jedoch nicht weiter, da weiterhin der Login-Name verwendet wird.<br />
Jedoch kann man auch die ID des Autoren verwenden. Existiert ein Template author-12.php und hat der Autor &#8220;Klaus&#8221; die ID 12, dann wird dieses Template verwendet. Ändert noch nichts daran das im Link immer noch der Login-Name erscheint.<br />
Um dies zu ändern, greift man in das Template ein in dem die Funktion get_author_posts_url() verwendet wird. Das ist von Theme zu Theme leider immer etwas unterschiedlich, je nach dem wo die Metadaten zum Post ausgegeben werden. Diesen Funktionsaufruf ersetzt man nun mit diesem Monster:</p>
<pre class="brush:php">str_replace(
  get_the_author_meta( 'user_nicename' ),
  get_the_author_meta( 'ID' ),
  get_author_posts_url( get_the_author_meta( 'ID' ) )
)</pre>
<p>Damit ersetzt man den Login-Namen (user_nicename) durch die ID des Autoren. Nun benötigt man noch ein Template <code>author-xy.php</code> wobei <code>xy</code> die jeweilige ID des Autoren ist.</p>
<p>Das ganze ist ein Workaround der nur sehr begrenzt einsatzfähig ist. Man muss jedes mal am Theme rumfummeln, die ganze Sache ist nicht wirklich übersichtlich und am Ende benötigt man auch noch für jeden Autoren ein eigenes Template. Eignet sich also normalerweise nur für Blogs in denen es 1-2 Autoren gibt und die eher selten ihr Theme wechseln.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-29/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
