PHP Seiten sicher includen

  • Themenstarter Themenstarter starfoxfs
  • Beginndatum Beginndatum
S

starfoxfs

Hi zusammen,

Diesmal keine direkte Frage sondern wollte nur mal Euere Meinung zu diesem Include Script hören, vor allem was die Sicherheit angeht.

Kann man es evtl noch verbessern ?

PHP:
/* Seiten die, die eingebunden werden soll */
$startseite = "./start.php";
$seite2 = "./seite2.php";

if (isset($_GET["inc"]))
{

if(file_exists($startseite) && ($_GET["inc"] == "start")) {  include($startseite);  }
elseif(file_exists($seite2) && ($_GET["inc"] == "seite2")) {  include($seite2); } 

else { echo 'Zugriff verweigert'; } 

} else {

// Hier kommt hin, was passiert, wenn $inc nicht gegeben ist.
include ("./start.php");
}
 
"Schöner" wäre es sicher mit einem Array bzw. einem [phpf]switch[/phpf].

PHP:
<?php
$pages = array('start' => 'start.php', 'news' => 'news.php', 'usw' => 'usw.php');
$page = htmlspecialchars($_GET['page']);

if(in_array($page, $pages) === true)
{
  include('./controller/'.$pages[$page]);
}
?>

So in etwa könnte das aussehen.
 
Mit switch würde das ganze so aussehen (so mach ichs immer):

PHP:
switch($_GET['seite'])
{
  case "index":
  case "seite1":
  case "seiteX":
    $seite=$_GET['seite'];
    break;
  default:
    $seite="index";
    break;
}

include("unterseiten/" . $seite . ".inc.php");

Oder so ähnlich. :D

// Edit: Geklärt mit Felix, danke :)
 
Zuletzt bearbeitet:
Ach ja, Felix, sollte es nicht
PHP:
if(in_array($page, $pages) === true)
sondern
PHP:
if(in_array($page, $pages) == true)
heissen?

In diesem Fall nicht, da ich einen typensicheren Vergleich haben wollte.

Als Beispiel:

PHP:
<?php

$a = 0;
$b = '0';

if($a == $b)
{
  echo "gleich";
}

?>
Da kommt gleich raus.

PHP:
<?php

$a = 0;
$b = '0';

if($a === $b)
{
  echo "identisch";
}

?>
Hier kommt aber nicht "identisch" raus, da $a = 0; in diesem Fall nicht als integer gewertet wird, sondern als boolsches false.

Ab und zu ist ein typensicherer Vergleich nützlich.
 
Die in_array()-Funktion liefert allerdings bereits nur Boolesche Werte zurück, weswegen die Identitätsprüfung überflüssig ist. Selbst ein einfaches „if(in_array($foo, $bar))“ würde hier dieselben Resultate liefern. Die htmlspecialchars()-Funktion auf den Argumentwert anzuwenden, ist bei den genannten Werten auch nicht sinnvoller als es nicht zu tun.
 
Zurück