Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Rechenaufgabe im Gästebuch

Frage Entwicklung PHP

Mitglied: Mitchell

Mitchell (Level 2) - Jetzt verbinden

13.06.2008, aktualisiert 02.07.2008, 13533 Aufrufe, 11 Kommentare

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:

01.
<?php 
02.
$zahl1 = rand(10,20); 
03.
$zahl2 = rand(1,10); 
04.
$operator = rand(1,2); 
05.
if($operator == "1"){ 
06.
   $operatorzeichen = " + "
07.
   $ergebnis = $zahl1 + $zahl2
08.
}else
09.
   $operatorzeichen = " - "
10.
   $ergebnis = $zahl1 - $zahl2
11.
12.
echo $zahl1.$operatorzeichen.$zahl2
13.
?> 
14.
<input type="text" name="sicherheitscode" size="5"
15.
<input type="submit" value="Absenden"
16.
</form></div> 
17.
<?php 
18.
if (isset($_POST['action']) && $_POST['action'] == "add"){ 
19.
if ($_POST['name'] == "" || $_POST['text'] == ""){ 
20.
echo "Du hast nicht alle Felder ausgef&uuml;llt !<hr>"
21.
else
22.
$guestbook = file_get_contents("gaestebuch.txt"); 
23.
$_POST['text'] = str_replace("\n","<br>",$_POST['text']); 
24.
$_POST['eintrag'] = "<span style=font-size:23>Eintrag von: <a href=\"mailto:$_POST[mail]\">$_POST[name]</a><br> 
25.
$_POST[text]<br> 
26.
<a href=\"http://$_POST[www]\" target=_blank>$_POST[www]</a><hr></span>"
27.
$datei = fopen("gaestebuch.txt","w+"); 
28.
 fwrite($datei,$_POST['eintrag'].$guestbook); 
29.
 fclose($datei); 
30.
echo "Danke f&uuml;r deinen Eintrag <i>$_POST[name]</i><hr>"
31.
}} 
32.
readfile("gaestebuch.txt"); 
33.
?>
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:

01.
if (POST_['sicherheitscode'] == $ergebnis){ 
02.
$guestbook = file_get_contents("gaestebuch.txt"); 
03.
$_POST['text'] = str_replace("\n","<br>",$_POST['text']); 
04.
$_POST['eintrag'] = "<span style=font-size:23>Eintrag von: <a href=\"mailto:$_POST[mail]\">$_POST[name]</a><br> 
05.
$_POST[text]<br> 
06.
<a href=\"http://$_POST[www]\" target=_blank>$_POST[www]</a><hr></span>"
07.
$datei = fopen("gaestebuch.txt","w+"); 
08.
 fwrite($datei,$_POST['eintrag'].$guestbook); 
09.
 fclose($datei); 
10.
echo "Danke f&uuml;r deinen Eintrag <i>$_POST[name]</i><hr>"
11.
12.
else 
13.
echo "Falsches Ergebnis"
14.
readfile("gaestebuch.txt"); 
15.
?>
Funktioniert aber nicht, die Einträge gehen auch so. Wo liegt mein Denkfehler? Bin für jeden Vorschlag dankbar.

Mit freundlichen Grüßen

Mitchell
Mitglied: moswald
13.06.2008 um 13:38 Uhr
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)
Bitte warten ..
Mitglied: Mitchell
13.06.2008 um 17:57 Uhr
Hi moswald,

werde mir das mit der Session mal durchlesen, klingt überzeugend . 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?

Mit freundlichen Grüßen

Mitchell
Bitte warten ..
Mitglied: Mitchell
13.06.2008 um 23:17 Uhr
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?

Mit freundlichen Grüßen

Mitchell
Bitte warten ..
Mitglied: moswald
14.06.2008 um 09:22 Uhr
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).
Bitte warten ..
Mitglied: Mitchell
14.06.2008 um 15:29 Uhr
Ich weiß, was du meinst, nur nicht, wie ich es bewerkstellige

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

01.
$id = session_id() 
02.
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 ^^

Mit freundlichen Grüßen

Mitchell
Bitte warten ..
Mitglied: Mitchell
27.06.2008 um 11:55 Uhr
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.

01.
if ($ges != ($_POST['sicherheitscode']) 
02.
echo "Fehler"
03.
else
04.
siehe oben
$ges ist jetzt mal die Variable für das Ergebnis. Wo liegt hier mein Denkfehler?

Mit freundlichen Grüßen

Mitchell
Bitte warten ..
Mitglied: Guenni
29.06.2008 um 12:41 Uhr
Hi Mitchell,

wenn du Variablen an eine Session übergibst, mußt du im Script auch die Session starten.

01.
<? 
02.
// Session starten 
03.
session_start(); 
04.
?>
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.

01.
<? 
02.
/* 
03.
Nur einen neuen Code erzeugen, wenn der Submit-Button nicht 
04.
angeklickt wurde. Ansonsten würde ein bereits generierter Code 
05.
überschrieben und der Code, den der User eingibt, würde mit dem 
06.
neu generiertem Code verglichen. Damit würde ein Eintrag niemals 
07.
stattfinden. 
08.
 
09.
cmd = Name des Submit-Buttons 
10.
*/ 
11.
if(!isset($_POST['cmd'])){ 
12.
 $zahl1 = mt_rand("1","99"); 
13.
 $zahl2 = mt_rand("1","99"); 
14.
 $code = $zahl1 + $zahl2
15.
// Variablenwert an Sessionvariable übergeben 
16.
 $_SESSION['captcha_code']=$code
17.
18.
?>
Gästebucheintrag dann abhängig von der Eingabe des Users:

01.
<? 
02.
/* Gästebucheintrag 
03.
 
04.
usercode = Name des Textfelds, in das der User das Ergebnis einträgt 
05.
*/ 
06.
if(isset($_POST['cmd'])){ 
07.
 if($_SESSION['captcha_code'] == $_POST['usercode']){ 
08.
  $msg=str_replace("\n","",$_POST['eintrag']); 
09.
  $eintrag=$_POST['nick']."||".$_POST['mail']."||".date("Y-m-d")."||".$msg
10.
  $handle = fopen("pub/guest.txt","a"); 
11.
  fputs($handle, $eintrag."\n"); 
12.
  fclose($handle); 
13.
  //Nach Eintrag Seite neu aufrufen, da sonst die Postdaten noch 
14.
  //gespeichert sind und ein Klick auf Neuladen immer wieder 
15.
  //den selben Eintrag speichert 
16.
  header("location:guestbook2.php"); 
17.
 }else
18.
 	 echo "Ergebnis falsch eingegeben.<a href=\"guestbook2.php\"> Zurück </a> zur Startseite."
19.
	 exit
20.
21.
22.
?>
Das Textfeld usercode habe ich im Formular folg. deklariert:

01.
<? 
02.
. . . 
03.
<td valign="middle" colspan="2">Ergebnis eingeben <?echo $zahl1." + ".$zahl2;?> --> <input type="text" name="usercode"/></td> 
04.
. . . 
05.
?>
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
Bitte warten ..
Mitglied: Mitchell
01.07.2008 um 10:41 Uhr
Hi Günni,

danke nochmals, ich werde es erstmal selber versuchen

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.

Mit freundlichen Grüßen

Mitchell
Bitte warten ..
Mitglied: Guenni
01.07.2008 um 22:56 Uhr
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:

01.
<? 
02.
<input type="hidden" name="erg" value="<?echo $code;?>" /> 
03.
?>
Die Auswertung erfolgt dann analog zur Session-Version:

01.
<? 
02.
if($_POST['erg'] == $_POST['usercode']){ 
03.
. . . 
04.
?>
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
Bitte warten ..
Mitglied: Mitchell
02.07.2008 um 08:29 Uhr
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?

Mit freundlichen Grüßen

Mitchell
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...