mitchell
Goto Top

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:

<?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&uuml;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&uuml;r deinen Eintrag <i>$_POST[name]</i><hr>";  
}}
readfile("gaestebuch.txt");  
?>

Kann noch nicht gehen, ich weiß face-smile. 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&uuml;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

Content-ID: 89780

Url: https://administrator.de/contentid/89780

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

moswald
moswald 13.06.2008 um 13:38:53 Uhr
Goto Top
Du musst $ergebnis ja irgendwo speichern... oder übergeben. Wäre aber sinnfrei face-wink 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)
Mitchell
Mitchell 13.06.2008 um 17:57:47 Uhr
Goto Top
Hi moswald,

werde mir das mit der Session mal durchlesen, klingt überzeugend face-smile. Aber warum wäre es sinnfrei, das Ergebnis in $ergebnis zu speichern (hatte ich nämlich auch schon, danach schmierte mir das GB aber ab). Die Aufgabe wird doch jedesmal neu erzeugt, also auch das Ergebnis, oder irre ich mich da?

Mfg

Mitchell
Mitchell
Mitchell 13.06.2008 um 23:17:42 Uhr
Goto Top
Irgendwie steig ich nicht hinter die Sessions. Session übergeben...aber wohin? Ich dachte zuerst, man übergibt diese wieder an die URL, war aber wohl falsch, ich krieg immer ne Fehlermeldug vom Browser. Lässt sich die ID überhaupt an die selbe URL übergeben?

Mfg

Mitchell
moswald
moswald 14.06.2008 um 09:22:39 Uhr
Goto Top
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).
Mitchell
Mitchell 14.06.2008 um 15:29:32 Uhr
Goto Top
Ich weiß, was du meinst, nur nicht, wie ich es bewerkstellige face-wink

Laut meinem PHP-Buch, das vor mir liegt, übergebe ich eine Session folgendermaßen:

$id = session_id()
header(location:"test.php?$id")  

1. klappt das bei mir nicht
2. selbst wenn, was mache ich jetzt?

Sorry, aber in PHP bin ich noch voll die Niete ^^

Mfg

Mitchell
moswald
moswald 15.06.2008 um 10:00:38 Uhr
Goto Top
Mitchell
Mitchell 27.06.2008 um 11:55:48 Uhr
Goto Top
So, bin das ganze jetzt zum Xten mal durchgegange und steig immernoch nicht dahinter (erstmal ohne Sessions).

Warum kann ich denn nicht sagen:

wenn ergenis == sicherheitscode, mach den eintrag, wenn nicht, mach nichts ^^

Ich habe das ergebnis jetzt in einer Variablen gespeichert und diese ist im Quelltext ja nicht sichtbar, kann also auch nicht ausgelesen werden.

if ($ges != ($_POST['sicherheitscode'])  
echo "Fehler";  
else{
siehe oben

$ges ist jetzt mal die Variable für das Ergebnis. Wo liegt hier mein Denkfehler?

Mfg

Mitchell
Guenni
Guenni 29.06.2008 um 12:41:08 Uhr
Goto Top
Hi Mitchell,

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
Mitchell
Mitchell 01.07.2008 um 10:41:18 Uhr
Goto Top
Hi Günni,

danke nochmals, ich werde es erstmal selber versuchen face-smile

Mein Problem liegt vorallem im Verständis, das mit der Session geht mir nicht wirklich rein. Warum brauche ich zwingend eine Session bzw. warum wäre es unsicher, das Ergebnis der Aufgabe NUR in einer Variablen zu speichern? Ich verbinde gedanklich Sessions immer mit einem Warenkorb oder Forum, also etwas, indem Userdaten immer erhalten bleiben müssen.

Mfg

Mitchell
Guenni
Guenni 01.07.2008 um 22:56:17 Uhr
Goto Top
Hi Mitchell,

. . . 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
Mitchell
Mitchell 02.07.2008 um 08:29:51 Uhr
Goto Top
Das mit dem Quelltext ist mir bewusst, aber da ja PHP drin steckt, dachte ich, ist es egal. Oder können Bots auch vom Parser lesen?

Mfg

Mitchell