# Spam-Schutz für Gästebuch



## starfoxfs (14. April 2006)

Hallo zusammen und zwar habe ich folgendes Problem:

In meinem Gästebuch kann man Doppelposts über refreshen F5 Spamen. Nun wollte ich fragen wie ich dies umgehen kann.

Ich hab hier mal den Teil des Codes der in die DB einträgt und weiterleitet. Genau bei der Weiterleitung kann dann über F5 gespammt werden.


```
$name = addslashes($name);
$homepage = makelink($homepage);
$gb_text = strip_tags($gb_text);
$gb_text = wordwrap($gb_text, 40, " ", 1);
$titel = addslashes($titel);
$gilde = addslashes($gilde);
$gb_text = addslashes($gb_text);

$eintrag = "INSERT INTO 
guestbook
(id, userid, titel, gilde, text, name, email, icq, homepage, ip_adresse)
VALUES 
('$timestamp', '0', '$titel', '$gilde', '$gb_text', '$name', '$email', '$icq', '$homepage', '$ip_adresse')
";

mysql_query($eintrag) or die("Error: " . mysql_error()); 

}

echo "<script>
function redirect()
{
window.location.replace(\"?include=guestbook&show=anzeigen\");
}
setTimeout(\"redirect();\", 3000);
</script>";
```


----------



## Gumbo (14. April 2006)

Leite einfach nach erfolgreicher Aktion auf dasselbe Skript um:
	
	
	



```
header('Location: '.$_SERVER['REQUEST_URI'], true, 303);
exit;
```


----------



## starfoxfs (14. April 2006)

Das hab ich auchschon probiert nur geht das nicht weil mein Header bereits abgeschickt wurde.

Am liebsten wäre mir eine IP Sperre oder eine Reload Sperre


----------



## Gumbo (14. April 2006)

> […] nur geht das nicht weil mein Header bereits abgeschickt wurde.


Auch dagegen ist ein Kraut gewachsen. So etwa die Funktionen zur Ausgabesteuerung. Besser wäre es jedoch, in solch einem Stil zu programmieren, dass diese Hilfsmittel erst gar nicht nötig sind.

Doch selbstverständlich gibt es auch andere Techniken. Du könntest etwa mit PHP-Sitzungen arbeiten, im Skript des Formulars ein Flag setzen und dieses direkt nach erfolgreicher Aktion wieder löschen.


----------



## siob (30. Mai 2006)

Gumbo hat gesagt.:
			
		

> Leite einfach nach erfolgreicher Aktion auf dasselbe Skript um:
> 
> 
> 
> ...



<< wo genau muss ich das denn einfügen?


----------



## Gumbo (30. Mai 2006)

Hab’ ich das nicht erwähnt?





			
				Gumbo hat gesagt.:
			
		

> Leite einfach nach erfolgreicher Aktion auf dasselbe Skript um […]


----------



## proloser (4. Dezember 2006)

Ist das bei dieser Art von Script auch möglich?
Wenn ja ... wie?

Denn der "header()" kann ich ja nicht ausführen bei "form_check = true"!


```
if($_POST['kontakt_insert_check']) {
  $form_check = "true";

  if(!ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,3})$", $_POST['submit_email'])) { 
    $form_check = "false";
  }
}
  
if($form_check == "true") {
### Mail Senden ###
}
```


----------



## proloser (5. Dezember 2006)

Gumbo hat gesagt.:


> Besser wäre es jedoch, in solch einem Stil zu programmieren, dass diese Hilfsmittel erst gar nicht nötig sind.



Ich habe nun "ob_start()" in meine inc_header.php geschrieben und es funktioniert!
Könnten dadurch Probleme auftauchen oder wesshalb sollte man es nicht verwenden?

MfG proloser


----------



## Hirnhamster (5. Dezember 2006)

Probleme glaub ich nicht, aber eigentlich verwendet man ob_start imho nicht, weil man es normalerweise auch anders lösen kann, dein Problem zumindest


----------



## proloser (6. Dezember 2006)

Und wie wär es anders möglich?

Für den Form Check eine eigene Datei verwenden, sonst fällt mir derzeit nichts anderes ein!

MfG proloser


----------



## mAu (6. Dezember 2006)

Mit Templates arbeite wäre z.B. eine Möglichkeit. Da kann man die Daten dann nach allen Operationen ausgeben.


----------



## CIX88 (7. Dezember 2006)

> if (!ereg ...



Ohje, nimm mal das ereg() dort raus.
1. ereg() ist veraltet
und
2. hat es einen Bug und ist nicht Sicher.

http://bugs.php.net/bug.php?id=19430

heise.de hatte da auch mal etwas darüber geschrieben.


----------



## Malaxo (7. Dezember 2006)

Bau dir doch eine IP Sperre ein. 

1. Schritt IP auslesen und abspeichern
2. Schritt zuerst überprüfen ob IP vorhanden, wenn JA
3. Zeitprüfen (24h)
4. IP älter als 24h = Posten sonst nicht Posten

Es gehen eigentlich so ziemlich alle Möglichkeiten hier. Evt. musst du dein PHP Script ein wenig bearbeiten.

gruss


----------



## mcone (30. Dezember 2006)

Also ich mache es seit einiger Zeit mit einer Eingabe eines zufällig erzeugten Codes. zb. 3659 oder so, klappt prima. Keine Spameinträge mehr.

mfg Matthias


----------



## cameeel (30. Dezember 2006)

Malaxo hat gesagt.:


> Bau dir doch eine IP Sperre ein.
> 
> 1. Schritt IP auslesen und abspeichern
> 2. Schritt zuerst überprüfen ob IP vorhanden, wenn JA
> ...


Eine schlechte Lösung... damit wirst du frühe oder später auf Probleme stoßen.
Die Lösung mit dem Zufalls-Code (auch Captcha genannt) die mcone angesprochen hatte, halte ich für die bessere Lösung


----------



## fireblade1282 (17. Februar 2007)

Ich würde auch zum Captcha raten. Es löst Spam und ungewollte Doppelpostings und selbst grafische Captchas sind gar nicht so schwer wie die meisten wahrscheinlich denken. Noch besser sind logische Captchas, die sind dann auch Behindertengerecht...  da können auch die Moralapostel nichts mehr sagen.

Für alle die keine Ahnung haben wie das gehen soll hier mal ein kurzer Leitfaden für ein
einfaches Text-Captcha:

1. In der Datei die die Formulatdaten des Benutzers aufnimmt wird ganz zu Beginn der Session Start - Befehl ausgeführt... dann wird neben den normalen GB Eingabemöglichkeiten ein Fragetext ausgegeben. Zum Beispiel "Was ist x + y"? Für x und y werden Zufallszahlen ausgegeben (natürlich nur kleine, es soll ja dem User keine Schwierigkeiten machen), Alternativ können auch andere Fragen und Aufgaben zum Beispiel aus einer Textdatei genommen werden.

Die Idee ist natürlich die korrekte Antwort in einer Session Variable zu speichern.


2. In der Datei die das Formulat verarbeitet ist ebenfalls zu Beginn die Session zu starten und bei der Prüfung der Formulardaten kann die angegebene Captcha Antwort mit der korrekten in der Session Variable vergleichen werden....

Für ein billiges aber in den meisten Fällen ausreichendes Textcaptcha sind am vorhandenen Quelltext meist 20 Zeilen Code ausreichend ..  

Ich hab hier sogar noch ein altes PNG Captcha von mir rausgekramt, vllt mag es ja jemand benutzen...

In den HTML Quelltext einfach ein <img src="png_code.php"> notieren
und die png_code.php befüllen mit:


```
<?php 
  // Session starten und Zufallszahlengenerator initialisieren
  session_start();
  srand(microtime()*1000000);

  // code ausdenken und in der Sessionvariable merken
  for ($i = 0; $i < 5; $i++)
    $_SESSION["code"][$i] = (rand(0,1))? chr(rand(65, 90)) : chr(rand(49, 51));
    
  // Bild generieren
  $width  = 140;
  $height = 30;
  $p      = ImageCreate($width, $height); 
  $col    = ImageColorAllocate($p, rand(220,255), rand(220,255), rand(220,255));
  
  // "Hintergrundrauschen"
  for ($i = 0; $i < 10; $i++) {
    $col = ImageColorAllocate($p, rand(200,255), rand(200,255), rand(200,255));
    ImageLine($p, 0, rand(0,$height), $width, rand(0,$height), $col);
    ImageLine($p, rand(0,$width), 0, rand(0,$width), $height, $col);
  }
  
  // 5 Farben für die 5 Captcha Ziffern generieren
  $c1 = ImageColorAllocate($p, 30 + rand(1,120), 30, 30);
  $c2 = ImageColorAllocate($p, 30, 30 + rand(1,120), 30);
  $c3 = ImageColorAllocate($p, 30, 30, 30 + rand(1,120));
  $c4 = ImageColorAllocate($p, 30 + rand(1,120), 30, 30 + rand(1,120));
  $c5 = ImageColorAllocate($p, 30 + rand(1,120), 30 + rand(1,120), 30);
  
  // Die 5 Captcha Lettern ausgeben...
  ImageString($p, rand(2,5), 10  + rand(1,14), rand(1,12), $_SESSION["code"][0], $c1);
  ImageString($p, rand(2,5), 35  + rand(1,14), rand(1,12), $_SESSION["code"][1], $c2);
  ImageString($p, rand(2,5), 60  + rand(1,14), rand(1,12), $_SESSION["code"][2], $c3);
  ImageString($p, rand(2,5), 85  + rand(1,14), rand(1,12), $_SESSION["code"][3], $c4);
  ImageString($p, rand(2,5), 110 + rand(1,14), rand(1,12), $_SESSION["code"][4], $c5);
  
  // Image ausgeben...
  header ("Content-type: image/png");
  ImagePNG($p);
?>
```


----------

