Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Mitchell

Mitchell (Level 2) - Jetzt verbinden

13.06.2008, aktualisiert 02.07.2008, 13877 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.

Mfg

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?

Mfg

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?

Mfg

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 ^^

Mfg

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?

Mfg

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.

Mfg

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?

Mfg

Mitchell
Bitte warten ..
Ähnliche Inhalte
JavaScript

Editieren und Löschen Button im Gästebuch hinzufügen

Frage von bigbootykillaJavaScript1 Kommentar

Hi Leute, ich bin ein wenig verzweifelt. Seit paar Tagen muss ich ein Gästebuch in Javascript mit AJAX als ...

Neue Wissensbeiträge
Humor (lol)
IoT-Gefahr: Smartes Aquarium leckt!
Information von Lochkartenstanzer vor 32 MinutenHumor (lol)

Moin, Die IoT-Manie hat weitere Opfer gefunden. Ein Casino-Leck durch ein smartes Aquarium: Allerdings haben sie kein Wasser, sondern ...

Router & Routing

Olle Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 8 StundenRouter & Routing3 Kommentare

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 22 StundenSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 1 TagWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
Server SSD: NVMe PCIe 3.0 RAID?
Frage von bouneeFestplatten, SSD, Raid15 Kommentare

Hallo liebe Admins, mir stellt sich gerade die Frage, ob ein neuer Server mit SSD NVMe PCIe 3.0 Sinn ...

Sonstige Systeme
Wie Normenkataloge im Unternehmen bereit stellen?
Frage von MuzzepuckelSonstige Systeme14 Kommentare

Hallo Kollegen, ich lese schon lange hier mit, nun mein ersrer Beitrag, bzw. Frage. :-) Wir benötigen für unsere ...

Sicherheit
Verbindliche Zustellung per E-Mail?
Frage von ahussainSicherheit13 Kommentare

Hallo allerseits, ein Kunde von mir nutzt intensiv Fax. Hauptgrund: zusammen mit einer Empfangsbestätigung ist eine verbindliche Zustellung gewährleistet. ...

LAN, WAN, Wireless
OpenVPN Client Fehlermeldungen
Frage von chris84LAN, WAN, Wireless13 Kommentare

Hallo Zusammen, wir nutzen seit kurzem einen neuen Router und den OpenVPN Client. Die VPN Verbindung klappt; allerdings kommen ...