Portal > Foren > PHP > PHP-Programmierung > PHP Seite einbinden
Antwort
 
Themen-Optionen
Alt 03.10.2007, 16:12 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 19.09.2007
Beiträge: 6
Standard PHP Seite einbinden

Heho, die nerverei kann beginnen

Möchte meiner index.php per URL nen hinweiß geben, welche Seite eingebunden werden soll. Habs nun so gelöst, und wollte wissen ob da ein Sicherheitsrisiko besteht, oder ob es "sicher" gegen ausseneinwirkung ist.

index.php (übergeben wird mit index.php?url=news
PHP-Code:
<?PHP
                
                
                
if(isset($_GET['url']))//falls nicht übergeben, Else-Zweig
                
{
                    
$url $_GET['url'];
                    include 
"include/includes.php";//erlaubten Werte einlesen
                    
                    
for ($i 0$i sizeof($include_array); $i++) 
                    {
//so oft durchlaufen bis Array durch is
                        
if (isset($include_array[$url]))//Wenns im Array vorhanden ist
                        
{
                            include 
$include_array[$url];//Seite einbinden
                            
break;//Abbrechen, sobald gefunden
                        
}
                    } 
                
                }
                else
                    include 
"include/news.php";
           
            
?>
include/includes.php (Hier stehen im Array die werte drinnen, die übergeben werden dürfen.. wie "news" oder "gbook".
PHP-Code:
<?PHP
    $include_array 
= array(
        
"news"  => "include/news.php"
    
);
?>

Ich hab gezielt auf fertige CMS verzichtet. Hab noch etwas Zeit, und möchte mich mit ner eigens aufgebauten Seite erstmal zurechtfinden. Denke da lernt man etwas mehr =)

lg Nerdii
Nerdii ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.10.2007, 16:48 Nach oben    #2
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 397
Standard

Also erstmal solltest du dir angewöhnen, dein Script zu ordnen.

Im Grunde spielt sich das ungefähr so ab (so mach ichs immer)
1. Konstantendefinierung
2. Funktionenimplementierung
3. Variablendefinierung
4. eigentlicher Code

Also würde ich an deiner Stelle das Belegen von $url nach vorne schieben und dann bereits ein Fallbacksystem implementieren:

PHP-Code:
<?php
 $url 
= (array_key_exists('url'$_GET)) ? htmlentities($GET['url'], ENT_QUOTES) : 'news';
?>
Das "? :"-Konstrukt nennt sich tertiärer Operator, falls du es noch nicht kennst, und bedeutet eigentlich nur eine Art if-Schleife nach folgendem Muster:
Zitat:
$url = (<Bedingung>) ? <Wert, der benutzt wird, trifft die Bedingung zu> : <Wert, der benutzt wird, trifft die Bedingung nicht zu>
Damit - um deine eigentliche Frage zu beantworten - stellst du sicher, dass dir bösen Buben keine Sonderzeichen (', ", etc.) unterjubeln können, die dein Script zum Exitus zwingen und eventuell Infos über deinen Server preisgeben oder schlimmeres.
Diese Art der GET- und POST-Variablen empfiehlt sich imho überall, wo man Sonderzeichen nicht als gültige Eingabe berücksichtigen muss, bzw. auch mit umgewandelten Sonderzeichen arbeiten kann.
Bei Variablen, die nur Integer-Werte annehmen sollen dürfen bspw. empfiehlt sich im Erfolgsfall per "(int) $GET['url']" ein entsprechendes Typecasting drüber zu jagen.

Schau dich zu dem Thema auch mal in der Tutorial-Ecke um, da findest du Infos und Tipps&Tricks en masse...
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.10.2007, 17:02 Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

Zitat:
Zitat von Jojo Beitrag anzeigen
eine Art if-Schleife
http://www.php-faq.de/q/q-terminologie-if.html
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.10.2007, 17:22 Nach oben    #4
Neuer Benutzer
 
Registriert seit: 19.09.2007
Beiträge: 6
Standard

Hi Jojo

Vielen Dank für deine Antwort. Verstehen tu ich es, ist nicht allzu schwer mit etwas logik =)

Hab das ganze nun danach umgestellt:

PHP-Code:
<?PHP
                    $url 
= (array_key_exists('url'$_GET)) ? htmlentities($_GET['url'], ENT_QUOTES) : 'news';
                    include 
"include/includes.php";
                    
                    for (
$i 0$i sizeof($include_array); $i++) 
                    {
                        if (isset(
$include_array[$url]))
                        {
                            include 
$include_array[$url];
                            break;
                        }
                    }
                
?>
btw: hast nen _ beim zweiten $_GET vergessen

Werde auch in Zukunft versuchen, diese 4 Punkte aufrecht zu erhalten.


@Bleistift: lol =)

Lg Nerdii
Nerdii ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.10.2007, 18:57 Nach oben    #5
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 397
Standard

@Bleistift
HAHAHA ^^
Ja, ich glaub das werd ich nie los
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2007, 12:48 Nach oben    #6
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Hi "Nerdii".

Das mit den htmlentities() ist Quatsch. Das ist eine Funktion, die man bei der Ausgabe von werten verwendet, vor allem um XSS-Attacken auszuschließen.

Prinzipiell ist meine Empfehleung, die eingehenden Werte erstmal so wie sie sind anzunehmen und dann je nach Operation ggf. zu entschärfen. Wenn du den Wert einfach nur gegen die assoziativen Indizes eines Arrays vergleichst, brauchst du da garnichts zu entschärfen, wenn du sie in eine Datenbankabfrage setzt, brauchst du z.B. mysql_real_escape_string(), wenn du sie der Shell übergibst baruchst du wieder eine andere Funktion.

Was du machen solltest, wäre die Option magic_quotes_gpc[1] zu überprüfen und entsprechend zu reagieren (im Bugtracker[2] gibt es mehr Infos dafür).

[1] http://de.php.net/manual/en/security.magicquotes.php
[2] http://bugs.php.net/bug.php?id=29776

Also: Erstmal alle externen Variablen so reinnehmen, wie sie sind (ggf. erstmal wieder herstellen, wie sie eigentlich waren) und dann je Kontext entsprechend behandeln.

Weiter schau dir mal das hier an:
PHP-Code:
<?PHP
$include_array 
= array(
    
"news" => "include/news.php"
);
?>
Wie geht das weiter?

PHP-Code:
<?PHP
$include_array 
= array(
    
"news" => "include/news.php",
    
"board" => "include/board.php",
    
"profile" => "include/profile.php",
    
"login" => "include/login.php"
);
?>
Wenn ich da richtig liege, dann wäre es quatsch ein solches Array zu führen, denn jeder Wert zeigt auf 'include/' . strtolower($wert) . '.php'.

Wenn du das so änderst, hast du aber genau das Thema Sicherheit drinnen. 1. Brauchst du ein Verzeichnis, in dem ausschließlich derartige Dateien liegen, 2. musst du sicherstellen, dass durch jeden Beliebigen Parameter tatsächlich nur auf dieses Verzeichnis zugegriffen wird (z.B. darf ein url=../config.txt nicht dazu führen, dass eine solche konfigurations-Datei eingebunden und angezeigt wird).

Dein Code könnte also etwa so aussehen:
PHP-Code:
<?php

// config
$sDefaultModule 'News';
$sModuleDir     dirname(__FILE__) . '/../modules/';

// setup
$aGet transcribe($_GET); // siehe http://bugs.php.net/bug.php?id=29776

// buiness logic
$sModule getArrayValue($aGet'url'$sDefaultModule);

if (!
isValidModuleName($sModule))
    die(
'some error message');

$sModuleFile $sModulePath $sModule '.php';

if (!
is_readable($sModuleFile))
    die(
'another error message');

include(
$sModuleFile);

// lib
function getArrayValue($aArray$sKey$mDefault null)
{
    return isset(
$aArray[$sKey]) ? $aArray[$sKey] : $mDefault;
}

function 
isValidModuleName($sName)
{
    return 
preg_match('/[A-Z][A-Za-z]*/'$sName);
}

Ein paar Erläuterungen:

- Mit dem Buchstaben vor den Variablennamen gebe ich den Typ an. Ungarische Notation heißt das glaube ich. Ist absolut hilfreich und wärmstens zu empfehlen.

- Als Modulnamen werden hier per regulärem Ausdruck nur Werte akzeptiert, die mit einem Großbuchstaben beginnen und dann beliebig viele (0-n) Groß- oder Kleinbuchstaben enthalten. Was auch immer du da nimmst - wichtig halt, das keine ".." enthalten sind.

- Wenn du solche Geschichten in Funktionen auslagerst, dann wird dein eigentlicher Code sehr schlank und auch ohne Kommentare gut lesbar.

- <?php würde ich klein schreiben (Großschreibung ist unüblich und könnte Probleme mit IDEs, Highlightern oder sonst was machen) und das letzte ?> kannst du immer weglassen. Ist unnötig und nur zusätzliche Fehlerquelle (falls danach noch Leerzeichen/-zeilen stehen)

Basti

Geändert von Basti (04.10.2007 um 12:54 Uhr).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP 5.1.5, PHP 4.4.4 und PHP 5.2.0 RC2 veröffentlicht Ben Nachrichten 2 01.09.2006 16:05
[PHP] 404-Fehlerseiten als Chance PaterNoster Tutorials 0 23.04.2006 15:04
Neue PHP "release candidates": PHP 4.4.2 RC 1 und PHP 5.1 RC 6 Ben Nachrichten 1 21.11.2005 20:48
Den Traffic einer Seite mit PHP messen Chr!s PHP-Programmierung 8 19.09.2005 17:17
Bild aus DB auslesen und in Seite einbinden pago PHP-Programmierung 10 20.04.2005 09:26


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:06 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44