PHP 5.3 --> auf aktuelle PHP umgestellt und Verlinkungen defekt??..


ossacip

Grünschnabel
#1
Hallo zusammen,
kaum da und schon ein Problem ;-) Ich habe eben eine HP "übernommen" (stand 2006 oder so ;-))und soll mal schauen, was noch zu retten ist
http://rolladen-schellberg.de

Auf dieser werden die Links mittels
PHP:
<!-- Content Table -->

    <table class="content" border="0">

          <?php

          include "./pages/manager.php";

          

          ?>

    </table>

    <!-- Ende Content Table -->
eingebunden. In der manager.php stehen dann die Links in der Form:
PHP:
<?php
    if(isset($nav)){
        if($nav=="Kontakt"){
            include "./pages/kontakt.php";
        }elseif($nav=="Impressum"){
            include "./pages/impressum.html";
        }elseif($nav=="reponline"){
            include "./pages/reponline.php";
        }elseif($nav=="Insekten"){
            include "./pages/insektenschutz.html";
        }elseif($nav=="Partner"){
            include "./pages/partner.html";
        }elseif($nav=="vorbau"){
            include "./pages/vorbau.html";   
        }elseif($nav=="Referenzen"){
            include "./pages/referenzen.html";
        }elseif($nav=="rollladen"){
            if($typ=="alu"){
                include "./pages/aluminium.html";
            }elseif($typ=="holz"){
                include "./pages/holz.html";
            }elseif($typ=="kunststoff"){
                include "./pages/kunststoff.html";
            }else{
                include "./pages/rollladen.html";
            }
        }elseif($nav=="sonnenschutz"){
            if($typ=="Markisen"){
                include "./pages/markisen.html";
            }elseif($typ=="Jalousien"){
                include "./pages/jalousien.html";
            }elseif($typ=="Innenraum"){
                include "./pages/innenraum.html";   
            }else{
                include "./pages/sonnenschutz.html";
            }
        }elseif($nav=="Elektro"){
                include "./pages/elektroantriebe.html";
        }elseif($nav=="Rolltore"){
                include "./pages/rolltore.html";
        }elseif($nav=="Markisen"){
                include "./pages/markisen.html";
        }elseif($nav=="ausbau"){
            if($typ=="elektro"){           
                include "./pages/ausbau.html";
            }elseif($typ=="markisen"){
                include "./pages/ausbau2.html";
            }elseif($typ=="funk"){
                include "./pages/funk.html";
            }else{
                include "./pages/ausbaufirst.html";
            }
        }elseif($nav=="Reparaturen"){
            include "./pages/reparaturen.html";
        }elseif($nav=="Eildienst"){
            include "./pages/eildienst.html";
        }elseif($nav=="Philo"){
            include "./pages/philo.html";
        }elseif($nav=="Sitemap"){
            include "./pages/sitemap.html";
        }elseif($nav=="Rollgitter"){
            include"./pages/rollgitter.html";
        }
    }else{
        include "./pages/philo.html";
    }
    
?>

Das klappt auch alles, mit der PHP Version 5.3. Sobald ich auf eine höhere im Kundenmenü wechsel, funktionieren die Links nicht mehr. Warum? Ich denke es leigt einfach an einer php.ini die ich generieren lassen kann im Kundencentrum. Aber sowohl mit als auch ohne diese ini geht oberhalb von 5.3 nix.....

Kann mir bitte wer helfen?!

Vielen Dank Ossa
 

ossacip

Grünschnabel
#5
Hmm, wird der $nav nicht durch zum Beispiel:
if(isset($nav)){
if($nav=="Kontakt"){
include "./pages/kontakt.php";
definiert?
In der nav.php wird/soll auch:
<a href="index.php?nav=Kontakt" class="nav">Kontakt</a>
(um bei dem Kontakt zu bleiben)
aufgerufen werden....
Wie gesagt, es muß etwas mit der PHP-Version zu tun haben sprich einem Unterschied von der uralten 5.3 auf eine neuere. Weil bis 5.3. funktioniert es und danach nicht mehr.....
 

EuroCent

Erfahrenes Mitglied
#6
lies dir mal per
PHP:
<?php
printf('<pre>%s</pre>', print_r(filter_input(INPUT_GET, 'nav'), true));
?>
ausgeben was Du alles an werten bekommst :)

Statt filter_input(INPUT_GET, 'nav') kannst du auch nur $_GET['nav'] nehmen.
Ich bevorzuge filter_input() ^^
 

ossacip

Grünschnabel
#7
Den Code habe ich dann mal eingebaut. Lass ich die Seite auf PHP 5.3 laufen, erhalte ich als Ausgabe bei einem Klick auf die Links den entsprechenden Wert aus der manager.php und der Link wird angezeigt

- schalte ich auf PHP 5.6 um .... bekomme ich ebenfalls bei Klick auf den Link den entsprechenden Wert angezeigt, aber die Seite wird nicht angezeigt.....
 

ossacip

Grünschnabel
#8
Ich glaube, ich weiß zumindest ein wenig mehr;-)
Beim Wechsel von 5.3 auf 5.6 mußte ich 3 Werte in der php.ini ändern bzw. auskommentieren da die wohl nicht mehr unterstützt werden - u.a. den:
register_globals = On
Und wenn ich den bei 5.3 ebenfalls auskommentiert lasse --- werden die Links auch nicht mehr aufgerufen. Aktivier ich den Wert wieder, läuft es wieder normal...

Also müßte ich irgendwas mit diesem Wert in der neuen PHP-Version machen, oder so ;-) ?
 
#10
Hi EuroCent, jo PHP ist weiter, aber der Fehler tritt ab höherer PHP-Version 5.3 auf....

Habe mittlerweile einen "dirty Way" gefunden. Ich emuliere "einfach" register_globals = On mit einer zusätzlichen PHP-Datei, die ich dann mit einbinde. So läuft es wenigstens. Sollte wer noch eine "sauberere Lösung" kennen und sie mich lehren wollen, dann bitte los.....

Danke Ossa
 
#11
Füge mal in der manager.php folgende Zeile am Anfang ein:
PHP:
$nav = !empty($_GET['nav']) ? $_GET['nav'] : null;
Genau das hat "register_globals = on" nämlich gemacht.
Dies stellt ein Sicherheitsrisiko dar, denn deswegen kann man alles mögliche per "GET" übergeben und es wird automatisch als Variable "angelegt.
 
#13
Seit 5.2 sollte man statt die Superglobals durch Filter_input ersetzen :)

http://php.net/manual/de/function.filter-input.php

Kenn mich da jetzt zwar nicht so aus, aber Ich denk mal dass es einen Sicherheitsaspekt hat warum man das nutzen sollte :)
Danke für den Tipp, wieder was gelernt, das muss ich dann gleich mal anwenden. :)
Kann dies denn auch eine SQL-Injection verhindern oder sollte man es danach dann trotzdem noch "entschärfen", wenn es später als Teil einer SQL-Abfrage verwendet wird?
 

ossacip

Grünschnabel
#15
@Dragosius:
Hab den Code mal eingebaut und nat. meine Datei deaktiviert und es läuft. Danke dir. Was ich noch nich so geschnallt habe, ist die Sache mit dem filter-input. Was müßte ich denn da ändern?
Wenn da noch wer lust hat, mir das zu erklären, wäre ich dankbar ;-)

Gruß Ossa
 
#16
filter-input ersetzt bespielsweise leerzeichen zu % oder wie bei suchmaschinen zu +.
Es filtert GET,POST,COOKIES und andere Zeichenketten mit den php eigenen Konstanten.
Eine GET Variable wird etwa so gefiltert:
Bsp. ein Formular übergibt dem Get Parameter url den Wert hallo Welt.
PHP:
$url = filter_input(INPUT_GET, 'url', FILTER_SANITIZE_ENCODED);
//Der String url ist der GET-Parameter "url"
Es würde dann folgenes ausgeben:
PHP:
Hallo%Welt
Wenn ich falsch liege korrigiert mich bitte:)
Gruß Sebatian
 

EuroCent

Erfahrenes Mitglied
#17
Statt mit den superglobals zu Arbeitern ($_POST, $_GET, $_COOKIE, $_SERVER & $_ENV) setzt man seit 5.2 auf filter_inputs

Aufbau:
PHP:
<?php
$POSTS = filter_input(INPUT_POST, 'POSTVARIABLE');
$GETS = filter_input(INPUT_GET, 'GETVARIABLE');
$COOKIES = filter_input(INPUT_COOKIE, 'COOKIEVARIABLE');
$SERVERS = filter_input(INPUT_SERVER, 'SERVERVARIABLE');
$ENVS = filter_input(INPUT_ENV, 'ENVVARIABLE');

/* Beispiel */
$username = filter_input(INPUT_POST, 'username');
?>
@Sebastian Kiefer
Genauso :)
 

ComFreek

Mod | @comfreek
Moderator
#18
Kann dies denn auch eine SQL-Injection verhindern oder sollte man es danach dann trotzdem noch "entschärfen", wenn es später als Teil einer SQL-Abfrage verwendet wird?
Das Entschärfen hängt maßgeblich vom verwendeten Datenbanktreiber (also MySQL oder MSSQL oder ...) und auch vom Locale ab, den du für die SQL-Sitzung verwendet. Darüber kann filter_input nichts wissen.
Übrigens solltest du sowieso nicht entschärfen, sondern gleich Prepared Statements nutzen.
 

ossacip

Grünschnabel
#19
DAnn müßte ich also den Ausdruck von @Dragosius:
"$nav = !empty($_GET['nav']) ? $_GET['nav'] : null;"
wegnehmen und nur
$nav = filter_input(INPUT_GET, 'nav');
? Das soll so einfach sein?
 
#20
Genau:)
Code:
$nav = filter_input(INPUT_GET, 'nav');
$typ = filter_input(INPUT_GET, 'typ');
PS: Wenn du jetzt Leerzeichen in den GET - Parametern hast musst du sie erst wieder entfernen.
PHP:
if($nav == "Rolladen Neu"){
include 'rolladen.phtml';
}
Würde jetzt nicht gehen weil wenn du die Links in der Navigation voher mit filter-input bearbeitest werden die Leerzeichen ja gegen % ersetzt (bzw. % und noch was dran) dann musst die die Leerzeichen wieder herstellen, das ist aber nicht so mein Ding :) Da können die anderen dir sicherlich mehr und besser helfen;)
Wie immer wenn ihr Korrekturen habt, sagt sie bitte