Captcha
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
beitrag
besttigung
betreff
datei
eingabe
erfolglos formular
error
fehler
formular
fragen
hilfe
kontakt
prfung
quelltext
rechen
send
session
transitional
zurck
-
Hallo allerseits!
Nachdem ich mich informiert hatte, ob die Bilbliotheken die Möglichkeit der Einbindung eines Captcha geben, habe ich nun versucht, auch eins einzubauen. Es wird angezeigt und auch verarbeitet, allerdings habe ich ein großes Problem. Und zwar ist der Code, den ich verwendet habe dazu ausgelegt, ein Zugangssperre zu dem Kontaktvformular darzustellen. Wenn jemand den Code eingegeben hat, wied er zu dem Formular weitergeleitet. Aber von da aus kann ja jeder soviel Spammen wie er will. Deshalb wollte ich fragen, ob mir jemand helfen kann, die Prüfung des/der Captcha mit dem Abseden des Formulars zu kombinieren, damit bei jedem Versand nachgehakt wird.
Hier der Quellcode:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Kontaktformular</title> <meta name="title" content="Kontaktformular"> <meta name="description" content="Kontaktformular"> <meta name="keywords" content="Kontakt, Kontaktformular"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style type="text/css"> #table{ width: 100%; border-sytle: none; cellspacing: 2px; } .links{ text-align:right; } </style> </head> <body style="background-color:grey"> <h1>Kontakt</h1><br> <?php // zufällige Zahl zwischen 100000 und 999999 ermitteln srand(); $wert = rand(100000, 999999); ?> <?php // Prüfung ob captcha == eingabe if (isset($_POST['submit'])) { if ($_POST['wert'] == $_POST['testwert']) echo 'Prüfung erfolgreich!'; else echo 'Prüfung erfolglos!'; } // Formular else { // zufällige Zahl zwischen 100000 und 999999 ermitteln srand(); $wert = rand(100000, 999999); // Formular ausgeben echo '<form action="newdfdf.php" method="post">'; echo '<input type="text" name="testwert" maxlength="6" /><br /><br />'; // Captcha anfordern mit dem entprechenden Wert anfordern echo '<img src="captcha.php?wert='.$wert.'" /><br /><br />'; echo '<input type="hidden" name="wert" value="'.$wert.'" />'; echo '<input type="submit" name="submit" value="Eingabe Prüfen" />'; echo '</form>'; } ?> <?php // *** Deine Mailadresse (Empfänger) *** $mail_to="xxxxx@xxxxx.de"; // ************************************* $from_name=$_POST['fromname']; $from_mail=strtolower($_POST['frommail']); $mail_subject=$_POST['mailsubject']; $mail_text=$_POST['mailtext']; $send=$_POST['s']; if(trim($from_name)=="") $err_text.="Bitte gib Deinen Namen an.<br>"; if(trim($from_mail)=="") $err_text.="Bitte gib Deine E-Mail-Adresse an.<br>"; else if(!ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$",$from_mail)) $err_text.="Bitte gib eine gültige E-Mail-Adresse an.<br>"; if(trim($mail_subject)=="") $err_text.="Bitte gib einen Betreff ein.<br>"; if(trim($mail_text)=="") $err_text.="Bitte gib einen Nachrichtentext ein.<br>"; // *** Zu langen Text abschneiden *** if(strlen($mail_text)>1000) { $mail_text=substr($mail_text,0,1000)."... (Text wurde gekürzt!)"; } $from_name=str_replace(chr(34),"''",$from_name); $mail_subject=str_replace(chr(34),"''",$mail_subject); $from_name=stripslashes($from_name); $from_mail=stripslashes($from_mail); $mail_subject=stripslashes($mail_subject); $mail_text=stripslashes($mail_text); if(($send=="1") && (isset($err_text))) { echo "<p><big><b>Fehler:</b></big><br>"; echo "$err_text</p>"; } if(($send!="1") || (isset($err_text))) { ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <table id="table"> <tr><td class="links">Dein Name:</td><td> </td> <td width="50%"><input type="text" name="fromname" size=50 maxlength=120 value="<?php echo $from_name; ?>"></td></tr> <tr><td class="links">Deine E-Mail Adresse:</td><td></td> <td width="50%"><input type="text" name="frommail" size=50 maxlength=120 value="<?php echo $from_mail; ?>"></td></tr> <tr><td class="links">Betreff:</td><td></td> <td width="50%"><input type="text" name="mailsubject" size=50 maxlength=120 value="<?php echo $mail_subject; ?>"></td></tr> <tr><td style="vertical-align:top" class="links">Text:<br><i>(max. 1.000 Zeichen)</i></td><td></td> <td width="50%"><textarea cols="40" rows="10" name="mailtext"><?php echo $mail_text; ?></textarea></td></tr> <tr><td></td><td></td><td> <input type="hidden" value="1" name="s"> <input type="submit" value="Nachricht versenden" name="submit"> </td></tr> </table> </form> <?php } else { $header="From: $from_name <$from_mail>\n"; $header.="Reply-To: $from_mail\n"; $header.="X-Mailer: PHP-FormMailer (www.gaijin.at)\n"; $header.="Content-Type: text/plain"; $mail_date=gmdate("D, d M Y H:i:s")." +0000"; $send=0; if(@mail($mail_to,$mail_subject,$mail_text,$header)) { echo "<p><b>Deine E-Mail wurde abgesendet.</b></p>"; echo "<p><a href=http://gordan.lima-city.de>Zurück zum Formular</a></p>"; }else{ echo "<p><b>Beim Versenden der E-Mail ist ein Fehler aufgetreten!</b></p>"; echo "<p>Zurück zum Formular</p>"; } } ?> </body> </html>
PS.: Die Gestaltung stammt aus einer Zeit ohne CSS. Ich habe schonmal angefange, es ein wenig umzugestalten. Es geht jetzut ja nicht um den Schönheitspreis sondern um die FUnktion.
Bitte um Hilfe! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
$wert = rand(100'000, 999'999);
Zwischen "eine Million" und "hundert Tausend" gibt es nicht besonders viele Zahlen... -
Stimmt. Werde ich ändern. Kannst du (oder wer anders) mir denn dabei helfen, beide Funktionen (Übermitteln und Verifizieren) unter einen Hut zu bringen?
Edit: Das dient dazu, dass z.B. zweistellige Zahlen ausgeschlossen werden. Auf diese Weise - so glaube ich - kann man manuelle Spammer ganz gut fern halten.
Beitrag geändert: 9.7.2007 23:17:24 von gordan -
Ich habe das ganze nun ein wenig verändert.
Und zwar versuchte ich es mit include(), require() und nun mit header().
Aber nichts funktionierte?!?
Weiß Jemand Rat?
Hier der "neue" Code :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Kontaktformular</title> </head> <body style="background-color:grey"> <h1>Kontakt</h1> <br> <?php // zufällige Zahl zwischen 100000 und 999999 ermitteln srand(); $wert = rand(100000, 999999); ?> <?php // Prüfung ob captcha == eingabe if (isset($_POST['submit'])) { if ($_POST['wert'] == $_POST['testwert']) { require $bestaetigt.php; } else { echo 'Prüfung erfolglos!'; } } // Formular else { // zufällige Zahl zwischen 100000 und 999999 ermitteln srand(); $wert = rand(100000, 999999); // Formular ausgeben echo ' <form action="formular.php" method="post">'; echo '<input type="text" name="testwert" maxlength="6" /> <br /><br />'; // Captcha mit dem entprechenden Wert anfordern echo '<img src="captcha.php?wert='.$wert.'" /><br /><br />'; echo '<input type="hidden" name="wert" value="'.$wert.'" />'; echo '<input type="submit" name="submit" value="Eingabe Prüfen" />'; echo '</form>'; } ?> </body> </html>
Prinzipiell gibt es überhaupt keine Probleme. Nur das ich nach der Bestätigung folgenden Fehlermeldungen erhalte:
Warning: require(php) [function.require]: failed to open stream: No such file or directory in /home/webpages/lima-city/gordan/html/mail/formular.php on line 18
Fatal error: require() [function.require]: Failed opening required 'php' (include_path='.:/usr/share/pear') in /home/webpages/lima-city/gordan/html/mail/formular.php on line 18
Wie kann ich das umgehen? Die angeforderte Datei liegt im Verzeichnis!
Ich stehe vor einem Rätsel! -
Ich habe das Problem gelöst.
Grund war, dass ich das $ Zeichen, so wie auf irgenteiner semiaktuellen PHP Seite beschrieben, verwendet hatte.
Stattdessen habe ich die URL nun in ' verpackt.
FÜr alle, die sich fragen, warum ich "include":
dadurch vermeide ich, dass Jemand einmal bestätigt, Lesezeichen setzt und ab sofort die Sperre umgeht. Er kann nicht herausfinden, dass und wenn ja was ich include. Bei entsprechnd langem Name - den ich noch geben werde- findet keiner die Datei. Also niemand, der extremen Schaden anrichten möchte.
Ehrlich gesagt muss ich sagen, dass ich mir vorgestellt habe, dass ich ein wenig flinker seit (keine Beleidigung). Naja guten Tag wünsche ich. -
Dein Captcha ist sinnlos. Einerseits wird keiner versuchen mit einem Bot dein Kontaktformular zu benutzen und selbst wenn doch, lässt es sich denkbar einfach umgehen, da dein Wert als Plaintext im Quellcode deiner Seite angezeigt wird. Der Bot müsste also nur im Quelltext suchen und die Eingabe tätigen. Wirklich sicher ist das also nicht. Verwende lieber Sessions, da kannst du den Wert übergeben, ohne dass er "sichtbar" wird.
-
Verwende doch statt Captchas lieber einfach eine Frage:
z.B. "Wie viel ist 1 + 3?"
Mittlerweile können Programme die Wörter aus Captchas lesen, auf so eine Frage sind sie aber meist noch nicht eingestellt.
Außerdem ist das sehr viel benutzerfreundlicher als ein extra Bild. -
Danke euch beiden für die Antwort/en.
Ich habe jetzt eine Kombination aus beidem gewählt.
Es wird eine Session eingeleitet und ein einfaches Rechenbeispiel abgefragt.
Bei erfolgreicher Bestätigung wird das zweite Script eingebunden.
Danke euch beiden!
Allerdings habe ich das Scirpt erst nur übernommen und dann relativ stark angepasst.
Und habe nun noch ein Problem.
Und zwar bekomme ich das nicht ganz geregelt mit dem Ein- und Ausblenden der Felder nach der Bestätigung.
Ich habe das mit CSS (fürs erste gelöst). ALlerdings wäre mir was anderes lieber.
Weiteres Problem, was dabei entsteht:
Der erste Bereich (mit der Rechen Captacha) ist valide, der zweite nicht. BEim reinladen der zweiten Datei muss es einen Fehler geben, da die alten Daten (Formularfeld etc.) nur ergänzt werden. Da ich in diesen (um sie zu validieren) den HTML und body Tag schon geschlossen habe, wird mir der Rest (der noch nicht validiert ist, aber das mache ich erst nach Bewältigung dieses Problems) als nicht mehr im Quelltext und somit die gesamte Seite als invalide ausgegeben.
<?php session_start(); function encrypt($string, $key) { $result = ''; for($i=0; $i<strlen($string); $i++) { $char = substr($string, $i, 1); $keychar = substr($key, ($i % strlen($key))-1, 1); $char = chr(ord($char)+ord($keychar)); $result.=$char; } return base64_encode($result); } $sicherheits_eingabe = encrypt($_POST["sicherheitscode"], "458f7878r7854s45d4"); $sicherheits_eingabe = str_replace("=", "", $sicherheits_eingabe); { echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'; echo '<html xmlns="http://www.w3.org/1999/xhtml">'; echo '<head>'; echo '<title>'; echo 'E-Mail Kontaktformular'; echo '</title>'; echo '</head>'; echo '<body>'; echo '<div>'; echo '<form action="formular.php" method="post" id="form">'; echo '<div>'; echo '<input type="text" name="sicherheitscode" size="5" id="input" />'; echo '<img src="rechen-captcha.php" id="img" alt="Das Bild kann nicht angezeigt werden. Ohne Anzeige von diesem ist der Service nicht nutzbar. Bitte schreiben Sie mir eine E-Mail auf konventionellem Wege" /><br /><br />'; echo '<input type="submit" name="submit" value="Eingabe Prüfen" id="input2" />'; echo '</div>'; echo '</form>'; echo '</div>'; echo '</body>'; echo '</html>'; } if(isset($_SESSION['rechen_captcha_spam']) AND $sicherheits_eingabe == $_SESSION['rechen_captcha_spam']){ include 'BESTAETIGT.php'; } unset($_SESSION['rechen_captcha_spam']); ?>
Und hier der Rest (das daraufhin eingebundene):
<style type="text/css"> #form { display: none; visibility: hidden; } #input { display: none; visibility: hidden; } #img { display: none; visibility: hidden; } #input2 { display: none; visibility: hidden; } </style> </head> <body> <div> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <table id="table"> <tr><td class="links">Dein Name:</td><td> </td> <td width="50%"><div><input type="text" name="fromname" size=50 maxlength=120 value="<?php echo $from_name; ?>" /></div></td></tr> <tr><td class="links">Deine E-Mail Adresse:</td><td></td> <td width="50%"><div><input type="text" name="frommail" size=50 maxlength=120 value="<?php echo $from_mail; ?>" /></div></td></tr> <tr><td class="links">Betreff:</td><td></td> <td width="50%"><div><input type="text" name="mailsubject" size=50 maxlength=120 value="<?php echo $mail_subject; ?>" /></div></td></tr> <tr><td style="vertical-align:top" class="links">Text:<br><i>(max. 1.000 Zeichen)</i></td><td></td> <td width="50%"><div><textarea cols="40" rows="10" name="mailtext"><?php echo $mail_text; ?></textarea></div></td></tr> <tr><td></td><td></td><td> <div> <input type="hidden" value="1" name="s" /> <input type="submit" value="Nachricht versenden" name="submit" /> </div> </td></tr> </table> </form> </div> </html>
Könnt ihr mir dabei vielleicht noch helfen?
Ich habe schon versucht, die "echo" Werte aus dem ersten Script irgentwo anders hinzusetzten, aber vielleicht bin ich einfach blind.
Beitrag geändert: 17.7.2007 20:39:49 von gordan -
Am Besten machst du mal eine Beispielseite damit wir uns das ganze Live angucken können...
Es hat wohl niemand Lust den ganzen Code durchzusehen... -
Stimmt. Kann ich gut verstehen.
Die Rechen Captcha:
http://gordan.lima-city.de/script/rechen-captcha.php
Das Formular (Captcha):
http://gordan.lima-city.de/script/formular.php
Und die Ausgabe (E-Mail-Formular):
http://gordan.lima-city.de/script/bestaetigt.php -
Bau das Rechen-Captcha doch einfach unter das e-Mail-Formular und überprüfe beim Absenden der Mail, ob das Captcha richtig war. Wenn nicht, wird die Mail nicht gesendet und ein Fehler erscheint, wenn es stimmt ist alles super. So sparst du dir das includen des Formulars und einiges an Arbeit.
Edit
Ich mein das so in der Art: http://cacophonie.de/captcha/
(is von mir...)
Beitrag geändert: 10.7.2007 16:15:19 von tct -
Hm.. Das war auch meine erste Idee gewesen. Leider habe ich das nicht hinbekommen. Nun habe ich alles versucht und es scheint tatsächlich extrem kompliziert zu sein, vorrausgesetzt, man versucht es so zu machen, wie ich es versucht habe...
Könntest du mir freundlicherweise eine Anleitung zum Verknüpfen der Captchakontrolle und der E-Mail-Versendung geben oder gar den Quellcode (gesetzt den Fall, du tätest es, modifizierte ich ihn vollständig).
Ist das möglich??
Gruß -
Nen Quellcode kann ich dir schlecht geben, da du ihn eh auf deine Bedürfnisse anpassen musst.
Du brauchst halt das Formular unter dem du zusätzlich das Captcha anzeigen lässt:
<? session_start(); // Captcha-Wort generieren und in Session speichern $_SESSION['captcha']='Captcha-Wort'; ?> <form action="ziel.php" method="post"> <div> <p>Your message:<br /> <textarea name="message" cols="50" rows="5"></textarea></p> <p>CAPTCHA code:</p> <table> <tr> <td>[b]<img src="captcha.php" alt="CAPTCHA image" width="100" height="25"/></td> <td>»</td> <td><input type="text" name="captcha_word" value="" size="10" />[/b]</td> </tr> </table> <p><input type="submit" name="form_submit" value=" OK "></p> </div> </form>
Und bei der Auswertung der ganzen Felder, überprüfst du eben auch den eingegebenen Captcha-Code mit:
<? if(isset($_POST['form_submit'])) { if(!isset($_SESSION['captcha'])) $errors[] = 'Session error'; if(strtolower($_POST['captcha_word']) != strtolower($_SESSION['captcha'])) $errors[] = 'The code is invalid'; // Überprüfung deiner Felder if(empty($errors)) { // Mail senden // andere Aktionen ausführen }else{ // Fehler ausgeben } } ?>
Ich hoffe das hilft dir ein bissel weiter, denn eigentlich ist das gar nicht so schwer, wenn man schon Erfahrung in PHP hat. -
Danke dir. Hat mir sehr geholfen.
Das größte Problem ist meine bisherige Jungfräulichkeit in Sachen PHP. HTML und CSS (keine Programmiersprachen) beherrsche ich aus dem FF (CSS fehlt eigentlich mitlerweile auch nichts mehr). Javascript bin ein "besserer Anfänger". Ich habs nun gelöst.
Und danke für die Hilfe. Auf PHP werde ich mich jedenfalls in nächster Zeit konzentrieren.
Danke nochmal! -
Recaptcha könnte dich interessieren: http://recaptcha.net/
Diese Captchas können von Maschinen nicht erkannt werden, außerdem helfen deine Benutzer noch Bücher zu digitalisieren, wenn Sie das Capcha abschreiben!
ps3web -
Danke für die Empfehlungen!
Ich habe es nun schon angewendet und werde es recht bald anwenden. Das Problem sehe ich nur, dass das ganze auf Javascript basiert. Ich z.B. habe Jvascript immer aus, wenn ich browse mit ausnahme, ich besuche Seiten und merke, dass diese ihre volle Funktionalität nicht mehr erreichen (wie z.B. Web.de, der mehr oder weniger gute E-Mail-Account, bei welchem man sich ohne aktiviertes Javascript nicht ausloggen kann).
Ich überlege mir noch, ob ich später dann einen entsprechenden Vermerk auf die Seite setzte oder .. wie auch immer. Mir fällt schon was ein.
Edit:
Die animierte Captcha ist auch nicht schlecht...
Obwohl sie nicht für Leute mit physischen Einschränkungen geeignet zu sein scheint. Ausserdem spuckt sie mir immer eine Fehlermeldung aus
Beitrag geändert: 15.7.2007 20:08:31 von gordan -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage