WinFuture-Forum.de: [php/mysql] Einfaches Gästebuch / Ein Paar Fragen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

[php/mysql] Einfaches Gästebuch / Ein Paar Fragen

#16 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.475
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 10. März 2005 - 17:47

@urza
Ist die Seite www.php-einfach.de auch von dir?
Find ich total klasse die Tutorials und alles...

Danke wegen der Flood-Kontrolle ich probiere es gleich mal aus^^
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

Anzeige



#17 Mitglied ist offline   Urza 

  • Gruppe: aktive Mitglieder
  • Beiträge: 254
  • Beigetreten: 16. September 04
  • Reputation: 0
  • Wohnort:Dominaria/Aventurien

geschrieben 10. März 2005 - 17:52

was heißt denn auch? so viele hab ich nun auch noch nicht gemacht ^^
aber ja, ich habe dadran mitgearbeitet und habe da große Teile des MySQL-Tutorials verbrochen :P kannst dich ja mal im Forum melden :P aber das geht jetzt doch ziemlich OT, sag mal lieber, ob das hinhaut
0

#18 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 10. März 2005 - 18:10

@corey

Doch, musst du auch bei GET machen. Kommt nur darauf an wie du die Werte verwendest, aber zur Sicherheit solltest du es bei jedem Wert machen der vom Benutzer kommt und in ein SQL Statement eingebaut wird.
0

#19 Mitglied ist offline   Urza 

  • Gruppe: aktive Mitglieder
  • Beiträge: 254
  • Beigetreten: 16. September 04
  • Reputation: 0
  • Wohnort:Dominaria/Aventurien

geschrieben 10. März 2005 - 18:30

hab dazu mal irgendwann das folgende zitat gelesen:
"validiere jeden input oder stirb"
war bis jetzt ganz hilfreich
0

#20 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.475
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 11. März 2005 - 11:03

So, ich habe jetzt ewig an der Flood-Kontrolle rumgemacht und es irgendwie immer noch nicht richtig hinbekommen. Habe wirklich alles versucht, stundenlang, aber jetzt muss ich euch doch noch einmal fragen.
Also ich habe hier dann noch mal den gesamten Code meines Gästebuches, ihr findet die Flood-Kontrolle bei "abschicken".
Vielleicht könnt ihr mir ja bitte mal helfen, indem ihr euch das genauer anschaut:

<?
  include 'functions.php';
  db_connect();

  $action = $_GET["action"];
  $seite = $_GET["seite"];

  // Die Startseite ist automatisch die erste Seite
  if(!isset($seite)) { $seite = 1; }

  // Wieviele Einträge pro Seite angezeigt werden sollen
  $eintraege_pro_seite = 15;
  $start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;

  // Das aktuelle Datum, die aktuelle Uhrzeit und die IP-Adresse werden ermittelt
  $timestamp = time();
  $datum = date("d.m.Y",$timestamp);
  $uhrzeit = date("H:i",$timestamp);
  $ip = getenv("REMOTE_ADDR");

  // Die Tabelle der Datenbank wird selektiert
  // Die Einträge werden nach der ID geordnet (neueste zuerst)
  $dbabfrage = "SELECT * FROM gaestebuch ORDER BY id DESC LIMIT $start,$eintraege_pro_seite";
  $dbergebnis = mysql_query($dbabfrage);

  // Die Variablen werden aus dem Formular übernommen
  $name = mysql_real_escape_string($_POST['name']);
  $email = mysql_real_escape_string($_POST["email"]);
  $eintrag = mysql_real_escape_string($_POST["eintrag"]);

// Der Header vom Gästebuch
echo '<title>Gästebuch</title><center><font size="6"><b>Gästebuch</b></font><br><br>
<a href="?">Gästebuch-Startseite</a><br>
<a href="?action=eintragen">Eintragen ins Gästebuch</a><br><br>';


    #***********************************
    #* ANFANG - abschicken
    #***********************************
    if($action == "abschicken") {

  // Es wird überprüft, ob und wann eine IP-Adresse in der Datenbank eingetragen wurde
  $ip_abfrage = mysql_query("SELECT ipzeit FROM gaestebuch WHERE ipadresse LIKE '$ip'");

  if(mysql_num_rows($ip_abfrage) == 0)
  { $ok = 1; }

  // Falls eine IP-Adresse vorhanden ist und diese in den letzten 10 Minuten eingetragen wurde,
  // wird eine Fehlermeldung aufgerufen
  else
  {
  $ipzeit_pruefen = mysql_fetch_row($ip_abfrage);
  if($timestamp - $ipzeit_pruefen[0] >= 600) # Zeit für Flood-Kontrolle (in Sekunden)
  { $ok = 0; }
  }

  // Falls die Online-IP nicht in den letzten 10 Minuten eingetragen wurde, geht es weiter
  if($ok != 0)
  {

// Fehlermeldungen
if($name == '' or $eintrag == '') { $fehler = 1;
  echo '<b>Fehler!</b> <br><br>';}

if($name == '') { $fehler = 1;
  echo 'Sie haben keinen Namen eingegeben. <br>'; }

if($eintrag == '') { $fehler = 1;
  echo 'Sie haben keinen Eintrag eingegeben. <br>'; }

  if($fehler == 1) {
    echo '<br>Bitte gehen Sie zurück und korrigieren Sie Ihre Eingaben!<br><br>
	<form action="javascript:history.back()"><input type="submit" value="Zurück"></form>'; }

   // Wenn keine Fehler vorhanden sind, wird der Eintrag in die Datenbank gespeichert
   if($fehler != 1)
   {
   $dbeintrag = "INSERT INTO gaestebuch (name, email, eintrag, datum, ipadresse, ipzeit) VALUES ('$name', '$email', '$eintrag', '$datum | $uhrzeit', '$ip', '$timestamp')";

   $gb_eintrag = mysql_query($dbeintrag);

   echo '<br><b>Erfolgreich eingetragen!</b><br><br>Vielen Dank für Ihren Eintrag.<br><br>
   <form action="?"><input type="submit" value="Zurück zum Gästebuch"></form>';
   }

  }

  // Flood-Kontrolle Fehlermeldung
  if($ok == 0) {
echo '<b>Flood-Kontrolle aktiviert!</b><br>Sie haben sich in den letzten 10 Minuten schon einmal eingetragen.<br>Bitte warten Sie ein wenig, bevor Sie sich erneut in das Gästebuch eintragen.<br>'; }

    }
    #***********************************
    #* ENDE - abschicken
    #***********************************


    #***********************************
    #* ANFANG - eintragen
    #***********************************
    elseif($action == "eintragen") {

  echo '
<form action="?action=abschicken" method="post">
Name:<br><input size="20" name="name"><br>
E-Mail:<br><input size="20" name="email"><br>
Eintrag:<br><textarea cols="40" rows="10" name="eintrag"></textarea>

<br><br>
<input type="submit" value="Abschicken">
<input type="reset" value="Zurücksetzen">
</form>
       '; }
    #***********************************
    #* ENDE - eintragen
    #***********************************

    #***********************************
    #* ANFANG - Gästebuch Startseite
    #***********************************
	else {

  // Es werden alle Einträge aus der Datenbank gelesen und in eine Variable gespeichert
  while($dbinhalt = mysql_fetch_object($dbergebnis)) {

echo '
<table width="60%" align="center" cellpadding="2" cellspacing="1" style="border:1px solid #000000; background-color:F0F0F0;">
<tr>
<td width="20%" align="left">('.$dbinhalt->id.') <a href="mailto:'.$dbinhalt->email.'"><b>'.$dbinhalt->name.'</b></a></td>
<td width="20%" align="right"><small>'.$dbinhalt->datum.'</small></td>
</tr>
</table>
<br>
<table width="60%" align="center" cellspacing="1" style="border:0px solid #000000;">
<tr>
<td width="100%" align="center">'.nl2br($dbinhalt->eintrag).'</td>
</table>

<br><br>
     '; }
    }
    #***********************************
    #* ENDE - Gästebuch Startseite
    #***********************************

    #***********************************
    #* ANFANG - Blätterfunktion
    #***********************************

  // Die Einstellungen für die Blätterfunktion
  $seiten_auswahl = mysql_query("SELECT id FROM gaestebuch");
  $seiten_menge = mysql_num_rows($seiten_auswahl);
  $seiten_anzahl = $seiten_menge / $eintraege_pro_seite;

echo '<br><br><hr noshade color="#000000" size="1" width="60%">',
     'Es befinden sich <b>'.$seiten_menge.'</b> Einträge im Gästebuch <br><br>',
     '<b>Seite:</b>';

  // Die Anzahl der Seiten werden mit dieser Schleife ermittelt
  for($a=0; $a < $seiten_anzahl; $a++)
  {
      $b = $a + 1;

   // Für die ausgewählte Seite wird kein Link angezeigt
   if($seite == $b)
      {
      echo ' <b>'.$b.'</b> ';
      }

   // Alle nicht ausgewählten Seiten werden mit einem Link dazu angezeigt
   else
      {
      echo ' <a href="?seite='.$b.'">'.$b.'</a> ';
      }
  }
    #***********************************
    #* ENDE - Blätterfunktion
    #***********************************
?>


Es funktioniert zwar, wenn man sich einträgt und erneut eintragen will, dass dann die Flood-Meldung kommt, aber sie geht nie wieder weg. Sprich: Man kann sich kein zweites mal mit einer IP eintragen. Wäre nett, wenn ihr mir dabei helfen könnt. Danke!

Ihr könnt es ja mal testen -> Klick!
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#21 _Benjamin_

  • Gruppe: Gäste

geschrieben 11. März 2005 - 11:47

hmm habs getestet .... bei mir funktioniert die floodkontrolle :( sauber gemacht :(

edit: achso ... hmmm mal noch 10 minuten abwarten ...

Dieser Beitrag wurde von Xandros bearbeitet: 11. März 2005 - 11:48

0

#22 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 11. März 2005 - 11:58

Ich habe grade nicht die Zeit mir deinen ganzen Gästebuchcode zu analyieseren, aber ich geb dir mal einen Codeschnipsel von meinem Counter, den man auch als Flood-Kontrolle benutzen kann. Wichtig ist nämlich, dass du 'alte' IPs nachher wieder löschst .

$ip = sql::get_ip(); // Meine SQL Klasse hat eine spezielle Funktion um die IP zu ermitteln, siehe unten
$time = time();
$oldtime = $time-3600; /Zeit, nach der eine IP gelöscht wird, wäre in deinem Fall ab wann man wieder posten kann

//Alte IPs löschen, $sql->ex() ist wieder eine Funktion meiner SQL Klasse, die einfach das ausführt was man ihr sagt, ohne große Umwege. 'time' ist die Spalte, wo die Erstellungszeit einer IP gespeichert ist

$sql->ex('DELETE FROM counter_ips WHERE time<'.$oldtime);

//Überprüfen, ob eine IP schon vorhanden ist, also wenn Flood-Protection aktiviert werden muss

//IP in Tabelle einfügen. Falls sie existiert, wird die IP mit der neuen Zeit überschrieben
$sql->ex('REPLACE counter_ips (ip,time) VALUES("'.$ip.'","'.$time.'")');
//$check wird 1 wenn eine neue Zeile eingefügt wird, ist größer wenn die IP überschrieben wird:
$check = mysql_affected_rows();

if ($check==1) {
//darf posten
}
else {
//darf nicht posten
}


und hier die Ermittlung der IP:

   function get_ip() {
    $ip='';
    if (getenv('HTTP_CLIENT_IP')) $ip = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR')) $ip = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('REMOTE_ADDR')) $ip = getenv('REMOTE_ADDR');
    else $ip = 'UNKNOWN';
    return $ip;
   }

0

#23 Mitglied ist offline   Urza 

  • Gruppe: aktive Mitglieder
  • Beiträge: 254
  • Beigetreten: 16. September 04
  • Reputation: 0
  • Wohnort:Dominaria/Aventurien

geschrieben 11. März 2005 - 13:07

Zitat

  else
{
$ipzeit_pruefen = mysql_fetch_row($ip_abfrage);
if($timestamp - $ipzeit_pruefen[0] >= 600) # Zeit für Flood-Kontrolle (in Sekunden)
{
$ok = 0; }
}


das ist genau falschrum :rolleyes:
wenn das ergebnis >= 600 ist muss $ok auf 1 gesetzt werden, da das ja bedeutet, dass es >= 10 minuten her ist
0

#24 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 11. März 2005 - 14:20

Wenn der Code aber folgendermaßen lautet

 if($timestamp - $ipzeit_pruefen[0] >= 600) # Flood-Kontrolle deaktivieren
 { $ok = 1; }


kann man die Sperre umgehen, je nach den Einstellungen des Servers. Ich empfehle, am Anfang des Skriptes $ok = 0; hinzuzufügen. Mann sollte Variablen vorher immer "initialisieren" bevor man sie benutzt.
0

#25 Mitglied ist offline   Mr_Maniac 

  • Gruppe: aktive Mitglieder
  • Beiträge: 768
  • Beigetreten: 29. Juli 02
  • Reputation: 1
  • Geschlecht:Männlich
  • Interessen:Vieles rund um den Computer
    Musik

geschrieben 11. März 2005 - 14:44

Wo wir vorher schonmal dabei waren, möchte ich mal eine kleine Frage zur Sicherheit bei MySQL Abfragen über PHP stellen...

z.B. habe ich auf meiner Seite ein sehr kleines Forum programmiert... Einen Thread im Browser zu öffnen geht dann über eine kleine GET-Abfrage in dem Stil:
Thread.php?Nummer=3


Die SQL-Abfrage, die den Thread öffnet sieht so aus:
"SELECT * FROM Thread WHERE Nr =" . $_GET['Nummer'] . "ORDER By Nr"


Wenn man jetzt z.B.
Thread.php?Nummer=3%20OR%201=1

aufruft, bekommt man alle Einträge aus dem Forum angezeigt.

Gibt es auch da irgendetwas, was ich machen kann (mysql_real_escape_string bringt da ja nichts, weil keine Anführungszeichen verwendet werden)?

Oder würde es schon helfen, die Nummer in Anführungszeichen zu setzen (gleich mal ausprobieren)?

EDIT:
Es hat funktioniert.. Einfach nur die Nummer in der SQL-Abfrage in Anführungszeichen setzen. Also so:
"SELECT * FROM Thread WHERE Nr =\"" . mysql_real_escape_string($_GET['Nummer']) . "\" ORDER By Nr"

Jetzt fragt mich bitte nicht, warum ich hier gepostet habe, anstatt einfach auszuprobieren und zu sehen, ob es geht... Ich weiss es im Nachhinein selber nicht mehr :rolleyes:

EDIT2:
Man habe ich da eben lange herumprobiert...
Das nächste mal schaue ich GLEICH in php.net rein, was eine Funktion macht, und was sie braucht...
Für mysql_real_escape_string() muss bereits eine MySQL-Verbindung aufgebaut sein! Sonst vernichtet die Funktion den Inhalt der Variable...

Dieser Beitrag wurde von Mr_Maniac bearbeitet: 11. März 2005 - 15:56

0

#26 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 11. März 2005 - 15:12

Bei Zahlen kann man es aber auch anders machen, und zwar indem man die Eingabe in eine Zahl umwandelt:
http://de3.php.net/m...tion.intval.php
oder so
http://de3.php.net/m...ion.settype.php

Dieser Beitrag wurde von Floele bearbeitet: 11. März 2005 - 15:14

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0