Ankündigung

Einklappen
Keine Ankündigung bisher.

Gästebuch mit php und mysql

Einklappen

Neue Werbung 2019

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

  • Gästebuch mit php und mysql

    Bin relativer Programmierneuling und habe gerade mein erstes Gästebuch geschrieben.
    Habt ihr noch irgendwelche Ideen bzw. Verbesserungsvorschläge für mich?

    PHP-Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
              "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Style-Type" content="text/css">
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <title>Zimmermann Daniel</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script type="text/javascript" src="javas.js"></script>
    </head>
        <body>
            
                <div id="haupt">
                    <div id="header" style="background-image: URL(slices/Bilder/header.png); width: 800px; height: 65px;">
                    </div>
                    <div id="menu" style="background-image: URL(slices/Bilder/menu.png);">
                        <div id="button">
                            <a href="index.html" onMouseover="austausch.src='slices/Bilder/homeeffekt.png';" onMouseout="austausch.src='slices/Bilder/home.png'"><img src="slices/Bilder/home.png"  border="0" name="austausch" alt="home"></a><br>
                            <a href="lebenslauf.html" onMouseover="austausch2.src='slices/Bilder/lebenslaufeffekt.png';" onMouseout="austausch2.src='slices/Bilder/lebenslauf.png'"><img src="slices/Bilder/lebenslauf.png"  border="0" name="austausch2" alt="lebenslauf"></a><br>
                            <a href="gast.php?start=0" onMouseover="austausch3.src='slices/Bilder/gbeffekt.png';" onMouseout="austausch3.src='slices/Bilder/gb.png'"><img src="slices/Bilder/gb.png"  border="0" name="austausch3" alt="gaestebuch"></a><br>
                        </div>
                    </div>
                    <div id="main" style="background-image: URL(slices/Bilder/main.png);">
                        <h3>Gästebuch</h3>
                        <div id="gast">
                            <?php
                                error_reporting
    (E_ALL);                            
                                
    define('MYSQL_HOST''localhost');
                                
    define('MYSQL_USER''xxx');
                                
    define('MYSQL_PASS''xxx');
                                
    define('MYSQL_DATABASE''xxx'); 
                                
    mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR
                                    die(
    "Es konnte keine Verbindung aufgebaut werden\n".mysql_error());
                                
    mysql_select_db(MYSQL_DATABASE) OR
                                    die(
    "Konnte ".MYSQL_DATABASE." nicht benutzen ".mysql_error());    
                                    
                                
    $name="";
                                
    $mail="";
                                
    $mitteilung="";
                                
    $gesendet=false;
                                
                                    echo
    '<form action="gast.php" METHOD="POST">';
                                        echo
    '<div id="textfeld">';
                                            echo
    'Name:<br>';
                                            echo
    '<input type="text" name="name" ';
                                                if(
    $name=="" && $REQUEST_METHOD=="POST"){
                                                    echo 
    'value="Bitte Name eingeben"><br>';
                                                    
    $name="Bitte Name eingeben";
                                                }
                                                else{
                                                    echo 
    'value='.$name.'><br>';
                                                }
                                            echo
    'Email:<br>';
                                            echo
    '<input type="text" name="mail"><br>';
                                            echo
    'Mitteilung:(160 Zeichen)<br>';
                                            echo
    '<textarea name="mitteilung" rows="4" cols="16">';
                                                if(
    $mitteilung=="" && $REQUEST_METHOD=="POST"){
                                                    echo 
    'Bitte Mitteilung eingeben';                                                
                                                }
                                                else{
                                                    echo 
    $mitteilung;
                                                }
                                            echo 
    '</textarea><br>';
                                            echo
    '<input type="submit" value="senden">';
                                        echo
    '</div>';
                                    echo
    '</form>';
                                    
                                if(isset(
    $_POST["name"]) && isset($_POST["mitteilung"])){ //prüfen ob alles gesetzt ist
                                    
    $user $_POST["name"];
                                    
    $email $_POST["mail"];
                                    
    $msg $_POST["mitteilung"];
                                    
                                    if(
    preg_match('#[<>&\/\\\]#'$user) || preg_match('#[<>&\/\\\]#'$email) || preg_match('#[<>&\/\\\]#'$msg)){ // spam filter, ob wörter vorkommen mit den bestimmten zeichenfolgen
                                        
    echo '
                                            <div id="again">
                                                Keine Sonderzeichen bitte!
                                            </div>
                                        '
    ;
                                    }
                                    else{        
    // ip adresse vergleichen und schaun ob er innerhalb von 10 minuten gepostet hat                    
                                        
    if($user != null && $msg != null){
                                            
    $datum date("Y.m.d - H:i:s");
                                            
    $ipadresse ="$REMOTE_ADDR";                                
                                            
    $ergebnis "";                                        
                                            
    $result mysql_query("SELECT timestamp FROM gastebuch WHERE ip = '$ipadresse' ORDER BY TIMESTAMP DESC LIMIT 1");
                                            
                                            if(
    mysql_num_rows($result) == 0){ // wenn     keine einträge bisher da sind.. dann...                            
                                                
    $times time();
                                                
    mysql_query($eintrag "INSERT INTO gastebuch(name, mail, mitteilung, datum, ip, timestamp) VALUES ('$user', '$email', '$msg', '$datum','$ipadresse', '$times')");
                                                
    $gesendet=true;
                                            }                                    
                                            else{ 
    // wenn einträge vorhanden sind dann
                                                
    $ergebnis mysql_result($result,0,0);
                                                if(
    $ergebnis 600 time()){ // wenn er früher als 10 minuten postet dann... gehts ned
                                                    
    echo "Du kannst erst in 10 Minuten wieder posten!";
                                                }
                                                else{
                                                    
    $times time(); // ansonsten gehts                                                
                                                    
    mysql_query($eintrag "INSERT INTO gastebuch(name, mail, mitteilung, datum, ip, timestamp) VALUES ('$user', '$email', '$msg', '$datum','$ipadresse', '$times')");
                                                    
    $gesendet true;
                                                }
                                            }
                                        }                            
                                        else{
                                            echo
    '
                                                <div id="again">                                                
                                                    Felder leer, nochmal bitte
                                                </div>
                                            '
    ;
                                        }
                                    }
                                }
                                
    $start 0;
                                
    $count 0;    
                                if(!empty(
    $_GET['start']) AND intval($_GET['start'])){ // schaun ob start leer is, bzw. ob start ein integer ist
                                    
    $start $_GET['start'];
                                }
                                
    $vor $start 3;
                                
    $zuruck $start 3;
                                if(
    $zuruck 1){
                                    
    $zuruck 0;
                                }
                                
                                
    $sql mysql_query("SELECT name, mail, mitteilung, datum FROM gastebuch ORDER BY datum DESC LIMIT ".$start.",3") OR die(mysql_error());    //gebe nur werte aus zwischen start und 3, insgesamt 3                            
                                                    
                                                            
                                
    echo '<div id="eintrage">'// einträge ausgeben
                                    
    while($row mysql_fetch_assoc($sql)){
                                        echo 
    '<b>Datum:</b> '.$row["datum"].'<br>';
                                        echo 
    '<b>Name:</b>'.$row["name"].' @: '.'<a href="mailto:'.$row["mail"].'">'.$row["mail"].'</a><br>';
                                        echo 
    '<b>Mitteilung:</b><br>'.$row["mitteilung"].'<br><br>';
                                        
    $count++;
                                    }
                                echo
    '</div>';                            
                                if(
    $count >= 3){ // vor button
                                    
    echo'
                                        <div id="vor">
                                            <a href="http://www.daniel-zimmermann.at/test/gast.php?start='
    .$vor.'">Nächste Seite</a><br>
                                        </div>
                                        '
    ;
                                }
                                if(
    $start >= 3){ // zurück button
                                    
    echo'
                                        <div id="back">
                                            <a href="http://www.daniel-zimmermann.at/test/gast.php?start='
    .$zuruck.'">Letzte Seite</a>
                                        </div>
                                        '
    ;
                                }
                            
    ?>
                        </div>
                    </div>
                    <div id="footer" style="background-image: URL(slices/Bilder/footer.png); width: 800px; height: 59px;">
                    </div>                
                </div>
                <div id="unten">
                    <a href="http://www.daniel-zimmermann.at" class="p1">2008, Zimmermann Daniel | www.daniel-zimmermann.at</a>  <a href="impressum.html" class="p2">Impressum</a>
                </div>
            
        </body>
    </html>


  • #2
    Hallo,

    2 Sachen:

    1. Solltest du bei solchen Sachen am besten immer nach dem EVA Prinzip gehen, aber dazu müsstest du jetzt das meiste noch mal umschreiben
    2. Das Script ist aufgrund mangelnder Eingabeüberprüfung SQL-Injection anfällig!

    Note: Du solltest dir einen etwas anderen Stil angewöhnen. z.B. ist $ipadresse ="$REMOTE_ADDR"; unsinnig und
    }
    else{


    solltest du auch nicht schreiben. Entweder

    }else{

    oder

    }
    else
    {

    Abgesehen von diesen Kleinigkeiten ist das Script für den Anfang doch recht gelungen.

    Kommentar


    • #3
      Danke für deine rasche Antwort.

      Was ist denn das EVA Prinzip? :P

      Hm... Wie meinst mangelnde Eingabeüberprüfung?
      Meinst du jetzt das was ich in meinem Formular eintragen kann? Dort hab ich eh eine Abfrage, was alles sein darf und was nicht.
      Oder meinst du das man oben in der Adresseleiste das ned eingeben darf.. z.b. start=10 oder so? Also das mit den register_globals!?

      Kommentar


      • #4
        Amazon.de Das Eva-Prinzip

        SQL Injection
        Email Header Injection

        PHP-Code:
                                        echo'<form action="gast.php" METHOD="POST">';
                                            echo
        '<div id="textfeld">';
                                                echo
        'Name:<br>'
        Du solltest die Tags verschachteln, nicht die php Befehle. Das ist unsinnig und unleserlich. Überhaupt wäre eine Trennung von Formularcode und Verarbeitung sinnvoll.

        Die else's gehen in Ordnung. Ist ne Stilfrage.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Zitat von krackmoe Beitrag anzeigen
          Hm... Wie meinst mangelnde Eingabeüberprüfung?
          Nun, guck dir an, was passieren würde, wenn ich ein ' bei Username, Email oder sonst irgendwas sende... z.B. te'st -> da würde ein SQL Fehler heraus kommen. Aber das ist ja noch der harmloseste Fall, man könnte deine ganze Anfrage umschreiben

          Kommentar


          • #6
            Okay..
            Versteh ich..

            Geh ich sowas am besten an indem ich einfach weitere Sonderzeichen blockiere? Oder gibts nen Stichwort, für ne andere Möglichkeit das zu fixen?

            Kommentar


            • #7
              mysql_real_escape_string ist das Zauberwort

              Kommentar


              • #8
                musste die variable mit mysql_real_escape_string filtern, das filtert dann sql code, soweit ich informiert bin

                mfg homekiller

                Kommentar


                • #9
                  Ähm.. ich hab ja in meinem Gästebuch ne Abfrage..

                  Wenn z.b. jetzt name nicht eingegeben wurde, aber Mitteilung schon und auf absenden gedrückt wird.

                  Soll bei Name dann dortstehen. "bitte name eingeben", das tut er auch
                  Wenn jetzt aber in Mitteilung was drinnen steht dann soll dies nicht gelöscht werden sondern, es soll das stehen bleiben was drinnen stand.

                  Ich dachte mir eigentlich, dass meine Abfrage das tut.. Aber irgendwie tuts es nicht!? Kann mir da jmd maybe nen Tip geben?

                  Kommentar


                  • #10
                    Okay hab ich jetzt mit mysql_real_escape_string gemacht.

                    Ist das so richtig:

                    PHP-Code:
                    mysql_query($eintrag "INSERT INTO gastebuch(name, mail, mitteilung, datum, ip, timestamp) VALUES ('$user', '$email', '$msg', '$datum','$ipadresse', '$times')"
                                                            
                    mysql_real_escape_String($user), 
                                                            
                    mysql_real_escape_string($email), 
                                                            
                    mysql_real_escape_string($msg)); 
                    user email und msg sind das was ich eingebe..

                    Kommentar


                    • #11
                      Natürlich

                      $mitteilung="";

                      steht irgendwo relativ weit oben. Danach steht, ohne dass die Variable verändert wurde dann:

                      else{
                      echo
                      $mitteilung;


                      da muss $_POST['mitteilung'] stehen

                      zu 2.

                      Nein ist es leider nicht. gib den String wie normal oben ein und schreibe aber anstatt '$user' z.B. '".mysql_real_escape_string($user),."'

                      Kommentar


                      • #12
                        Danke für die Antwort

                        Ich raff das gerade nicht..

                        Ich soll $_POST['mitteilung']; schreiben.

                        also

                        else{
                        echo '$_POST['.'Mitteilung'.']';
                        }
                        So?? Ich steh gerade sowas von auf der Leitung.

                        Und beim escapen.

                        Warum schreib ich das als String an? Auf der PHP Manual Seite, ist das doch auch kein String?

                        Kommentar


                        • #13
                          Zitat von krackmoe Beitrag anzeigen
                          Danke für die Antwort

                          Ich raff das gerade nicht..

                          Ich soll $_POST['mitteilung']; schreiben.

                          also

                          else{
                          echo '$_POST['.'Mitteilung'.']';
                          }
                          Nun, also enweder mit $_POST['mitteilung'] oder mit irgendwas ähnlichem, jedenfalls was deine Variable, die du ausgegeben hast, leer und deshalb kann auch nix wieder im Nachrichtenfeld stehen.

                          Zitat von krackmoe Beitrag anzeigen
                          Und beim escapen.

                          Warum schreib ich das als String an? Auf der PHP Manual Seite, ist das doch auch kein String?
                          Wahrscheinlich sprichst du das hier an:
                          PHP-Code:
                          $query sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
                                      
                          mysql_real_escape_string($user),
                                      
                          mysql_real_escape_string($password)); 

                          Das ist vollkommen etwas anderes, die Funktion sprintf gibt es her, dass du die Variablen (hier: Rückgabewerte der Funktion mysql_real_escape_string) als Argumente aneinanderreihen kannst. Mysql_real_escape_string tut nichts anderes als wie den String zu maskieren. Das heißt du könntest auch:

                          $user=mysql_real_escape_string($user);

                          schreiben (sowie auch mit den anderen übermittelten Parametern), und dann normal den SQL Befehl ausführen

                          Kommentar


                          • #14
                            Ah herlich.. Danke endlich klappt das mit den Eingaben

                            Hab das jetzt mit dem escapen so gemacht, sollte richtig sein nach meinem Gefühl

                            PHP-Code:
                            $user mysql_real_escape_String($user);
                            $email mysql_real_escape_string($email); 
                            $msg mysql_real_escape_string($msg); 
                            Und dann einfach den normale mysql_query wo ich die Variablen eintrage..
                            Also:
                            PHP-Code:
                            mysql_query($eintrag "INSERT INTO gastebuch(name, mail, mitteilung, datum, ip, timestamp) VALUES ('$user', '$email', '$msg', '$datum','$ipadresse', '$times')"); 

                            Kommentar


                            • #15
                              Jop das geht so durch

                              Kommentar

                              Lädt...
                              X