[php/mysql] Einfaches Gästebuch / Ein Paar Fragen
#16
geschrieben 10. März 2005 - 17:47
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^^
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.
(Konfuzius)
Anzeige
#17
geschrieben 10. März 2005 - 17:52
aber ja, ich habe dadran mitgearbeitet und habe da große Teile des MySQL-Tutorials verbrochen
#18
geschrieben 10. März 2005 - 18:10
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.
#19
geschrieben 10. März 2005 - 18:30
"validiere jeden input oder stirb"
war bis jetzt ganz hilfreich
#20
geschrieben 11. März 2005 - 11:03
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!
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.
(Konfuzius)
#21 _Benjamin_
geschrieben 11. März 2005 - 11:47
edit: achso ... hmmm mal noch 10 minuten abwarten ...
Dieser Beitrag wurde von Xandros bearbeitet: 11. März 2005 - 11:48
#22
geschrieben 11. März 2005 - 11:58
$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;
}
#23
geschrieben 11. März 2005 - 13:07
Zitat
{
$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
wenn das ergebnis >= 600 ist muss $ok auf 1 gesetzt werden, da das ja bedeutet, dass es >= 10 minuten her ist
#24
geschrieben 11. März 2005 - 14:20
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.
#25
geschrieben 11. März 2005 - 14:44
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
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
#26
geschrieben 11. März 2005 - 15:12
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

Hilfe
Neues Thema
Antworten

Nach oben

