Methode=POST und trotzdem Werte in der URL?

Alles, was PHP betrifft, kann hier besprochen werden.

Methode=POST und trotzdem Werte in der URL?

Postby Rolf Bergius » 10. August 2005 22:41

Bitte macht mich darau aufmerksam, wenn ich Eure Geduld über die Maßen beanspruche, aber Ihr helft mir sehr.

Mein uploader funktioniert jetzt dank der Hilfe von jakimo72. Die nächste Übung sollte ein Gästebuch werden.

Ich verwende methode="Post", um die Variablen an die Form weiter zu reichen. Die Eingetragenen Werte sind jedoch in der URL sichtbar und leer, wenn ich im Skript darauf zugreifen möchte.

Woran liegt es?

Das Gästebuch besteht aus drei Dateien.
    1. Guestebuch.php -> Hier wird die Form aufgebaut.
    2. eintragen.php -> Hier sollen die Einträge in eine Datei geschrieben werden
    3. guestbook.txt -> Die Datei mit den Einträgen.

1. Guestebuch.php :

Code: Select all
<html>
    <head>
      <title> Beispiel </title>
      <!-- /*            10.08.2005 17:25:49 RB */  -->
    </head>
    <body>
        <h2>Mein Gästebuch</h2>
      <?php
         global $send, $name, $mail, $url, $nachricht;
         include ('eintragen.php');
      ?>

      <form methode="Post" action="<?php $PHP_SELF ?>">

      <input type="hidden" name="send" value="1">
      <div><center>
      <table>
      <tr>
         <td>
         <div>
         <table>
            <tr>
               <td>Ihr Name</td>
               <td> <input type="Text" name="name"> </td>
            </tr>
            <tr>
               <td>Ihre Email-Adresse:</td>
               <td> <input type="Text" name="Email"> </td>
            </tr>
            <tr>
               <td>Ihre Homepage</td>
               <td> <input type="Text" name="URL"> </td>
            </tr>
            <tr>
               <td>Ihre Mitteilung:</td>
               <td> <textarea rows="7" cols="20" name="nachricht"> </textarea> </td>
            </tr>
            <tr>
               <td><input type="submit" value="Abschicken"> </td>
               <td><input type="reset" value="Zurücksetzen"> </td>
            </tr>
         </table>
         </div>
         </td>
      </tr>
      </table>
      </center>
      </div>
      </form>

      <p>Die bisherigen Einträge</p>
      <div>
      <table>
         <tr>
            <td>
               <?php
                  $guestbook='guestbook.txt';
                  include($guestbook);
               ?>
            </td>
         </tr>
      </table>

    </body>
</html>


und

2. eintragen.php:

Code: Select all
<html>
    <head>
      <title> Beispiel </title>
      <!-- /*            10.08.2005 17:25:49 RB */  -->
    </head>
    <body>
        <h2>Eintragen</h2>
        <p>Jetzt werden schöne Texte ins Gästebuch geschrieben</p>
         <?php
            echo $sent;
         $datei ="guestbook.txt";
         if (isset($sent))
            {
            if ($gdatei =fopen($datei, "r+"))
               {
               flock($gdatei, LOCK_EX);
               $inhalt =fread($gdatei, filesize($datei));
               rewind($gdatei);
               fputs($gdatei, '<hr>');
               fputs($gdatei, 'Name: <a href="mailto:'.$mail.'">' .$name.'</a><br>');
               fputs($gdatei, 'Homepage: <a href="'.$URL.'">'.$URL.'</a><br>');
               fputs($gdatei, 'Nachricht: '.$nachricht);
               fputs($gdatei, $inhalt);
               fputs($gdatei, "\n\n");
               fclose($gdatei);
               }
            }
      ?>

    </body>
</html>[quote][/quote]
    User avatar
    Rolf Bergius
     
    Posts: 35
    Joined: 06. August 2005 12:00
    Location: 29614 Soltau

    Postby Wiedmann » 10. August 2005 23:17

    Ich verwende methode="Post"

    a) Das gibt es nicht, weshalb der Brwoser dann den Standard GET nimmt.

    um die Variablen an die Form weiter zu reichen.

    b) Die Variablen im Zielscript müssen natürlich immer den selben Namen haben wie die Namen der Formularelemente im abschickenden Formular.

    und c)
    benutze auch hier wieder die dafür vorgesehenen superglobalen Arrays und nicht register_globals.
    Wiedmann
    AF Moderator
     
    Posts: 17106
    Joined: 01. February 2004 12:38
    Location: Stuttgart / Germany

    Postby jakimo72 » 11. August 2005 09:38

    Im ersten Script steht
    <form methode="Post" action="<?php $PHP_SELF ?>">
    ich persönlich würde da eher
    <form method="Post" action="eintragen.php">
    vorschlagen.
    Und dann aber weg mit dem include ('eintragen.php') aus dem
    ersten Script.
    (Wenn include, dann sollte der Include OHNE <html>- und <body>-tags sein, Ich würde aus Sicherheitsgründen auch immer require_once verwenden...)
    Und auch die Abweisung global ist nur dafür da, um zu zeigen, wie man es nicht machen sollte...
    Und wie schon Wiedmann sagte, ich würde auf 'register globals' verzichten,
    und stattdessen lieber $_POST['name'] anstelle von $name verwenden.
    User avatar
    jakimo72
     
    Posts: 151
    Joined: 07. February 2005 13:25
    Location: Hamburg-Barmbek

    schon gemerkt.

    Postby Rolf Bergius » 11. August 2005 10:08

    Danke für eure Erläuterungen. Funktioniert schon ganz gut und ist auf $_POST umgestellt.

    ich persönlich würde da eher
    <form method="Post" action="eintragen.php">
    vorschlagen.
    Und dann aber weg mit dem include ('eintragen.php') aus dem
    ersten Script.
    (Wenn include, dann sollte der Include OHNE <html>- und <body>-tags sein, Ich würde aus Sicherheitsgründen auch immer require_once verwenden...)


    Warum? Ich lerne jetzt seit fünf Tagen php und merke schon, dass als Skriptsprache mit Internetkontakt Sicherheit ein großes Thema ist.

    Was sind denn so die größten Klöppse, die man vermeiden sollte? Was für Sauereinen kann man denn anstellen, um php zu missbrauchen.

    tschau und danke
    sir rolus
    User avatar
    Rolf Bergius
     
    Posts: 35
    Joined: 06. August 2005 12:00
    Location: 29614 Soltau

    Postby jakimo72 » 11. August 2005 10:53

    Das mit require_once hat nicht viel mit Internetsicherheit
    zu tun, sondern eher Schutz vor übernächtigten Programmierern.
    Require gibt einfach eine richtige Fehlermeldung aus, wenn
    das entsprechende Script nicht da ist. und das _once hilft
    dabei wenn viele Scripts gleiche Includes haben, dass kein
    Include zweimal geladen wird.

    In Sachen Internetsicherheit ist es insbesondere die Möglichkeit
    dass irgendjemand Unbekanntes aus dem Internet irgendwelchen
    Unsinn in Formulare eintragen kann oder gar php-Scripte hochladen kann.

    Um nochmal auf Dein Script mit dem Dateiupload zurückzukommen,
    schalte blos bei Deinem Rechner die Firewall nicht ab, absonsten
    kann jeder Hans und Franz bei Dir eigene PHP-Scrpte hochladen,
    die dann exec('format c:'); oder soetwas machen.
    Also: möglichst Uploads nicht ins htdocs-Verzeichnis.
    Immer überprüfen, wie die Dateiendung und der Mime-Typ richtig sind.
    Uploads am besten immer nur von authorisierten Personen erlauben,
    Auch Bilderupload kann gefährlich sein, wenn Dir jemand einen
    Ausschnitt aus einer Stadtkarte hochläd, kannst Du in nullkommanix
    auf Schadenersatz wegen gestohlenden geistigen Eigentums verklagt werden.


    Auch beliebt sind Angriffe auf eine Datenbank.
    Beispiel:
    Code: Select all
    <html>
    <form method="post">
    <input type="text" name="name">
    <input type="submit" value="OK">
    </form>
    <?php
    mysql_connect("mysql_host", "mysql_user", "mysql_password")
       or die("Keine Verbindung möglich: " . mysql_error());
    mysql_select_db("Meine_Datenbank") or die("Auswahl der Datenbank fehlgeschlagen");
    if(isset($_POST['name']))
    {
    $query = "Insert into meine_tabelle values('".$_POST['name']."')";
    $result = mysql_query($query) or die("Insert fehlgeschlagen: " . mysql_error());
    }
    ?>
    </html>

    Also es wird einfach nur igendetwas ohne Prüfung in eine Datenbank
    geschrieben.
    Was passiert aber, wenn man folgendes eingibt?
    Code: Select all
    Katze'); GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; insert into meine_tabelle values('Hund

    Also niemals ungeprüft eigendwelche Daten entgegennehmen.


    [/code]
    User avatar
    jakimo72
     
    Posts: 151
    Joined: 07. February 2005 13:25
    Location: Hamburg-Barmbek


    Return to PHP

    Who is online

    Users browsing this forum: No registered users and 3 guests