Ich bin sicher alles andere als ein Sicherheitsexperte, aber alle Plugins, die ich hier im Forum gesehen habe, haben so große Sicherheitslücken, dass sogar ich die sofort sehe.
Im Grunde ist jeweils das Hauptproblem, dass es ohne Weiteres möglich ist, die Dateien, die den Plugin-Code enthalten, direkt und somit ohne Anmeldung aufzurufen. Sicher funktionieren viele dann nicht, viele aber schon, erst recht, wenn sie zu Beginn (wie oft gesehen und teilweise unnötig) Dateien aus dem Contenido-Includes-Verzeichnis einbinden und somit auch der Datenbankzugriff etc. zur Verfügung steht.
Teilweise sind die Plugins sogar so gebaut, dass sie dies vorsehen. Das Backup-Plugin von Snoopy zum Beispiel: Es zeigt in der eigentlichen Plugin-Datei lediglich ein Menü an, das dann auf die Dateien, die die eigentliche Arbeit tun, direkt verlinkt. Es ist also lediglich das Menü passwortgeschützt. Jeder kann ohne Anmeldung beliebig in der der Datenbank herumfuhrwerken.
Eine schnelle Lösung und Selbstdisziplinierung ist es, im Plugin-Verzeichnis eine .htaccess-Datei mit folgendem Inhalt anzulegen:
Code: Alles auswählen
Deny from all
Code: Alles auswählen
Allow from all
Code: Alles auswählen
if($_GET['seite'] == 'seite1.php'){require('./plugins/pluginname/seite1.php');}
Code: Alles auswählen
require('./plugins/pluginname/'.$_GET['seite']);
Der Aufruf ist zwar nur für Leute möglich, die in Contenido oder anderen auf dem Server liegenden Skripten angemeldet sind, aber das kann schon gefährlich genug sein.
Mit der .htaccess-Datei-Methode löst man noch gleich ein anderes Problem mit:
Viele Plugins legen im Betrieb sensible Daten in ihrem Verzeichnis ab, die man einfach so runterladen kann. Als Beispiel wieder das Backup-Plugin:
Alle Backups liegen einfach so rum. Jeder kann also den gesamten Inhalt der gesicherten Datenbank inklusive z.B. aller E-Mail-Adressen der Newsletterempfänger runterladen!
Allerdings muss man dann wieder ein bisschen basteln, damit der Download aus dem Plugin heraus bei Verwendung der Zugriffsbeschränkungen noch funktioniert:
Ich habe das z.B. so gelöst:
.htaccess-Datei im Ordner mit den Backups:
Code: Alles auswählen
Allow From All
RewriteEngine on
RewriteRule (.*)$ ../../../main.php?area=backup&frame=4&seite=download_exec.php&%{QUERY_STRING}&datei=$1
Die Datei download_exec.php sieht dann in etwa wie folgt aus:
Code: Alles auswählen
<?php
if(!file_exists('./plugins/backup/backup/'.basename($HTTP_GET_VARS["datei"]))){require('./plugins/backup/download.php'); die();}
header('Content-Type: application/zip');
readfile('./plugins/backup/backup/'.basename($HTTP_GET_VARS["datei"]));
?>
Ansonsten wird mittels readfile einfach die gewünschte Datei ausgegeben.
Der Dateityp wird mittels header lediglich aus Komfortgründen angegeben; ansonsten hält der Browser die Datei für Text oder html und versucht sie anzuzeigen, wenn man den Link einfach anklickt und nicht direkt über das Kontextmenü das Abspeichern anwählt. Gibt man den richtigen Dateityp an, kann der Browser die Datei einfach mit dem richtigen Programm wie gewohnt öffnen.
Den Link auf die Datei muss man dann natürlich mit dem $sess-Objekt erzeugen:
Code: Alles auswählen
<a href="<?php echo htmlentities($sess->url('/plugins/pluginname/downloaddateien/datei.endung')); ?>">Link-Beschreibung</a>
Dies bringt natürlich nur auf Servern etwas, die .htaccess-Dateien auswerten!
Im Grunde, und gerade auch für Server, die keine .htaccess-Dateien auswerten, wäre es besser, einen Mechenismus wie z.B. bei phpBB einzuführen, bei dem in den Einstiegsdateien eine Konstante definiert wird (Konstanten können nicht durch Requests gesetzt werden), und in jeder anderen Datei zu Beginn geprüft wird, ob die Konstante gesetzt ist und ansonsten die Ausführung des Skriptes abgebrochen wird.
Dies hier sind nur grundsätzliche Überlegungen. Es ist nicht automatisch jedes Plugin sicher, das sich hiernach richtet! Natürlich muss man weiterhin die üblichen Dinge beachten und zum Beispiel Nutzereingaben prüfen oder Sachen escapen, bevor man sie an die Datenbank schickt!