[PHP] Spam-Schutz für einfaches Gästebuch

Maxefix

Grand Admiral Special
Mitglied seit
20.01.2003
Beiträge
6.223
Renomée
176
  • SIMAP Race
  • QMC Race
Hallo,

ich hab mal wieder ein paar Probleme. Ich nutze auf mehreren Seiten das mtGästebuch von michatronic.de/ (allerdings nicht die aktuelle Version). Soweit so gut, das Gästebuch ist IMO nicht schlecht. Schön kompakt und einfach aufgebaut. Problem ist nur, dass jetzt ein Spambot mein Gästebuch entdeckt hat und da selbiges keinen Spam-Schutz wie Captcha hat, ist das äußerst suboptimal -> ~100 Spameinträge pro Tag.

Deshalb wollte ich so ein Captcha einbaun. Hab auch ein Tutorial gefunden. Ich hab jetzt auch versucht das einzubauen, aber funktionieren tuts nicht. Die Testinstallation ist hier zu finden. Der Inhalt der index.php sieht so aus:
PHP:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xml:lang="de-DE" lang="de-DE"  xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; iso-8859-1" />
	<meta http-equiv="Content-Style-Type" content="text/css" />
	<meta http-equiv="expires" content="0" />
	<title>Gästebuchtitel</title>
</head>
<body>
<h1>Gästebuch</h1>
<?
if(!$_GET['action']) {
print "<p><a href=\"?action=add\">Klicke hier um dich ins Gästebuch einzutragen</a></p>\n"; }

require("config.inc.php");
$action = $_GET['action'];

if($action == '') {

$daten = mysql_query("SELECT count(id) as gesamt from $db_table");
$count = mysql_fetch_array($daten);

// SEITENFUNKTION!
$page = $_GET['page'];
$number = $count[gesamt];

if($page == '') {
$page = 0; }

$seiten = floor($number/$proseite);
$start = $page * $proseite;
$sql = "SELECT * FROM $db_table ORDER BY id DESC LIMIT ".$start.", ".$proseite."";
$result = @mysql_query($sql, $db);
$ende = $start + $proseite;
if($ende>$number){ $ende = $number; }

if($number == 0) {
print "<p>Zur Zeit sind keine Einträge vorhanden!</p>\n"; }
elseif($number == 1) {
print "<p>Zur Zeit ist ".$number." Eintrag vorhanden!</p>\n"; }
else {
print "<p>Zur Zeit sind ".$number." Einträge im Gästebuch</p>\n"; }

$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)) {

$row[text] = nl2br($row[text]);
$row[text] = stripslashes($row[text]);

$row[kommentar] = nl2br($row[kommentar]);
$row[kommentar] = stripslashes($row[kommentar]);

$date = strtotime($row[datum]);
$date = date("d.m.Y", $date);

$time = strtotime($row[uhrzeit]);
$time = date("H:i", $time);

/* Ausgabe-Template */
print "<div>".$row[name];

$mail = $row[email];
if($mail == '') {
print ""; }
else {
print " <a href=\"mailto:".$row[email]."\"><img src=\"email.gif\" width=\"16\" height=\"17\" alt=\"eMail\" /></a>"; }

$homepage = $row[homepage];
if($homepage == '') {
print ""; }
elseif(strtolower(substr($homepage, 0, 7)) == "http://") {
print " <a href=\"".$row[homepage]."\"><img src=\"homepage.gif\" width=\"16\" height=\"16\" alt=\"Homepage\" /></a>"; }
else {
print " <a href=\"http://".$row[homepage]."\"><img src=\"homepage.gif\" width=\"16\" height=\"16\" alt=\"Homepage\" /></a>"; }

print " schrieb am ".$date." um ".$time." Uhr:\n";

print "<p>\n".$row[text]."\n";

$kommentar = $row[kommentar];
if($kommentar == '') {
print ''; }
else {
print "<br /><br /><i>Kommentar des Administrators:</i><br />".$row[kommentar]."\n"; }

print "</p></div>\n";
}
if ($page>0) {
	$i=$page-1;
	echo "<a href=\"?page=$i\">Zurück</a>";

}
if ($page<$seiten) {
	$i=$page+1;
	echo "<a href=\"?page=$i\">Weiter</a>";
}
 }
/* Ende des Ausgabe-Templates */

elseif($action == 'add') {
?>
<h2>Eintragen:</h2>
<form method='post' action='?action=save'>
	<p>
		<label for="name">Name*:</label><br />
		<input type="text" name="name" id="name" size="50" /><br />
		<label for="email">eMail Adresse:</label><br />
		<input type="text" name="email" id="email" size="50" /><br />
		<label for="homepage">Homepage:</label><br />
		<input type="text" name="homepage" id="homepage" size="50" /><br />
		<label for="text">Eintrag*:</label><br />
		<textarea cols="40" rows="10" name="text" id="text"></textarea><br />
		<label for="loesung"><img src="bar.php?<?php echo SID; ?>" alt="captcha" /></label><br />
		<input type="text" name="loesung" id="loesung" size="6" /><br />
		<input type="submit" value="Abschicken" name="submit" /> <input type="reset" value="Zurücksetzen" name="reset" /><br />
		<input type="hidden" name="<?php session_name(); ?>" value="<?php session_id(); ?>" />
		* Pflichtfelder
	</p>
</form>
<p><a href="./">Zurück</a></p>
<?
} elseif($action == 'save') {
if(empty($_POST['name']) OR empty($_POST['text'])) {
$zurueck = "<br /><a href='javascript:history.back(-1)'>Zurück</a>";
$fehler = "<b>Fehler</b><br />";
if(empty($_POST['name'])) {
$fehler .= "- Bitte gebe einen Namen ein!<br />"; }
if(empty($_POST['text'])) {
$fehler .= "- Bitte gebe einen Kommentar ein!<br />"; }
if($_SESSION['loesung'] != $_POST['loesung']) {
$fehler .= "- Falsche Lösung eingegeben!<br />"; }
else {
$fehler .= ""; }
}
print $fehler."".$zurueck;
if($fehler == '') {
$timestamp = mktime();
$time = date("H:i:s", $timestamp);
$datum = date("Y-m-d", $timestamp);
$_POST['text'] = htmlspecialchars($_POST['text'], ENT_QUOTES);

$sql = "INSERT $db_table (id, name, email, homepage, text, kommentar, uhrzeit, datum) VALUES ('', '$_POST[name]', '$_POST[email]', '$_POST[homepage]', '$_POST[text]', '', '$time', '$datum')";

$ergebnis = @mysql_query($sql); 
print "<p>Eintrag erfolgreich!</p>
<p><a href=\"./\">Weiter</a></p>";
} }
?>
<p><a href="admin.php">Adminbereich</a></p>
<p><a href="http://www.michatronic.de">Gästebuch &copy; 2006 by www.michatronic.de</a></p>
</body>
</html>

Meine Bitte: Kann das mal bitte jemand anschaun und mir da weiterhelfen? Hab halt wenig Lust wieder nen anderes Gästebuch zu suchen, vorallem da die meisten mir viel zu aufwendig sind (viele Funktionen brauch ich gar nicht).

Vielen Dank für eure Hilfe. :)

MFG Max
 
Hi

Hmmm... irgendwas mit der Session ID klappt nicht...

Beim Formular steht nämlich das hidden input feld wie folgt im Quellcode:

HTML:
<input type="hidden" name="" value="" />
Eigentlich sollte beim Name ja der Session Name und bei der ID die Session ID eingetragen sein...
Wenn ich übermittle kommt laut http-header auch nur das an:
Code:
name=feelx&email=&homepage=&text=gleich+noch+ein+Test+%3B%29&[COLOR=Red]loesung=866585[/COLOR]&submit=Abschicken&=
nicht aber die Session-Infos.

Weiss aber momentan nicht weshalb?!?

Aber selbst wenn - die Bedingung
PHP:
if($_SESSION['loesung'] != $_POST['loesung'])
dürfte ja trotzdem nicht erfüllt sein (also session_loesung UND post_loesung müssen beide leer sein, sonst käme ja ein "FEHLER" und die variable $fehler wäre nicht leer - und folglich würde der Eintrag nicht eingetragen...
bau mal nen echo $_SESSION['loesung'] und echo $_POST['loesung'] dazu ein... dann weiss man mindestens was die variablen enthalten... (vermutlich beide leer?)


Aber mir ist noch ned klar weshalb die session_Id bzw _name nicht im hidden input feld eingetragen werden... hmhmhmmmmmmmmmm
 
So, beide Variablen ($_SESSION['loesung'] sowie $_POST['loesung']) sind nicht leer. Erstere Variable hat sogar den richtigen Inhalt.... Mal weiter experimentieren, des muss ja irgendwie funktionieren. :)

MFG Max
 
hmm... das heisst, dass die beiden nicht den gleicen inhalt haben? Dann müsste doch auch die entsprechende Bedingung greifen und entsprechend "Falsche Lösung" auslösen *suspect*

So - ich widme mich nun auch noch einer komplexen Sache... einem komlexen Rotwein ;D bis später ;)
 
So, hab den Fehler gefunden. Diese Zeile war der Übeltäter:
PHP:
if(empty($_POST['name']) OR empty($_POST['text'])) {
...
Nur wenn der Name und der Eintrag gefehlt hat, wurden die $_POST und $_SESSION-Variablen verglichen. So hab ich das Problem jetzt gelöst:
PHP:
if(empty($_POST['name']) OR empty($_POST['text']) OR $_SESSION['loesung'] != $_POST['loesung']) {
...
So - ich widme mich nun auch noch einer komplexen Sache... einem komlexen Rotwein ;D bis später ;)
Na dann zum Wohl :)

Und Danke für deine Hilfe :)

MFG Max
 
oh... da oben hab ich gar nicht geschaut ;) congrats! und hoffe, du hast auch noch einen grund anzustossen ;D
 
oh... da oben hab ich gar nicht geschaut ;) congrats! und hoffe, du hast auch noch einen grund anzustossen ;D
Thx, aber muss noch nen anderes Captcha suchen. Des was ich da hab sieht ja nicht allzu professionell aus. *buck*

MFG Max

PS: Zum Anstossen hab ich leider kein Grund, aber egal ;D
 
So, hab doch noch nen Problem. Und zwar wenn man das erste mal das Gästebuch aufruft kommt folgender Fehler: "XML parsing failed: not well-formed"

Und zwar liegt des daran, das alle Links ein "&ganzvieilekomischezahlen" hinten dran ham. Ich denk des liegt an dem Befehl "session_start()", aber was kann ich dagegen tun?

MFG Max

EDIT: OK, mit der Funktion ini_set() konnte ich das Problem lössen :)
 
Zuletzt bearbeitet:
btw: welches captcha hast du jetzt verwendet? Ich fand das alte ganz gut... (gut leserlich z.B.)
 
btw: welches captcha hast du jetzt verwendet? Ich fand das alte ganz gut... (gut leserlich z.B.)
Hab des alte drin gelassen weil ich keine Lust mehr hatte was anderes zu suchen. Aber jetzt hab ich ein anderes "Problem": Ich versteh des mit den Sessions nicht so ganz. Wenn man das Gästebuch das erste mal besucht haben alle Links ein &SID hinten dran. Wenn ich ein zweites mal drauf zugreif (bzw aktualisier) sind die Links wieder normal. Wenn ich die Cookies für die Seite lösch und nochmal drauf geh sind die komischen Links wieder da. Was hat das zu bedeuten bzw warum ist das so? *noahnung*

MFG Max
 
Das hat mit der Cookie/Session-funktion und zu tun. Heisst wenn kein Cookie gesetzt werden kann wird automatisch an alle Links die Session-ID angehangen.

Zum Thema Captcha biete ich seid längerer Zeit selbst eins an. Ist sehr gefragt und gut bewertet!

www.cb-talk.de/captcha.html <- der Link
 
Eine simple möglichkeit spambots auszusperren ist auch, einfach eine checkbox die man anhaken muss.
Klappt meistens. ;)
 
Zurück
Oben Unten