Navigation mit Php Probleme

  • Hallo Leute


    Ich hab ein kleines Problem mit einem Versuch mir eine Navigation mittels PHP zu erstellen.
    Vorab noch ich bin noch Anfänger und hoffe hier auf nette Hilfe.


    So nun mal zum Problem und den Daten.


    Zu erst mal das Script was Fehler macht.


    (hier mal die Index.php)



    und hier die navigation.php



    Das Problem was ich nun habe wäre folgendes, wenn ich nun die Index.php Seite aufrufe steht immer das hier


    Code
    Notice:  Undefined index: inhalt in /home/.sites/111/site1911/web/version3/navigation/navigation.php on line 9


    und sobald ich einen Link anklicken kommt das hier ...

    Code
    Warning:  include(base.php): failed to open stream: No such file or directory in /home/.sites/111/site1911/web/version3/index.php on line 25
    
    
    
    
    Warning:  include(): Failed opening 'base.php' for inclusion (include_path='.:/usr/share/pear') in /home/.sites/111/site1911/web/version3/index.php on line 25


    Mein Ziel ist das ich einen Link anklicke und der soll dann in <div id="inhalt"> </div> ausgegeben werden.


    Nun meine Frage wo habe ich meinen Fehler im Script eingebaut ?? und was muss ich noch machen damit das ganze auch sicher ist .... habe mitbekommen das ich ja das ganze in der Adresse Zeile ja sehe.
    Leider auch noch zu leicht manipulierbar auch noch ist ...
    (Ach ja zum Aufbau der Seite sei noch gesagt das bis auf die index.php Datei alles in Ordner liegt also zb. index.php -> navigation/navigation.php)


    Ich bedanke mich schon mal recht herzlichst für die nette Hilfe hier..


    lg
    Dualskull

  • Das Problem ist, dass Du nicht prüfst, ob 'inhalt' gesetzt ist.

  • @ cotton Vielen Dank für deine Hilfe werde mich gleich mal hinsetzen nach dem Essen und mir das genauer angucken ....


    hättest du eventuell noch einen Tipp wie ich die Sicherheit erhöhen könnte ?
    Momentan ist es ja so das ich oben in der Adresse Eingabe einfach eine andere Seite dazu hängen kann was ja nicht so toll ist
    Jetzt sieht es ja noch so aus


    Code
    index.php?inhalt=base.php


    und wenn ich hier nach = einfach was anderes rein tippe kann ich irgendeine Seite aufrufen was ich ja nicht will hmm.
    Wie kann ich sowas verhindern oder erschweren ?

  • Es gibt 1000 Wege =)
    hier mal eine:

  • Vielen Dank für deine Nette Hilfe erst mal.
    Ich werde mir das ganze sehr genau angucken. Sind doch noch viele viele in deinem Script das ich noch nicht so ganz verstehe .. Aber mit der PHP Doku und dem Buch was ich mir Heute geleistet habe wird das sicher schon werden. (Buch ist von Galileo Press : Einstieg in PHP 5.6 und MySQL 5.6) hoffe mal das es kein Fehlkauf war, nur ständig die Online Doku ist nervig und beim Zug fahren ist ein Buch auch besser ...
    Ich wollte mir auch was über sicheres Php Programmieren suchen hab aber nichts gefunden. (Sicher in der Hinsicht das man nicht gleich auf den ersten paar Sekunden mein Script überlisten kann. (Siehe mein Link Script oben )


    Naja dann ran an den Speck und vielen Dank noch mal Cotton für deine echt nette hilfe ...
    Mal gucken ob ich auch mal wenn helfen kann :D


    lg
    Dualskull

  • Zum Thema Sicherheit gibt es (auch in anderen Sprachen) Grundsätze wie zB "Traue nie den Benutzereingaben".


    Das mMn wichtigste:


    Butzereingaben:


    Via PHP bekommst Du über die URL ($_GET) Daten.
    Eine URL "domain.com?key=1" ergibt in PHP:
    Schlüssel $_GET ['key']
    Wert 1


    Ähnlich bei $_POST: ein Formular wird über method="POST" abgesendet
    zB

    HTML
    <input type="text" name="key" value="" /> <!-- angenommen der nutzer trägt 1 in das textfeld ein -->


    in PHP bekommst Du nun
    Schlüssel $_POST ['key']
    Wert 1


    Diesen Daten darfst Du nun nicht trauen.


    Wenn Du zB $_GET['page'] zum einbinden einer Datei nutzt

    PHP
    include $_GET['page'];


    kann der Nutzer alles ihm mögliche "versuchen". Gibt er zB "meine-datei.xy" in die URL ein, dann würde Dein Script versuchen diese Datei einzubinden.


    Eine Lösung des Problems ist eine Whitelist.
    Das kann zB ein Array sein:

    PHP
    $pages = array(
        'home' => 'usw'
        'member' => 'usw'
    );
    // prüfen, ob angeforderte seite erlaubt ist:
    // wir sehen nach, ob im array $pages die ebene mit dem schlüssel $_GET['page'] existiert:
    if( isset($pages[$_GET['page']]) ) 
    {
        // ja, ist erlaubt
    }



    Ausgeben von Nutzereingaben:


    Angenommen Du erwartest über ein Formular via POST einen Benutzernamen ( $_POST['name'] ).
    Weil der Benutzer aber ein Schlechter Mensch ist, versucht er XSS (cross site scripting) -
    er versucht Javascript Code auf Deiner Seite auszugeben.
    Er gibt also keinen Namen ein, sondern Javascript Code:

    JavaScript
    <script>alert('test')</script>


    Somit steckt nun in
    $_POST['name']
    der Wert
    <script>alert('test')</script>


    Wenn Du diesen Wert jetzt unbehandelt auf Deiner Seite ausgibst:

    HTML
    Dein Name ist: <?php $_POST['name']; ?>


    dann steht im Quellcode (der Code den der browser umsetzt)

    Code
    Dein Name ist: <script>alert('test')</script>


    Der Browser zeigt also den Text Dein Name ist: an,
    und führt den Javascript Code alert('test') aus.


    Um das zu verhindern solltest Du die Ausgabe maskieren/umwandeln:
    (Auch wenn Du diese Benutzereingabe gespeichert hast, wieder lädst und ausgibst)

    HTML
    Dein Name ist: <?php htmlspecialchars($_POST['name']); ?>


    (siehe php.net http://php.net/manual/de/function.htmlspecialchars.php )


    Im Browser steht nun:

    Zitat


    Dein Name ist: <script>alert('test')</script>


    Aber im Quellcode:

    Code
    Dein Name ist: &lt;script&gt;alert('test')&lt;/script&gt;


    Wie Du siehst, wurde zB das Zeichen < zu &lt; umgewandelt.
    Der Browser bekommt also keine Javascriptanweisung, sondern formatierte Zeichen die er "einfach nur" anzeigen soll.



    Übrigens siehst Du sowas hier im Forum ständig. Wenn ich hier im Text Javascript einfüge:
    <script>alert('test')</script>
    dann behandelt das das Forum als Benutzereingabe und maskiert die Eingaben auf diese o.ä. Weise.
    Wäre das nicht der Fall, dann würde Dir Dein Browser eine Alertbox mit dem Text "test" anzeigen.

  • Ok das mit dem "Daten die User" eingeben Vorsicht zu sein war mir irgendwie schon klar nur das man da so xss machen kann nicht.
    Also immer überprüfen ob die ganzen Eingaben auch sicher sind. (Gespeichert ;) ).
    Habe was auf Englisch gefunden was sich mit PHP-Sicherheit (programmieren) beschäftigt, dachte nur auf Deutsch gibts auch was, da ich ja noch neu in PHP bin sind mir für den Anfang Deutschsprachige Howtows und Infos lieber.


    Ach ja dein Script ist super nur hab ich :S nicht gleich kapiert das ich aus der Index.php


    PHP
    <?php     if(isset($_GET["inhalt"]))     {           include($_GET["inhalt"]);     }     else     {       include("base/base.php");         }    ?>


    das rauslöschen muss, gab immer wieder Fehler Meldungen. Nun jetzt klappte es ja schon wunderbar.
    Was ich noch nicht so ganz verstehe ist das hier



    PHP
    $a = '';



    Du erstellst hier eine Variable mit keinem Inhalt, dachte immer sowas soll man nicht machen oder braucht man nicht machen ?
    Naja ich spiele mich noch weiter herum mit deinem Script versuch gerade die Link Ausgabe zu beeinflussen das sie neben einander stehen.


  • Also immer überprüfen ob die ganzen Eingaben auch sicher sind.


    Besser: immer davon ausgehen, dass Benutzereingaben "schlecht" sein können.
    htmlspecialchars() wird sehr oft bei Ausgaben (zum Browser) benutzt. Und man macht da einfach keinen Unterschied ob gut oder böse.
    Es wird einfach grundsätzlich jede Ausgabe so behandelt, als könnte sie was schlimmer enthalten.
    (es sei denn Du willst zB Javascript Code o.ä. ausgeben)


    Wegen dem $a = '';
    Das ist wegen der Verkettung im foreach()
    Bsp:


    Wenn Du testweise die Zeile mit $a = ''; entfernst, bekommst Du die Notice.

  • Sorry Leute ... hatte einen schlimmen Unfall darum melde ich mich jetzt erst...


    Nun gut ... ich weiß leider jetzt nicht mehr ob ich das damals gelöst habe aber da mein Laptop auch weg ist und somit die daten stehe ich wieder am anfang.


    Das Script das hier mir nett erweise zur Verfügung gestellt wurde läuft super nur die Ausgabe passt nicht so für mich ?


    entweder ich mache was falsch oder keine Ahnung ... jedenfalls das mit der Link-generierung läuft super nur der Inhalt landet leider nicht unter der ID Inhalt
    wäre echt nett wenn mir da einer nochmal helfen könnte.


    Wäre dieser Person echt sehr dankbar


    lg
    dualskull

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!