PHP Gästebuch aufpimpen

ekubij

Cadet 4th Year
Registriert
Dez. 2008
Beiträge
92
Hallo zusammen

Ich habe mal eine Gästebuch gemacht, aber dies hat jetzt noch 2 Probleme. Ich hoffe ihr könnt mir beim beheben dieser Probleme helfen

Problem 1:

PHP:
if ($_GET['aktion'] == 70) {
$inhalt = '<form name="input" action="html.php?aktion=70" method="post"><table></tr><td>Name</td><td><input type="text" name="name" /></td></tr><tr><td>Betreff</td><td><input type="text" name="betreff" /></td></tr><tr><td>GB-Eintrag</td><td><textarea name="inhalt" cols="50" rows="6"></textarea></td></tr><tr><td></td><td><input type="submit" value="GB-Eintrag Absenden" /></td></tr><input type="hidden" name="prufen" value="2" /></table></form>';


$inhalt = $inhalt.="<br /><br />";

$gaestebuch = mysql_query("SELECT datum, name, betreff, inhalt FROM gaestebuch ORDER BY datum DESC");
while($row = mysql_fetch_array($gaestebuch))
  {
  $inhalt = $inhalt."<table>";
  $inhalt = $inhalt."<tr><td><i>".$row['datum']." am ".$row['name']."</i></tr></td>";
  $inhalt = $inhalt."<tr><td><b>".$row['betreff']."</b></tr></td>";
  $inhalt = $inhalt."<tr><td><b>".$row['inhalt']."</b></tr></td>";
  $inhalt = $inhalt."</table><hr />";
  }

if($_POST['prufen'] == '2') {

$_POST[GB] = str_replace("\n", "<br />", $_POST[GB]);
$_POST[GB] = str_replace("\t", " ", $_POST[GB]);
$_POST[GB] = str_replace("ä¤", "&auml;", $_POST[GB]);
$_POST[GB] = str_replace("ö", "&ouml;", $_POST[GB]);
$_POST[GB] = str_replace("ü", "&uuml;", $_POST[GB]);
$_POST[GB] = str_replace("Ä", "&Auml;", $_POST[GB]);
$_POST[GB] = str_replace("Ö–", "&Ouml;", $_POST[GB]);
$_POST[GB] = str_replace("Ü", "&Uuml;", $_POST[GB]);
$_POST[GB] = str_replace("java", " ", $_POST[GB]);
$_POST[GB] = str_replace("script", " ", $_POST[GB]);
$_POST[GB] = str_replace("delete", " ", $_POST[GB]);
$_POST[GB] = str_replace("database", " ", $_POST[GB]);
$_POST[GB] = str_replace("select", " ", $_POST[GB]);



mysql_query("INSERT INTO gaestebuch (name, betreff, inhalt) VALUES ('".$_POST[name]."', '".$_POST[betreff]."', '".$_POST[inhalt]."')");
}

Jetzt habe ich gemerkt, dass ich noch andauernd Spam bekomme. Welche Spamschütze sollte ich am besten einsetzten?

2 Problem:

Ich habe gesehen, dass es die Einträge alle untereinander schreibt, ich hätte es aber gerne, dass es nach 5 eine neue Seite macht. Weiss jemand von euch wie das geht? (Kann ich das mit einem Sql-query machen?

greez
 
Alter Schwede...

http://php.net/manual/en/security.php - deine erste Lektüre des Tages.

Zum Spam: Füg eine Plausibilitätsabfrage ein. Ein Textfeld zur Eingabe einer Zahl. Daneben schreibst du dann sowas wie "x + y = ?" und erstellst per Zufall x und y. Dann kommt da noch ein hidden-input hin, in dem das Ergebnis als Hash hinterlegt ist:

<?php $x = rand(1,5); $y = rand(1,5); ?>
<input type="text" value="" name="eingabe" /> Bitte <?= $x ?> + <?= $y ?> eingeben.
<input type="hidden" value="<?= md5($x+$y) ?>" name="ergebnis" />

Bei der Formularübermittelung prüfst du dann, ob das Ergebnis zur Eingabe passt:

<?php if(md5($_POST["eingabe"]) != $_POST["ergebnis"]) { echo "Fehler!"; } { echo "Weiter!"; } ?>


Zum zweiten Teil: Dafür gibt es in MySQL "LIMIT".
 
Captcha:

http://www.google.com/recaptcha

lässt sich ohne Mühe einbinden...


die methode von Stefan- ist nur im ansatz gut , da ein bod auch rechnen kann....
eine idee wäre wenn du die rechnenaufgabe als bild speicherst.

ich bevorzuge dennoch repatcha
 
Es ist auch schon hilfreich, einfach irgendeinen Text in Photoshop/Paint/Irfanview o.ä. als Bild abzuspeichern und das als Captcha zu verwenden.
Beim Aufruf der Seite und beim Vorliegen von $_POST musst du dann nur noch im PHP-Skript abprüfen, ob der vom Nutzer in den "Captcha"-input eingegebene Text der gleiche ist wie in deinem erstellten Bild.

Deine gewünschte Aufteilung nach je 5 Einträgen ist eigentlich sehr einfach.
Bei der Ausgabe der Einträge musst du eine Zählvariable mitlaufen lassen, die du idealerweise, aber nicht unbedingt notwendigerweise mit 0 initialisiert hast.
Nun gibt es zwei Möglichkeiten.
a) Du rechnest bei jeder einzelnen Ausgabe eines Eintrags
PHP:
if ($zaehlvariable % 5 == 0) {
/* beginne eine neue Seite */
}
b) Du rechnest
PHP:
if ($zaehlvariable / 5 - 5 == 0) {
/* beginne eine neue Seite */
}
Beide Wege machen im Prinzip das Selbe, nämlich modulo rechnen. Modulo ist eine Rechenoperation, die dir den Rest einer Division zurückgibt. Ist dieser 0, hast du ein ganzzahliges Vielfaches deines Divisors (in diesem Fall 5) gefunden - der praktische Nutzen: Du weißt dadurch, dass du eine neue Seite für deine Einträge anfangen musst.

Nur noch ein letzter Eindruck zu deinem Skript: Ich habe nicht den Eindruck, als wüsstest du wirklich, wo deine Ein- und Ausgabe hängt. Kannst du mit PHP umgehen oder ist das Skript kopiert?

@ alle anderen:
Ein Forum sollte zum Helfen da sein, nicht, um angemacht zu werden. Natürlich hätte er auch mehr Arbeit in Google stecken können, aber wo er jetzt schon mal hier ist, kann man ihm genauso gut helfen, anstatt lmgtfy-Links zu posten.
 
@fRaNkLiN

ich finde das ich ihn mit meinem Link geholfen habe...

http://www.google.com/recaptcha ist die Homepage von ReCatcha ;-) (gehört mittlerweile zu Google) inkl Download und ausführlicher anleitung.

Einfacher geht es nicht und ich benutze es auch
Ich finde das ist nicht nur als schnelle Spamabhilfe für ihn bestens geeignet
 
@fRaNkLiN

Danke für deinen wertvollen Beitrag. Ich weiss schon, dass ich wohl ein bisschen mehr Zeit beim suchen in Google verbringen hätte können, aber ich dachte da ich gerade auf Computerbase war könnte ich auch nach euren Erfahrungen fragen, villeicht hat jemand von euch ja schon selber Erfharungen zu diesem Thema gemacht.

@rejoice ebenfalls danke, du hast mir sehr geholfen, ich werde es mir überlegen mit deinem link würde wohl schon sehr sinn machen

@alle
Denkt ihr das den http://www.google.com/recaptcha einsetzten soll? oder eher eine solche Lösung wie Stefan- oder fRaNkLiN es beschrieben haben?
 
rejoice schrieb:
@fRaNkLiN

ich finde das ich ihn mit meinem Link geholfen habe...

http://www.google.com/recaptcha ist die Homepage von ReCatcha ;-) (gehört mittlerweile zu Google) inkl Download und ausführlicher anleitung.

Einfacher geht es nicht und ich benutze es auch
Ich finde das ist nicht nur als schnelle Spamabhilfe für ihn bestens geeignet
Entschuldige, deinen Beitrag habe ich übersehen.
ekubij schrieb:
@fRaNkLiN

Danke für deinen wertvollen Beitrag. Ich weiss schon, dass ich wohl ein bisschen mehr Zeit beim suchen in Google verbringen hätte können, aber ich dachte da ich gerade auf Computerbase war könnte ich auch nach euren Erfahrungen fragen, villeicht hat jemand von euch ja schon selber Erfharungen zu diesem Thema gemacht.

@rejoice ebenfalls danke, du hast mir sehr geholfen, ich werde es mir überlegen mit deinem link würde wohl schon sehr sinn machen

@alle
Denkt ihr das den http://www.google.com/recaptcha einsetzten soll? oder eher eine solche Lösung wie Stefan- oder fRaNkLiN es beschrieben haben?
Das ReCaptcha ist sehr einfach einzubinden, und es bietet eine noch wesentlich größere Sicherheit als ein eigenes Captcha. Es ist mindestens gleichwertig, wenn nicht noch besser als ein eigenes Captcha.
 
Stefan- schrieb:
Alter Schwede...

http://php.net/manual/en/security.php - deine erste Lektüre des Tages.


Kurz zusammengefasst: Du darf nie, nie, nie, nie, nie vom Nutzer bzw. von außen kommende Variablen (also POST und GET) direkt und ungeprüft in ein SQL-Query schreiben [edit: oder sonst wie verarbeiten!]. Das ist in etwa genauso wie ungeschützer Geschlechtsvekehr in Zentral-Afrika....

Pfui:
PHP:
mysql_query("INSERT INTO gaestebuch (name, betreff, inhalt) VALUES ('".$_POST[name]."', '".$_POST[betreff]."', '".$_POST[inhalt]."')");
}

Hui:
PHP:
// mit htmlspecialchars() den groben Dreck entfernen
// siehe dazu http://de.php.net/manual/de/function.htmlspecialchars.php

$name = htmlspecialchars($_POST[name]) ;
$betreff = htmlspecialchars($_POST[betreff]) ;
$inhalt = htmlspecialchars($_POST[inhalt]) ;

// anschließende Desinfektion mit mysql_real_escape_string()
// siehe dazu http://de.php.net/manual/de/function.mysql-real-escape-string.php

$sql = 'INSERT INTO gaestebuch (name, betreff, inhalt) VALUES (\''.mysql_real_escape_string($name).'\', \''.mysql_real_escape_string($betreff).'\', \''.mysql_real_escape_string($inhalt).'\')' ;
if(mysql_query($sql))
   {
       echo 'Eintrag gespeichert' ;
   }
 
Zuletzt bearbeitet:
Hallo zusammen

Ich bins nochmals.

Also ich danke nochmals allen für die Antworten.

Ehm ich habe jetzt reCAPTCHA jetzt bei meinem Gästebuch http://handball-balsthal.ch/jere/html.php?aktion=70 eingebaut.

Das hat aber nun noch einige Probleme, z.B dass ich zwar das reCAPTCHA Feld sehe, aber ich momentan trotzdem noch neue Gästebucheinträge erstellen kann. Ein weiteres Problem ist, wenn ich nach unten scrolle kommt das Type the two words Feld immer mit. Und das reCAPTCHA kann ich mit CSS platzieren?

PHP:
if ($_GET['aktion'] == 70) {
$inhalt = '<form name="input" action="html.php?aktion=70"method="post">
<script type="text/javascript"    
src="https://www.google.com/recaptcha/api/challenge?k=6LdubMASAAAAABZB2Y-VkycRx7mrTloJY5dhm9xM"> 
</script>  
<noscript>    
<iframe src="https://www.google.com/recaptcha/api/noscript?k=6LdubMASAAAAABZB2Y-VkycRx7mrTloJY5dhm9xM"        
height="300" width="500" frameborder="0"></iframe><br>    
<textarea name="recaptcha_challenge_field" rows="3" cols="40">    </textarea>    
<input type="hidden" name="recaptcha_response_field"        value="manual_challenge"> 
</noscript>

<table></tr><td>Name</td><td><input type="text" name="name" /></td></tr><tr><td>Betreff</td><td><input type="text" name="betreff" /></td></tr><tr><td>GB-Eintrag</td><td><textarea name="inhalt" cols="50" rows="6"></textarea></td></tr><tr><td></td><td><input type="submit" value="GB-Eintrag Absenden" /></td></tr><input type="hidden" name="prufen" value="2" /></table></form>';

 $inhalt = $inhalt.="<br /><br />";

$gaestebuch = mysql_query("SELECT datum, name, betreff, inhalt FROM gaestebuch ORDER BY datum DESC");
while($row = mysql_fetch_array($gaestebuch))
  {
  $inhalt = $inhalt."<table>";
  $inhalt = $inhalt."<tr><td><i>".$row['datum']." am ".$row['name']."</i></tr></td>";
  $inhalt = $inhalt."<tr><td><b>".$row['betreff']."</b></tr></td>";
  $inhalt = $inhalt."<tr><td><b>".$row['inhalt']."</b></tr></td>";
  $inhalt = $inhalt."</table><hr />";
  }

Vielleicht kann mir ja jemand von euch helfen

@f1am3 dein Vorschlag werde ich heute anschauen und probieren umzusetzten.

grreez
 
Sry das ich diesen Thema nochmals wiederbelebe, aber ich habe mich in der letzten Zeit nochmals sehr über das Thema Spamschutz bei Gästebüchern informiert, und gesehen, das einige sehr viel von Captchas halten, andere wieder um gar nicht und diese würden es ohne Captcha machen.

Meine Frage jetzt an euch, würdet Ihr es mit Captchas lösen oder ohne? Wiso?

greez
 
fRaNkLiN schrieb:
[...]Das ReCaptcha ist sehr einfach einzubinden, und es bietet eine noch wesentlich größere Sicherheit als ein eigenes Captcha. Es ist mindestens gleichwertig, wenn nicht noch besser als ein eigenes Captcha.

Kommt drauf an was man für welches hat und wie es funktioniert, abgerufen und verarbeitet wird :-)
Sehe ich das richtig, dass du wegen den Seiten ihm wirklich empfiehlst nur 5 Stück auszugeben, aber alle zu verarbeiten?
Da wäre es deutlich sinnvoller, die 5 gefragten nur abzufragen. Wird bei sehr vielen Beiträgen Resourcen sparen.

1.) Auszählen aller Einträge (zählen, nicht die Einträge selbst abrufen)
2.) Maximale Darstellung eines *Seite* definieren
3.) In den Links (weiter- zurück, Seite 5/10 etc.) einfach die Zahlenposition zählen (solang sie nicht im logischen Konflikt mit der Gesamtzahl steht.

Ein belibiges Beispiel aus einem Skript:
PHP:
$picture['overview']['query'] = mysql_query("
SELECT
	COUNT(*) sum
FROM
	`".$DataBase['picture']."`
",$MySQL['Connection'][0]);
$pic['overview']['mysql'] = mysql_fetch_array($picture['overview']['query']);
$picture['overview']['count']['total'] = $pic['overview']['mysql'][0];
mysql_free_result($picture['overview']['query']);

$picture['overview']['limit'][1] = 25;
$picture['overview']['limit'][0] = 0;
$picture['overview']['step'] = 25;

if(isset($_GET['limit1'])) {
	$limit_1 = @intval($_GET['limit1']);
	if($limit_1 > 0 AND $limit_1 < $picture['overview']['count']['total']) {
		$picture['overview']['limit'][0] = $limit_1;
	}
}


$picture['overview']['query'] = mysql_query("
SELECT
 *
FROM
	`".$DataBase['picture']."` AS pic
LIMIT
	".$picture['overview']['limit'][0].", ".$picture['overview']['limit'][1]."
",$MySQL['Connection'][0]);
while($pic['overview']['mysql'] = mysql_fetch_assoc($picture['overview']['query'])) {
/* Auswertung der Einträge */
}
			if(($picture['overview']['limit'][0]-$picture['overview']['step']) >= 0) {
			echo '<a href="?limit1='.($picture['overview']['limit'][0]-$picture['overview']['step']).'">zurück</a>';
			}
			if(($picture['overview']['limit'][0]+$picture['overview']['step']) < $picture['overview']['count']['total']) {
			echo '<a href="?limit1='.($picture['overview']['limit'][0]+$picture['overview']['step']).'">weiter</a>';
			}
 
Ist das arbeiten mit hidden-felder genug sicher gegen die Spam-Bots?

Also etwas in dieser Art:

PHP:
<label class="hidden" for="vorname">Vorname</label>
<input type="text" name="vorname" value="" />

dazu ein Stylesheet das .hidden auf display: none setzt und das ganze außerhalb vom sichtbaren document lagert position: absolute; left: -1000;

greez
 
Zurück
Oben