Rechenaufgabe im Gästebuch
Hallo nochmal,
ich als PHP-Neuling tue mich momentan richtig schwer, mein kleines Gästebuch zu erstellen. Ansich funktioniert es gut, allerdings wurde wohl ein Bot auf uns aufmersam, seitdem sind dort am Tag 50 Spam-Beiträge. Nach langem suchen bzgl. Abwehr habe ich mich jetzt für die Rechenvariante entschieden, also einfach eine kleine Plus/Minus Aufgabe einzubauen. Ich sitze jetzt seit gestern Nacht dran, habe den Code gelöscht, wieder neu geschrieben, Teile geändert....kennt ihr ja. Nun weiß ich keinen Rat mehr und wende mich ans Forum. So sieht der wesentlich Code momentan aus:
Kann noch nicht gehen, ich weiß . Mein Problem liegt nun darin, dem Gästebuch zu sagen "wenn 'sicherheitscode' == $ergebnis, dann eintrag, ansonsten nicht". Dazu hatte ich mir folgendes überlegt:
Funktioniert aber nicht, die Einträge gehen auch so. Wo liegt mein Denkfehler? Bin für jeden Vorschlag dankbar.
Mfg
Mitchell
ich als PHP-Neuling tue mich momentan richtig schwer, mein kleines Gästebuch zu erstellen. Ansich funktioniert es gut, allerdings wurde wohl ein Bot auf uns aufmersam, seitdem sind dort am Tag 50 Spam-Beiträge. Nach langem suchen bzgl. Abwehr habe ich mich jetzt für die Rechenvariante entschieden, also einfach eine kleine Plus/Minus Aufgabe einzubauen. Ich sitze jetzt seit gestern Nacht dran, habe den Code gelöscht, wieder neu geschrieben, Teile geändert....kennt ihr ja. Nun weiß ich keinen Rat mehr und wende mich ans Forum. So sieht der wesentlich Code momentan aus:
<?php
$zahl1 = rand(10,20);
$zahl2 = rand(1,10);
$operator = rand(1,2);
if($operator == "1"){
$operatorzeichen = " + ";
$ergebnis = $zahl1 + $zahl2;
}else{
$operatorzeichen = " - ";
$ergebnis = $zahl1 - $zahl2;
}
echo $zahl1.$operatorzeichen.$zahl2;
?>
<input type="text" name="sicherheitscode" size="5">
<input type="submit" value="Absenden">
</form></div>
<?php
if (isset($_POST['action']) && $_POST['action'] == "add"){
if ($_POST['name'] == "" || $_POST['text'] == ""){
echo "Du hast nicht alle Felder ausgefüllt !<hr>";
else{
$guestbook = file_get_contents("gaestebuch.txt");
$_POST['text'] = str_replace("\n","<br>",$_POST['text']);
$_POST['eintrag'] = "<span style=font-size:23>Eintrag von: <a href=\"mailto:$_POST[mail]\">$_POST[name]</a><br>
$_POST[text]<br>
<a href=\"http://$_POST[www]\" target=_blank>$_POST[www]</a><hr></span>";
$datei = fopen("gaestebuch.txt","w+");
fwrite($datei,$_POST['eintrag'].$guestbook);
fclose($datei);
echo "Danke für deinen Eintrag <i>$_POST[name]</i><hr>";
}}
readfile("gaestebuch.txt");
?>
Kann noch nicht gehen, ich weiß . Mein Problem liegt nun darin, dem Gästebuch zu sagen "wenn 'sicherheitscode' == $ergebnis, dann eintrag, ansonsten nicht". Dazu hatte ich mir folgendes überlegt:
if (POST_['sicherheitscode'] == $ergebnis){
$guestbook = file_get_contents("gaestebuch.txt");
$_POST['text'] = str_replace("\n","<br>",$_POST['text']);
$_POST['eintrag'] = "<span style=font-size:23>Eintrag von: <a href=\"mailto:$_POST[mail]\">$_POST[name]</a><br>
$_POST[text]<br>
<a href=\"http://$_POST[www]\" target=_blank>$_POST[www]</a><hr></span>";
$datei = fopen("gaestebuch.txt","w+");
fwrite($datei,$_POST['eintrag'].$guestbook);
fclose($datei);
echo "Danke für deinen Eintrag <i>$_POST[name]</i><hr>";
}
else
echo "Falsches Ergebnis";
readfile("gaestebuch.txt");
?>
Funktioniert aber nicht, die Einträge gehen auch so. Wo liegt mein Denkfehler? Bin für jeden Vorschlag dankbar.
Mfg
Mitchell
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 89780
Url: https://administrator.de/contentid/89780
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
11 Kommentare
Neuester Kommentar
Du musst $ergebnis ja irgendwo speichern... oder übergeben. Wäre aber sinnfrei Selbst codiert.
Folgender Vorschlag:
Speichere $ergebnis in der Session des Benutzers (http://de.php.net/session) oder legst eine
Datei mit dem String als Namen an, die du hinterher löschst (existiert sie nicht -> falscher code)
Folgender Vorschlag:
Speichere $ergebnis in der Session des Benutzers (http://de.php.net/session) oder legst eine
Datei mit dem String als Namen an, die du hinterher löschst (existiert sie nicht -> falscher code)
Wenn du beim ersten Aufruf (Besucher sieht die Eingabemaske) eine Aufgabe + Ergebnis generierst, stimmt soweit erstmal alles. Wenn er nun auf "Absenden" geht, werden einige Werte übergeben und das Skript läuft von neuem ab. Es wird eine neue Aufgabe + Ergebnis generiert. Das vom Besucher eingegebene Ergebnis ist also nicht mehr gleich dem nun neu generierten. Ausser du übergibst das vom Besucher eingegebene Ergebnis UND das richtige. Aber dann kann jeder Bot das Ergebnis auf dem Quelltext lesen. Also musst du es irgendwie "unsichtbar" übergeben. Das geht über Sessions, Datenbanken oder Dateibasiert (gibt bestimmt noch andere Wege).
Hi Mitchell,
wenn du Variablen an eine Session übergibst, mußt du im Script auch die Session starten.
Die Rechenaufgabe darf nur generiert werden, wenn der Submit-Button
NICHT angeklickt wurde. Ansonsten wird ja eine neue Aufgabe
generiert, wenn der User das Formular absendet und das richtig eingegebene
Ergebnis stimmt ja dann nicht mit dem neu generiertem überein.
Gästebucheintrag dann abhängig von der Eingabe des Users:
Das Textfeld usercode habe ich im Formular folg. deklariert:
Die Schnipsel sind aus dem Script, das ich dir in einem anderen Thread gepostet habe,
die mußt du dann bei dir anpassen. Wenn du das Script mit Rechenaufgabe komplett
haben möchtest, poste ich es nochmal.
Gruß
Günni
wenn du Variablen an eine Session übergibst, mußt du im Script auch die Session starten.
<?
// Session starten
session_start();
?>
Die Rechenaufgabe darf nur generiert werden, wenn der Submit-Button
NICHT angeklickt wurde. Ansonsten wird ja eine neue Aufgabe
generiert, wenn der User das Formular absendet und das richtig eingegebene
Ergebnis stimmt ja dann nicht mit dem neu generiertem überein.
<?
/*
Nur einen neuen Code erzeugen, wenn der Submit-Button nicht
angeklickt wurde. Ansonsten würde ein bereits generierter Code
überschrieben und der Code, den der User eingibt, würde mit dem
neu generiertem Code verglichen. Damit würde ein Eintrag niemals
stattfinden.
cmd = Name des Submit-Buttons
*/
if(!isset($_POST['cmd'])){
$zahl1 = mt_rand("1","99");
$zahl2 = mt_rand("1","99");
$code = $zahl1 + $zahl2;
// Variablenwert an Sessionvariable übergeben
$_SESSION['captcha_code']=$code;
}
?>
Gästebucheintrag dann abhängig von der Eingabe des Users:
<?
/* Gästebucheintrag
usercode = Name des Textfelds, in das der User das Ergebnis einträgt
*/
if(isset($_POST['cmd'])){
if($_SESSION['captcha_code'] == $_POST['usercode']){
$msg=str_replace("\n","",$_POST['eintrag']);
$eintrag=$_POST['nick']."||".$_POST['mail']."||".date("Y-m-d")."||".$msg;
$handle = fopen("pub/guest.txt","a");
fputs($handle, $eintrag."\n");
fclose($handle);
//Nach Eintrag Seite neu aufrufen, da sonst die Postdaten noch
//gespeichert sind und ein Klick auf Neuladen immer wieder
//den selben Eintrag speichert
header("location:guestbook2.php");
}else{
echo "Ergebnis falsch eingegeben.<a href=\"guestbook2.php\"> Zurück </a> zur Startseite.";
exit;
}
}
?>
Das Textfeld usercode habe ich im Formular folg. deklariert:
<?
. . .
<td valign="middle" colspan="2">Ergebnis eingeben <?echo $zahl1." + ".$zahl2;?> --> <input type="text" name="usercode"/></td>
. . .
?>
Die Schnipsel sind aus dem Script, das ich dir in einem anderen Thread gepostet habe,
die mußt du dann bei dir anpassen. Wenn du das Script mit Rechenaufgabe komplett
haben möchtest, poste ich es nochmal.
Gruß
Günni
Hi Mitchell,
Wenn das Script durch Klick auf den Submit-Button erneut aufgerufen wird, sind die Inhalte
von Variablen futsch, deshalb gibt es die Möglichkeit Session-Variablen zu belegen, die sind
solange gültig, bis der Browser beendet wird und damit auch die Session.
Du mußt also, ohne Session, dafür sorgen, dass Variableninhalte irgendwie "weiter transportiert" werden.
Das kannst du im vorliegendem Fall z.B. durch ein verstecktes Textfeld im Formular
realisieren, dem du das Ergebnis der Rechenaufgabe zuweist:
Die Auswertung erfolgt dann analog zur Session-Version:
Was ist daran unsicher?
Der Name des Textfeldes und der Inhalt sind im Quelltext der Seite sichtbar.
Ob es möglich ist, weiß ich nicht, aber es wird natürlich befürchtet, dass ein
Bösewicht sich deinen Quelltext ansieht und seinen BOT so programmiert,
dass er dir automatisch ein richtiges Ergebnis unterschiebt, und munter Einträge
in dein Gästebuch vornimmt.
Gruß
Günni
. . . warum wäre es unsicher, das Ergebnis der Aufgabe NUR in einer Variablen zu speichern?
Wenn das Script durch Klick auf den Submit-Button erneut aufgerufen wird, sind die Inhalte
von Variablen futsch, deshalb gibt es die Möglichkeit Session-Variablen zu belegen, die sind
solange gültig, bis der Browser beendet wird und damit auch die Session.
Du mußt also, ohne Session, dafür sorgen, dass Variableninhalte irgendwie "weiter transportiert" werden.
Das kannst du im vorliegendem Fall z.B. durch ein verstecktes Textfeld im Formular
realisieren, dem du das Ergebnis der Rechenaufgabe zuweist:
<?
<input type="hidden" name="erg" value="<?echo $code;?>" />
?>
Die Auswertung erfolgt dann analog zur Session-Version:
<?
if($_POST['erg'] == $_POST['usercode']){
. . .
?>
Was ist daran unsicher?
Der Name des Textfeldes und der Inhalt sind im Quelltext der Seite sichtbar.
Ob es möglich ist, weiß ich nicht, aber es wird natürlich befürchtet, dass ein
Bösewicht sich deinen Quelltext ansieht und seinen BOT so programmiert,
dass er dir automatisch ein richtiges Ergebnis unterschiebt, und munter Einträge
in dein Gästebuch vornimmt.
Gruß
Günni