Problem bei einem Script zum auslesen von Dateien aus einem Order

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem bei einem Script zum auslesen von Dateien aus einem Order

    Hallo

    Momentan schreibe ich an einem Script, welches folgendes leisten soll:

    Aus einer vorhandenen Select-Box wählt man einen Jahrgang aus (momentan bestätigt man die Auswahl noch per Button, später dann per onclick).
    Der Wert des gewählten Jahres (z. Bsp. "2010") läuft durch 2 Programmschleifen.
    Diese öffnen einen auf der Festplatte liegenden Ordner selben Namens ("2010") und lesen die Namen der darin enthaltenen Unterordner ein und schreiben sie als Optionen in eine 2 Select-Box (diese wird direkt per PHP generiert).
    Aus dieser 2 Select-Box wählt man wieder einen Punkt (Bsp.: "Mumpitz") aus (ein Thema).
    Der ausgewählte Wert ist wiederrum ein Name einer der oben genannten Unterordner.
    Dieser Unterordner ("Mumpitz") soll geöffnet werden und die darin enthaltenen ca. 10 Bilder sollen auf der Webseite angezeigt werden.

    ---------------------------------------

    Folgende 2 Probleme habe ich:

    Zum einen kann ich derzeit das Php-Scxrupt nur auf dem Server weiterentwickeln, da in
    HTML-Code:
    <form name='form_1' action='$PHP_SELF' method='_self'>
    die Methode _self nicht auf meinem lokalen Apache funktioniert.
    Mein lokaler Server ist folgender: [COLOR="Red"]WampServer Version 2.1
    Created by Romain Bourdon [/COLOR]

    Das zweite Problem ist schwerwiegender: Sobald ich die Auswahl der 2. Select-Box per Form - Button abschicke, vergisst er den gespeicherten Wert der zuvor aus der 1. Select - Box ausgewählt wurde, der ist aber noch wichtig.

    Ich hoffe die Beschreibung ist nicht zu langatmig, aber ich wollte es verständlich machen.

    Ich hoffe jemand kann mir bei den beiden Problemen weiterhelfen.


    Mit freundlichen Grüßen

    david2


    Hier das Script:

    PHP-Code:
    <?
    session_start();
    ?>

    ...

    <HTML>

    ...

    <?php
    error_reporting
    (0);  
    $ordner=$_SESSION['xordner'];
    $uordner=$_SESSION['xuordner'];
    $thema=$_SESSION['xthema'];

    global 
    $handle;
    //global $PHP_SELF;
    //global $jahr;
    //global $xjahr;

    //phpinfo();



    $ordner=$jahr;

    /* Mit bestem Dank an Torben Brodt (auf http://www.easy-coding.de)*/

            
    $content "";

               foreach(
    scandir($ordner) as $file) {
                    if(
    $file[0] != '.') { // Versteckte Dateien nicht anzeigen
                            
    if(is_dir($ordner.'/'.$file)) {
                                    
    $folderArray[] = $file;
                            } else {
                                    
    $fileArray[] = $file;
                            }
                    }
            }



            
    // Erst die Ordner ausgeben
            
    if(isset($folderArray)) {
                    foreach(
    $folderArray as $row) {
                            
    $content .= '<b>'.$row.'</b><br />';
                            
    $content .= '<div style="padding-left:10px;color:#afafaf" />'//Unterordner nach Rechts einrücken
                           // $dateien .= $ordner.'/'.$row; // rekursive Funktion
                            
    $content .= '</div>';
                    }
            }

            
    // ...dann die Dateien ausgeben
          /*  if(isset($fileArray)) {
                    foreach($fileArray as $row) {
                            $content .= '<a href="'.$ordner.'/'.$row.'">'.$row.'</a><br />'; //Dateien verlinken
                    }
            }*/

    // Rekursion ende


    //$uordner=$thema;
    $uordner=$_POST['thema'];

    //echo "OPQ:$ordner"+"$uordner";

    // Mit den folgenden Zeilen lassen sich alle Dateien in einem Verzeichnis auslesen
    echo "t1: $_POST[thema]";

    echo 
    "hund<br>";
    echo 
    "ord+uo: $ordner/$uordner";
    echo 
    "<br>katze";
    //$handle='';
    $handle=opendir ($ordner."/".$_POST['thema']);
    //echo "<br>handle:$handle<br>";

    while ($datei readdir ($handle)) 
        {
        echo 
    "$datei<br>";
        }

    closedir($handle);

    //echo "t: $thema";
    echo "t2: $_POST[thema]";

    $_SESSION['xordner']=$ordner;
    $_SESSION['xuordner']=$uordner;

    //------------------------------------
    //---- Ausgabe der Listboxen --------- //

    echo "
    <form name='form_1' action='
    $PHP_SELF' method='_self'> 

    <table border='0' align='center' width='90%'>
        <tr>
            <td align='center'><font face='Arial' size='2'>1. Bitte wählen Sie einen Jahrgang aus:<br><br>
                <select name='jahr'> <!-- class='forminput-mediathek' onchange='MM_jumpMenu('parent.frames[\'mainframe\']',this,1)'> -->
                    <option selected></option>
                    <option>2012</option>
                    <option>2011</option>
                    <option>2010</option>
                    <option>2009</option>
                    <option>2008</option>
                  </select>
                    <input type='submit' name='Submit' value='Submit'>
                    <input type='reset' name='Reset' value='Reset'>
                <br />
            </font></td>
            <td width='100px' align='center'><span class='extra'>===></span><br /></td>
            <td align='center'><font face='Arial' size='2'>2. Bitte wählen Sie jetzt ein Thema aus:<br><br> 

        </form>
    "
    ;


    echo 
    "
    <form name='form_2' action='
    $PHP_SELF' method='POST'> 

     <select name='thema'>\n"
    ;

       foreach(
    $folderArray AS $name)
       {
       echo 
    "<option>".$name."</option><br>";
       }
    echo 
    "</select>\n";
    echo 
    "<input type='submit' name='Submit' value='Submit'>";
    echo 
    "<input type='reset' name='Reset' value='Reset'>";
    echo 
    "</form><br> </font> </td> </tr> </table>";

    echo 
    "Thema: $thema";

    $_SESSION['thema']=$thema;

    ?>

  • #2
    Zitat von david2 Beitrag anzeigen
    Zum einen kann ich derzeit das Php-Scxrupt nur auf dem Server weiterentwickeln, da in
    HTML-Code:
    <form name='form_1' action='$PHP_SELF' method='_self'>
    die Methode _self nicht auf meinem lokalen Apache funktioniert.
    PHP-Code:
    $_SERVER['PHP_SELF']; 
    Zitat von david2 Beitrag anzeigen
    Das zweite Problem ist schwerwiegender: Sobald ich die Auswahl der 2. Select-Box per Form - Button abschicke, vergisst er den gespeicherten Wert der zuvor aus der 1. Select - Box ausgewählt wurde, der ist aber noch wichtig.
    Verschwinden die Select-Boxen, nach man dort eine Auswahl getroffen hat? Tipp: speicher die Werte in einer Session ab.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Hallo

      Danke für die Antwort.

      Zu meinem Verständnis, muss ich eine dumme Frage stellen.
      Ist das so gemeint:
      HTML-Code:
      <form name='form_1' action='$_SERVER['PHP_SELF']' method='_self'>
      ?

      Damit ich nicht als Trottel dastehe: ich weiß was es mit $_SERVER['PHP_SELF'] auf sich hat, diese Variable enthält den Namen des derzeit laufenden Scriptes / PHP-Datei.

      Ich gebe zu, ich programmiere wenig PHP, aber die Grundlagen kenne ich, bin also kein Anfänger mehr.

      Die Select - Boxen verschwinden nicht.

      Ich habe an bestimmten Punkten ein Echo eingebaut um zu erkennen, bis wo die Variable noch ihren Inhalt hat. Und nach dem Bestätigen der 2. Select-Box steht dann nur noch der Wert aus ebendieser 2. Box da.

      Nach jedem Abschicken einer der beiden <form> wird das Script ja wieder erneut durchlaufen und dabei wird der Inhalt der 1. Variable vergessen.
      Ich habe die Werte schon in session-Variablen gespeichert und trotzdem wird der Inhalt der Variablen vergessen.

      Mit freundlichen Grüßen

      david2
      Zuletzt geändert von david2; 05.04.2012, 15:22.

      Kommentar


      • #4
        Pack die select-Elemente in ein Formular, dann hast auch alle benötigten Daten.

        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          action='$_SERVER['PHP_SELF']'
          1. PHP_SELF ist böse, weil es XSS Attaken ermöglichen kann
          2. da sind Anführungszeichen zu viel.

          die Methode _self nicht auf meinem lokalen Apache funktioniert.
          _self ist keine Methode.
          Da steht dir nur POST und GET zur Verfühgung.
          Wir werden alle sterben

          Kommentar


          • #6
            Optionen

            Ich baue meine optionfelder mit einer funktion auf, welche das selected=selected selbständig zuweist bzw. erhält. (für jede Zeile einmal aufrufen, wobei postfeld deine Variable enthält)

            PHP-Code:
            function optionaufbereiten($feld,$postfeld,$anzeige) {
                
            $sel '';
                if (
            $feld == $postfeld){ 
                    
            $sel ' selected="selected"';
                }
                echo 
            '<option ' $sel 'value="'$feld .'">'.$anzeige .'</option>';

            Hoffe es hilft
            Gruss Markus

            Kommentar


            • #7
              Zitat von combie Beitrag anzeigen
              1. PHP_SELF ist böse, weil es XSS Attaken ermöglichen kann
              Why? Es enthält nur den Pfad der aktuellen Datei, relativ zum Docroot. Man kann das Formziel auch ganz leicht clientseitig manipulieren. Das kann kein Grund sein, $_SERVER['PHP_SELF'] nicht zu benutzen.

              Kommentar


              • #8
                Du musst MIR nicht glauben.
                Solltest du aber....

                Und gegen prüfen kostet dich nichts.
                Google: "php_self xss"
                Wir werden alle sterben

                Kommentar


                • #9
                  Gut, das Problem liegt aber nicht bei PHP, sondern beim Apache. Nginx (und Lighttpd afaik auch, hab ich aber nicht getestet) gibt einen 404er, wenn man versucht, eine Datei als Pfad aufzurufen (siehe Screenshot).


                  Bei Apache kann man sich mit einer einfachen .htaccess behelfen:
                  Code:
                  AcceptPathInfo Off
                  Angehängte Dateien
                  Zuletzt geändert von Malachite; 07.04.2012, 13:41.

                  Kommentar


                  • #10
                    Hmm..
                    Offensichtlich ist dir nicht klar, was ein XSS Angriff ist und wie er funktioniert.

                    Und egal welche Dinge du an den Haaren herbeiziehen möchtest, die Aussage "PHP_SELF ist böse, weil es XSS Attacken ermöglichen kann" hat Bestand.
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      Hallo,

                      ich verstehe einfach nicht, warum man extra Tipparbeit auf sich nimmt, nur um eine Sicherheitslücke einzubauen. Wenn man statt
                      HTML-Code:
                      <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
                      einfach
                      HTML-Code:
                      <form action="" method="POST">
                      schreibt, hat man sich 34 Zeichen und diese XSS-Lücke gespart. Will man zusätzlich noch die GET-Parameter aus der URL loswerden, kann man auch action="?" schreiben.

                      Gruß,

                      Amica
                      Zuletzt geändert von AmicaNoctis; 08.04.2012, 01:27.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        OT: action="" in HTML5: HTML5: Verwirrung über action-Attribut eines Formulares - PHP Forum: phpforum.de Ich bin immer noch nicht schlauer als: „Yeah… *schulterzuck*“

                        Kommentar


                        • #13
                          Zitat von mermshaus Beitrag anzeigen
                          OT: action="" in HTML5: HTML5: Verwirrung über action-Attribut eines Formulares - PHP Forum: phpforum.de Ich bin immer noch nicht schlauer als: „Yeah… *schulterzuck*“
                          Okay, wenn es nicht leer sein darf: action="?"

                          Zitat von http://www.w3.org/TR/html5/urls.html#valid-non-empty-url
                          A URL is a string used to identify a resource.

                          A URL is a valid URL if at least one of the following conditions holds:

                          The URL is a valid URI reference [RFC3986].

                          The URL is a valid IRI reference and it has no query component. [RFC3987]

                          The URL is a valid IRI reference and its query component contains no unescaped non-ASCII characters. [RFC3987]

                          The URL is a valid IRI reference and the character encoding of the URL's Document is UTF-8 or a UTF-16 encoding. [RFC3987]

                          A string is a valid non-empty URL if it is a valid URL but it is not the empty string.

                          A string is a valid URL potentially surrounded by spaces if, after stripping leading and trailing whitespace from it, it is a valid URL.

                          A string is a valid non-empty URL potentially surrounded by spaces if, after stripping leading and trailing whitespace from it, it is a valid non-empty URL.
                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Hi,
                            Zitat von AmicaNoctis Beitrag anzeigen
                            Hallo,
                            ich verstehe einfach nicht, warum man extra Tipparbeit auf sich nimmt, nur um eine Sicherheitslücke einzubauen. Wenn man statt
                            HTML-Code:
                            <form action="<?php echo $_SERVER
                            ['PHP_SELF'] ?>" method="POST">
                            einfach
                            HTML-Code:
                            <form action="" method="POST">
                            schreibt, hat man sich 34 Zeichen und diese XSS-Lücke gespart. Will man zusätzlich
                            noch die GET-Parameter aus der URL loswerden, kann man auch action="?" schreiben.
                            Gruß,
                            Amica
                            Da kann man sich auch die Frage stellen, warum jemand meterweise HTML-Code mit echo ausgibt, anstatt den PHP-Block einfach zu schließen, um sich diese
                            umständliche Art, HTML-Code zu schreiben, zu ersparen. Wahrscheinlich denken diese, jetzt hab' ich 'ne PHP-Seite, also muß auch alles via PHP ausgegeben werden,
                            eben wie dieses action-Attribut im Formular.

                            Gruß
                            Günni

                            Kommentar

                            Lädt...
                            X