<?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; Server</title>
	<atom:link href="http://yoda.neun12.de/artikel-category/server/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>WordPress und FTP</title>
		<link>http://yoda.neun12.de/artikel-66</link>
		<comments>http://yoda.neun12.de/artikel-66#comments</comments>
		<pubDate>Sun, 20 May 2012 12:58:25 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=66</guid>
		<description><![CDATA[Über die Möglichkeiten seine FTP-Zugangsdaten an sein WordPress-Blog zu übermitteln und ein Plugin um dies relativ bequem zu machen.]]></description>
				<content:encoded><![CDATA[<p>Es gibt einige Möglichkeiten wie man seine FTP-Zugangsdaten an WordPress übermitteln kann. Aus einer kleinen <a title="Google+" href="https://plus.google.com/110569673423509816572/posts/dxFmeZa2Uue">Diskussion auf Google+</a> heraus kam die Idee diese mal mit ihren Vor- und Nachteilen zusammen zu fassen. Dies will ich im folgenden mal versuchen und dabei versuchen auch die Gründe aufzuzeigen warum WordPress manchmal FTP-Daten braucht und manchmal nicht. Nebenbei ist noch ein kleines Plugin entstanden welches eine weitere Möglichkeit bietet seine FTP-Daten in seien Blog zu hinterlegen.<span id="more-66"></span></p>
<h3>Ein paar Grundlagen</h3>
<p>Viele kennen es, wenn WordPress versucht Dateiaktionen auf den Server durchzuführen, z.B. ein Plugin oder Theme zu installieren, wird man nach seinen FTP-Zugangsdaten gefragt. Dabei ist es egal ob man eine Archivdatei direkt hochlädt oder von einen entfernten Server ein Update einspielt. Der Grund dafür liegt nicht bei WordPress, sondern bei Unix bzw. einem Unix-ähnlichen Betriebssystem wie Linux. Die Unix-ähnlichen Betriebssysteme kennen nämlich verschiedene Dateiberechtigungen und vor allem Dateibesitzer. Wenn unter einem Unix-System der (FTP-) <em>Benutzer A</em> eine Datei anlegt, so kann auch nur der <em>Benutzer A</em> diese Datei beschreiben bzw. löschen. <em>Benutzer A</em> ist der Dateibesitzer und hat die volle Kontrolle über die von ihm angelegte Datei. Möchte der <em>Benutzer A</em> das die Datei auch von anderen FTP-Benutzern gelesen bzw. beschrieben werden kann, so müssen entsprechende Berechtigungen vergeben werden. Es gibt drei Gruppen denen man den Zugriff auf die Datei erlauben kann: Nur der Eigentümer (also derjenige der die Datei angelegt hat), eine Gruppe von FTP-Benutzern und Alle anderen (<em>others</em> oder <em>public</em>). Zudem kann auch noch die Art des Zugriffs geregelt werden. Möglich sind: Lesen, Schreiben und Ausführen.<br />
<em>Benutzer A</em> könnte z.B. festlegen das die von ihm angelegte Datei nur von ihm beschrieben werden kann, jedoch z.B. alle FTP-Benutzer aus der Gruppe <em>Tastatursklaven</em> die Datei zumindest lesen können. Alle anderen FTP-Benutzer, so z.B. anonyme Gäste, können die Datei weder lesen noch sie beschreiben.</p>
<p>Dies ist ein grundlegender Schutz vor unberechtigten Zugriffen. Es wäre ja schon ein wenig fatal wenn jeder der will z.B. die Datei <em>wp-config.php</em> lesen, geschweige denn sie nach Lust&amp;Laune verändern könnte. Dieser &#8220;Schutz&#8221; wirkt sich nun nicht nur auf Dateien aus, sondern auch auf Verzeichnisse. Dateien die in einem Verzeichnis liegen das nur vom Eigentümer gelesen werden kann, können nicht von anderen FTP-Benutzern gelesen werden, egal welche Dateiberechtigung die einzelnen Dateien haben.<br />
Jetzt stellt sich natürlich die Frage was das alles mit WordPress zu tun hat. Schauen wir uns dazu erst einmal die &#8220;Ausnahme&#8221; an. Das wäre der Fall, wenn WordPress auf einem Server installiert ist auf dem PHP als so genanntes <em>php-cgi</em> läuft. Php-cgi ist eine ausführbare Datei und wird immer unter dem Konto des FTP-Benutzers ausgeführt. Wenn php-cgi also eine Datei auf den Server schreibt, hat die Datei als Eigentümer automatisch den FTP-Benutzer als Dateieigentümer.<br />
Der andere Fall, der weitaus verbreiteter ist, ist der, dass PHP als Apache-Modul (php_mod) ausgeführt wird. In diesen Fall ist nicht der FTP-Benutzer der Dateieigentümer, sondern der Apache-Server, der so gesehen auch ein FTP-Benutzer ist, jedoch mit einen anderen Benutzernamen. Je nachdem wie der Server konfiguriert ist, variiert der FTP-Benutzername des Servers. Häufig ist dies &#8220;nobody&#8221;, aber auch &#8220;wwwrun&#8221;, &#8220;PHP-User&#8221; oder schlicht &#8220;PHP&#8221;. Welcher Benutzername der Apache-Server genau hat, muss also im Einzelfall jeder selber heraus finden, ist aber für das Verständnis gar nicht so wichtig.</p>
<p>Halten wir kurz fest:</p>
<ul>
<li>Unter Unix und Unix-ähnlichen Betriebssystemen haben Dateien und Verzeichnisse einen Besitzer</li>
<li>Nicht jeder FTP-Benutzer kann auf alle Dateien und Verzeichnisse zugreifen</li>
<li>Die Zugriffe auf Dateien und Verzeichnisse werden durch Zugriffsrechte geregelt</li>
<li>Läuft PHP als Apache-Modul, so hat der Server einen eigenen &#8220;Benutzernamen&#8221; und hat dementsprechend auch Besitzrechte an den von ihm angelegten Dateien und Verzeichnisse.</li>
</ul>
<h3>Was passiert beim Upload?</h3>
<p>Wenn wir nun versuchen Dateien oder Verzeichnisse in unser Blog hochzuladen, dann muss WordPress erst einmal feststellen wie es dies bewerkstelligen kann. Die einfachste Methode wäre natürlich WordPress würde die Daten einfach mal so auf dem Server ablegen. Genau genommen versucht WordPress dies auch, lässt es aber meistens aus Sicherheitsgründen sein. Um festzustellen ob WordPress die Daten direkt auf den Server speichern kann, schreibt es eine kleine Testdatei. Danach prüft WordPress ob der FTP-Benutzer mit dem Dateibesitzer der Testdatei übereinstimmt.<br />
Im Fall von php-cgi stimmen die Besitzrechte überein und WordPress kann ohne weitere Nachfrage weiter machen.<br />
Im Fall von PHP als Modul hat die Testdatei jedoch den Server als Besitzer und nicht den FTP-Benutzer. WordPress entscheidet sich in diesen Fall dagegen die Daten direkt auf den Server zu schreiben und sucht nach einer anderen Methode.</p>
<p>Natürlich stellt sich jetzt die Frage warum WordPress nicht doch einfach die Daten auf den Server ablegt. Der Grund liegt in den Zugriffsrechten und und einer Sicherheitslücke die sich (theoretisch) daraus ergibt.<br />
Stellen wir uns mal vor <em>Benutzer A</em> und <em>Benutzer B</em> haben auf dem <em>Webserver C</em> jeweils einen Webspace gemietet. Alle Dateien und Verzeichnisse die von <em>Benutzer A</em> angelegt werden, können auch nur von <em>Benutzer A</em> gelesen und beschrieben werden. Genauso verhält es sich mit den Dateien und Verzeichnissen von <em>Benutzer B</em>. Was ist aber mit den Dateien und Verzeichnissen von &#8220;<em>Benutzer C</em>&#8220;? <em>Benutzer C</em> wäre in diesem Fall der Webserver. Und wenn der Webserver im Webspace von <em>Benutzer A</em> eine Datei anlegt, dann ist der Webserver der Besitzer dieser Datei. Da sich <em>Benutzer A</em> und <em>B</em> einen Webserver teilen, hat <em>Benutzer B</em> theoretisch über den Webserver Zugriff auf die Dateien im Webspace von <em>Benutzer A</em>, die vom Webserver angelegt wurden. Theoretisch könnte <em>Benutzer B</em> also den Webserver anweisen Dateien die er im Webspace von <em>Benutzer A</em> angelegt hat, auszulesen und im Webspace von <em>Benutzer B</em> zu kopieren. Möglich wäre dies, da der Webserver als Dateibesitzer ja die nötigen Rechte dazu hat.<br />
Dies ist eine eher theoretische Sicherheitslücke. Theoretisch deshalb, da auf einen vernünftig konfigurierten Server so etwas nicht möglich sein sollte. Der Server sollte so konfiguriert sein, dass kein Benutzer auf Dateien oder Verzeichnisse außerhalb seines Webspaces zugreifen kann. Andernfalls könnte jeder Benutzer auch problemlos die Konfigurationsdateien des Webservers manipulieren.<br />
Doch grau ist alle Theorie, die Praxis hat schon andere Fälle hervor gebracht. Und genau deswegen geht WordPress auf Nummer sicher und zieht es vor die Daten nicht direkt auf den Server abzulegen sofern es unter PHP als Apache-Modul läuft.</p>
<p>Kurz zusammen gefasst: Stellt WordPress fest das es nicht mit den gleichen Benutzernamen wie der FTP-Benutzer läuft, weigert es sich schlichtweg die Daten direkt auf den Server zu schreiben um nicht eine Sicherheitslücke bei den Zugriffsberechtigungen zu öffnen.</p>
<h3>Und es nervt doch</h3>
<p>Da PHP als Apache-Modul sehr verbreitet ist, werden auch viele WordPress-Nutzer regelmäßig nach ihren FTP-Zugangsdaten gefragt. FTP ist die zweite Variante mit der WordPress die Daten auf den Server bekommt. Dazu tut WordPress einfach so, als sei es der FTP-Benutzer unter dem der Blog angelegt wurde und der rechtmäßig Zugriff auf alle Dateien hat. Somit werden die Daten nicht mit dem FTP-Benutzer &#8220;nobody&#8221; (oder PHP-Run, oder PHP, oder oder oder) geschrieben, sondern mit dem von uns angegebenen Benutzernamen und Passwort.</p>
<p>Wer nur selten Daten auf seinen Server kopiert, den wird es nicht stören ab und an mal seine FTP-Daten anzugeben. Es gibt aber so einige Fälle wo es doch sehr nervig werden kann. Als Entwickler schiebt man ständig zu Testzwecken Daten auf den Server und löscht sie dort wieder. Das man auch beim Löschen von Daten die FTP-Zugangsdaten angeben muss, dürfte mittlerweile klar sein. Denn WordPress kann aufgrund der fehlenden Zugriffsberechtigungen nicht als Benutzer &#8220;PHP-Run&#8221; auf die Daten von FTP-Benutzer &#8220;Horst4711&#8243; zugreifen.<br />
Manchmal ist es aber auch einfach zu unbequem die FTP-Zugangsdaten, die sich natürlich kaum einer merkt weil das Passwort kryptisch³ ist, raus zu suchen. Und manchmal hat ausgerechnet der Mitarbeiter die FTP-Zugangsdaten, der gerade in Kambodscha Urlaub macht und nicht erreichbar ist.</p>
<p>Für solche Fälle gibt es einige Möglichkeiten die FTP-Zugangsdaten direkt in WordPress zu hinterlegen. Alle Möglichkeiten haben ihre Vor- und Nachteile. Einige sind sogar, m.E. nach, ein wenig gefährlich.</p>
<h3>Speichern ist einfacher als raus suchen</h3>
<p>Ab Werk kann man WordPress seine FTP-Daten also nur per Formular übergeben. Wer häufig unterwegs ist und sich dementsprechend genauso häufig in ungesicherte WLAN-Netzwerke einloggt (oder einloggen muss), wird immer ein mulmiges Gefühl haben wenn er die FTP-Zugangsdaten ungesichert quer durch die Bahnhofshalle zum Router schicken muss. Gerade wenn es um Kunden-Server geht ist hier etwas Vorsicht geboten. Falls jetzt jemand die Idee hat SSL wäre ja eine Lösung, der hat im Prinzip Recht. Jedoch denken die meisten Kunden da ganz anders. Wenn SSL extra kostet, dann braucht man das nicht. So denken zumindest die meisten Kunden.<br />
Diese Lösung hat allerdings auch einen Vorteil. Legt man auf dem Server für jeden Admin einen FTP-Konto an, so kann <em>Admin B</em> nicht aus versehen (oder mit voller Absicht) die Dateien und Verzeichnisse von <em>Admin A</em> löschen oder überschreiben.</p>
<h4>wp-config</h4>
<p>Die erste Alternative zur Übertragung via Formular wäre die FTP-Zugangsdaten in der <code>wp-config.php</code> abzulegen. Dazu stellt WordPress drei Konstanten bereit: <code>FTP_HOST</code>, <code>FTP_USER</code> und <code>FTP_PASS</code>. Die Namen sprechen für sich und es dürfte klar sein für was die einzelnen Konstanten stehen. Wer mehr über die Konstanten von WordPress erfahren will, sollte mal einen Blick bei <a title="Google+ Profil von Dominik Schilling" href="https://plus.google.com/101675293278434581718">Dominik Schilling</a> (G+ Profil)  rein werfen. Er hat eine <a title="WP-Grafie, WP-Konstanten" href="http://wpgrafie.de/195/wordpress-konstanten/#dateisystem">umfangreiche Auflistung alle Konstanten</a>.<br />
Beispiel:</p>
<pre class="brush:php">// defining the ftp-account data
if( ! defined( 'FTP_HOST' ) )
  define( 'FTP_HOST', 'meine-dmoain.de' );

if( ! defined( 'FTP_USER' ) )
  define ( 'FTP_USER', 'Horst4711' );

if( ! defined( 'FTP_PASS' ) )
  define( FTP_PASS', '&amp;SchmierMaxe$0815!' );</pre>
<p>Man sieht schon wo hier das Problem liegen könnte. Das Passwort liegt unverschlüsselt in einer PHP-Datei von der so ziemlich jeder Hacker weiß das dort was zu holen ist. Auf der anderen Seite steht in der selben Datei aber auch das Passwort für die Datenbank, ebenfalls unverschlüsselt. Man kann jetzt so oder so argumentieren. Die einen sind der Meinung das eh Hopfen&amp;Malz verloren ist wenn die <code>wp-config.php</code> geknackt ist. Die anderen sagen das man einen Hacker nicht noch freien FTP-Zugang zum Server geben muss wenn er sich schon die Datenbank unter den Nagel gerissen hat.<br />
Diese Methode spart auf alle Fälle die lästige Tipparbeit und man muss, sofern man mit mehren Mitarbeitern an einen Blog arbeitet, die FTP-Zugangsdaten nicht jedem aufs Auge drücken. Irgendwo gibt es immer einen der Zugangsdaten auf einen PostIt schreibt und diesen dann irgendwo vergisst oder verliert.<br />
Hier wird deutlich das WordPress eigentlich ein Single-User-System ist dem man notdürftig eine Benutzerverwaltung aufgepflanzt hat. Denn so kann jeder Benutzer mit Admin-Rechten auf alle Dateien und Verzeichnisse zugreifen. Ob nun gewollt oder ungewollt. Es ist durchaus denkbar das <em>Admin B</em> ein Verzeichnis löscht oder überschreibt das von <em>Admin A</em> angelegt wurde und das auf gar keinen Fall gelöscht oder überschrieben werden durfte.</p>
<h4>FS_METHOD</h4>
<p>Eine andere Alternative zum Formular besteht darin, WordPress dazu zu zwingen die Daten direkt auf den Server zu schreiben. Indem man die Konstante <code>FS_METHOD</code> auf <code>direct</code> setzt, lässt man WordPress erst gar nicht dazu kommen auszuwählen ob es die Daten direkt oder per FTP auf den Server schreibt.<br />
In meinen Augen ein Fauxpas sofern man dies auf einen Shared-Host anwendet. Für die möglichen Gefahren, siehe oben.<br />
Nun ist aber nicht jedes Blog auf einen Shared-Host angelegt. Wer stolzer Besitzer eines eigenen Servers ist, kann diese Methode durchaus dazu nutzen den FTP-Upload zu umgehen. Wenn es auf dem ganzen Server nur einen FTP-Benutzer gibt, gibt es auch keinen zweiten der unberechtigt auf die Dateien zugreifen kann. Wobei man diese Aussage ein wenig relativieren muss. Denn als Apache-Modul ausgeführt, ist der Webserver natürlich auch ein FTP-Benutzer. Durch setzen der Konstante <code>FS_METHOD</code> auf <code>direct</code>, werden alle Dateien und Verzeichnisse mit dem Besitzer &#8220;Webserver&#8221; (oder so ähnlich) erstellt. Das kann in sofern problematisch werden, wenn in einem Plugin oder Theme &#8220;versehentlich&#8221; etwas wie <code>exec( "rm -rf /" );</code> drin steht. Dann werden halt mal alle Dateien und Verzeichnisse die vom aktuellen Benutzer, sprich Webserver, angelegt wurden, gelöscht. Ohne Rückfrage versteht sich. Aber auch ein <code>unlink()</code> kann an der falschen Stelle mit dem falschen Pfad ausreichend Schaden anrichten.<br />
Ein weiteres Problem dürfte zwar nur selten auftreten, ist mir persönlich aber durchaus schon mal passiert. Daten die vom Webserver geschrieben worden sind konnte ich als FTP-Benutzer nicht mehr löschen. Sicherlich auch eine Sache der Server-Konfiguration, man sollte aber vor Einsatz dieser Alternative erst einmal ausprobieren ob man denn die Daten die der Webserver geschrieben hat auch wieder löschen kann. Das Selektive Löschen einzelner Dateien oder Verzeichnisse kann sich dann sehr mühsam gestalten.</p>
<p>Die Konstante <code>FS_METHOD</code> kann jedoch auch sehr nützlich sein. Wir erinnern uns an php-cgi bei dem alle Daten unter dem Benutzernamen geschrieben werden. WordPress muss unter php-cgi nicht nachfragen ob es die Methode &#8220;<em>direct</em>&#8221; oder &#8220;<em>ftp</em>&#8221; benutzen soll, dadurch kann es gleich loslegen. Das ist vielleicht aber gar nicht immer erwünscht. Mit <code>FS_METHOD</code> können wir WordPress auch dazu zwingen FTP als Methode zu verwenden und jedes mal Benutzernamen und Passwort (und Hostname) abzufragen. Für Blogs die unter php-cgi laufen also ein kleiner Workaround wie man ganz einfach eine Authentifizierung vor dem Schreiben/Löschen von Daten erzwingen kann.</p>
<pre class="brush:php">/*
 * force users to use ftp
 *
 * use 'ftpext' for using Apache FTP Extension
 * use 'ftpsockets' for ftp-sockets (Socket-Class or PHP-Extension)
 *
 */

if( ! defined( 'FS_METHOD' ) )
  define( 'FS_METHOD', 'ftpext' );</pre>
<p>Obwohl ich hier nur mehr oder minder die Oberfläche angekratzt habe, sieht man schon wie komplex die gesamte Thematik ist. Gänzlich ausgeklammert habe ich z.B. die ganze Thematik um SSH/SSL, SFTP und das WordPress-Filesystem sowieso. Das ist genug Stoff für weitere drei oder vier Artikel.</p>
<h3>Eine Plugin-Lösung</h3>
<p>Meiner Philosophie zur Folge muss ein Blogartikel nicht komplett und vollständig sein, sondern vielmehr zum Nachdenken, Experimentieren und vor allem Diskutieren anregen. Sicherlich gibt es den einen oder anderen Aspekt den ich übersehen, falsch oder missverständlich dargestellt habe oder der mehr Interesse geweckt hat als der Artikel bedienen kann.<br />
Genauso halte ich es auch mit meinen Plugins. Keine fertige Allroundlösung mit allen erdenklichen Features, sondern ein Lösungsansatz für ein Problem. Das folgende Plugin liegt in der Version <strong>0.1</strong> vor, ist also der erste Entwurf und eher ein PoC (Proof of Concept). Sowohl Artikel als auch Plugin sind beide an einen Tag entstanden, dementsprechend unausgiebig wurde das Plugin von mir getestet. Ich bitte dies beim Ausprobieren zu berücksichtigen.</p>
<h4>FTP-Account to UserMeta</h4>
<p>Dieses Plugin macht in etwa genau das was der (uninspiriert gewählte) Name aussagt. Es speichert die FTP-Zugangsdaten in den Benutzer-Daten des jeweiligen Benutzers. Damit sind zwei Anforderungen die im Laufe des Artikels aufgetaucht sind erledigt. Zum einen, und wichtigsten, muss man die FTP-Zugangsdaten nicht mehr ständig eintippen. Einmal im Benutzerprofil eingegeben stehen sie ab dann immer zur Verfügung wenn WordPress diese anfordert. Zum anderen können mehrere FTP-Benutzer ihre Daten hinterlegen da für jeden Benutzer separate FTP-Zugangsdaten gespeichert werden. Dadurch kann z.B. verhindert werden das <em>Benutzer A</em> die Dateien von <em>Benutzer B</em> versehentlich löscht, das Plugin kommt also aus der Ecke &#8220;Betreutes Bloggen&#8221;.</p>
<p>Das Plugin hinkt noch an der einen oder anderen Stelle. So werden die FTP-Passwörter (noch) im Klartext in der Datenbank gespeichert. Es sollte aber kein Problem darstellen eine entsprechende Ver- und Entschlüsselung nachzurüsten.<br />
Auch fehlt noch die Unterstützung für SFTP/SSL da mir hierfür derzeit die nötige Umgebung fehlt (ja, ich habe weder SSL noch sonst was auf meinen lokalen Server. Nicht mal mod_ftp). Gegen Bereitstellung von etwas Platz auf einen entsprechenden Server mit SSL/SFTP bin ich gerne bereit das zu ändern <img src="http://yoda.neun12.de/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" />  Ansonsten muss man halt warten bis ich das auf meinem lokalen Server nachgerüstet habe.</p>
<p>Die Bedienung des Plugins ist recht simple. Nach der Installation und Aktivierung werden im Benutzerprofil drei Felder für FTP-Hostname, FTP-Benutzername und FTP-Passwort hinzugefügt. Sind die drei Felder ausgefüllt und wird das Profil aktualisiert, verschwindet ab diesen Zeitpunkt für diesen Benutzer die Aufforderung seine FTP-Zugangsdaten einzugeben sofern diese erforderlich sind. Alle anderen Benutzer die FTP benutzen können aber keine Zugangsdaten hinterlegt haben, werden weiterhin aufgefordert ihre Zugangsdaten bei Bedarf einzugeben.<br />
<a class="highslide" onclick="return hs.expand(this)"  href="http://yoda.neun12.de/wp-content/uploads/2012/05/ftp2um.png"><img class="alignleft size-thumbnail wp-image-68" title="FTP2UM im Backend" src="http://yoda.neun12.de/wp-content/uploads/2012/05/ftp2um-150x150.png" alt="" width="150" height="150" /></a>Die Kontrolle darüber welche Benutzer überhaupt die drei Felder zu sehen bekommen, erfolgt hardcodiert im Plugin selber. Voreingestellt sind Administratoren (Role administrator), was wahrscheinlich am meisten Sinn macht. Es können aber auch andere Rollen bzw. Fähigkeiten (Capabilities) angegeben werden, womit eine recht feine Einstellung möglich ist wer seine FTP-Zugangsdaten eingeben kann.<br />
Damit nach der Deinstallation des Plugins keine sensiblen Daten in der Datenbank verbleiben, werden diese bei der Deinstallation (nicht deaktivierung!) gelöscht. Sofern man das Plugin also über das Backend entfernt, kann man es gefahrlos ausprobieren.</p>
<p>Das Plugin findet ihr auf <a title="FTP2UM on GitHub" href="https://github.com/RalfAlbert/WordPress-FTP-Account-to-UserMeta">Github</a>. Für diejenigen die es nicht so mit Git haben, als <a title="FTP 2 UM V0.1.2" href="https://github.com/downloads/RalfAlbert/WordPress-FTP-Account-to-UserMeta/WordPress-FTP-Account-to-UserMeta_0.1.2.zip">Zip-Datei</a>. Die anderen dürfen gerne <a title="Fork FTP2UM" href="https://github.com/RalfAlbert/WordPress-FTP-Account-to-UserMeta/fork">forken</a>, pullen und commiten.</p>
<h4>Update</h4>
<p>Da das Plugin auf  einiges Interesse gestoßen ist, habe ich den Code mal etwas bereinigt und glatt gezogen. Neue Funktionen sind in <a title="Version 0.1.2" href="https://github.com/downloads/RalfAlbert/WordPress-FTP-Account-to-UserMeta/WordPress-FTP-Account-to-UserMeta_0.1.2.zip">dieser Version (v0.1.2)</a> nicht hinzugekommen, dafür aber die eine oder andere Funktion für die nächsten Versionen notiert. Es wird sicherlich noch das eine oder andere umgesetzt werden, da ich hierdurch auch die Möglichkeit bekomme verschiedene Sachen auszuprobieren und ggf. darüber etwas zu schreiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-66/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<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>
	</channel>
</rss>
