Modul: Captcha als Rechenaufgabe
Verfasst: So 20. Mai 2007, 17:57
Ein Neues Modul ist geboren.
Entstanden ist es durch apicalart und xmurrix.
Was tut es ?
Statt des schon häufig geknackten normalen Captchas muss man hier eine Rechenaufgabe lösen um eine Email zu versenden.
Was müsst Ihr tun !
1. Kopiert den nachfolgenden Code in eine neue Datei.
2. Speichert diese Datei ab als rechen-captcha.php
3. Ladet diese Datei auf Euren Server in den Ordner /cms
4. Im Template Ordner ( oder über Styles -- HTML Editor ) liegt das Standardtemplate kontaktformular.html
Das muss, wie nachfolgend gezeigt, geändert werden
( Will sagen es kommen zwei neue Zeilen hinzu )
5. Das Standard Kontakt von Andreas Lindler muss jetzt geändert werden.
Hierzu lasst Ihr den INPUT so wie er ist und tauscht den OUTPUT aus gegen nachfolgenden Code.
6. Geschafft
Im Einsatz sieht das dann so aus: http://www.apicalart.de/cms/front_content.php?idcat=29
Wichtiger Hinweis :
Die nachfolgenden 7 Threads braucht ihr nicht zu berücksichtigen. Die sind beim Enstehen des Moduls entstanden ! Die fertige Lösung ist diese hier.
Entstanden ist es durch apicalart und xmurrix.
Was tut es ?
Statt des schon häufig geknackten normalen Captchas muss man hier eine Rechenaufgabe lösen um eine Email zu versenden.
Was müsst Ihr tun !
1. Kopiert den nachfolgenden Code in eine neue Datei.
2. Speichert diese Datei ab als rechen-captcha.php
3. Ladet diese Datei auf Euren Server in den Ordner /cms
Code: Alles auswählen
<?php
if (stristr($_SERVER["PHP_SELF"], basename(__FILE__)) !== false) {
include_once ("config.php");
include_once ($contenido_path."includes/startup.php");
cInclude("includes", "functions.con.php");
cInclude("includes", "functions.con2.php");
cInclude("includes", "functions.api.php");
cInclude("includes", "functions.pathresolver.php");
page_open(array ('sess' => 'Contenido_Frontend_Session', 'auth' => 'Contenido_Frontend_Challenge_Crypt_Auth', 'perm' => 'Contenido_Perm'));
$db = new DB_Contenido;
$sess->register("rechen_captcha_spam");
$zahl1 = rand(10,20); //Erste Zahl 10-20
$zahl2 = rand(1,10); //Zweite Zahl 1-10
$operator = rand(1,2); // + oder -
if($operator == "1"){
$operatorzeichen = " + ";
$ergebnis = $zahl1 + $zahl2;
}else{
$operatorzeichen = " - ";
$ergebnis = $zahl1 - $zahl2;
}
$rechen_captcha_spam = encrypt((string) $ergebnis); //Key
$rechen_captcha_spam = str_replace("=", "", $rechen_captcha_spam);
page_close();
$rechnung = $zahl1.$operatorzeichen.$zahl2." = ?";
$img = imagecreatetruecolor(80,15);
$schriftfarbe = imagecolorallocate($img,13,28,91);
$hintergrund = imagecolorallocate($img,255,255,255);
imagefill($img,0,0,$hintergrund);
imagestring($img, 3, 2, 0, $rechnung, $schriftfarbe);
header("Content-type: image/png");
imagepng($img);
imagedestroy($img);
} else {
// donut
}
function encrypt($string, $key=null) {
if ($key == null) {
$key = "29jfkd921";
}
$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);
}
?>
Das muss, wie nachfolgend gezeigt, geändert werden
( Will sagen es kommen zwei neue Zeilen hinzu )
Code: Alles auswählen
<table cellspacing="1" cellpadding="1" border="0">
<tr><td colspan="3"><span class="small"><sup>(*)</sup></span> {PFLICHTFELDER}</tr>
<tr>
<td>{ANREDE}</td><td width="20"> </td>
<td>
<input type="radio" name="Anrede" value="{ANREDE_OPTION1}" checked> {ANREDE_OPTION1}<br/>
<input type="radio" name="Anrede" value="{ANREDE_OPTION2}"/> {ANREDE_OPTION2}
</td>
</tr>
<tr><td>{VORNAME}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><input type="text" name="Vorname" id="Vorname" maxlength="100" style="width:240px;"/></td></tr>
<tr><td>{NACHNAME}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><input type="text" name="Nachname" id="Nachname" maxlength="100" style="width:240px;"/></td></tr>
<tr><td>{FIRMA}</td><td width="20"> </td><td><input type="text" name="Firma" id="Firma" maxlength="100" style="width:240px;"/></td></tr>
<tr><td>{STRASSE}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><input type="text" name="Strasse" id="Strasse" maxlength="100" style="width:240px;"/></td></tr>
<tr><td>{PLZORT}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><input type="text" name="PLZOrt" id="PLZOrt" maxlength="100" style="width:240px;"/></td></tr>
<tr><td>{TELEFON}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><input type="text" name="Telefon" id="Telefon" maxlength="100" style="width:240px;"/></td></tr>
<tr><td>{EMAIL}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><input type="text" name="Email" id="Email" maxlength="100" style="width:240px;"/></td></tr>
<tr><td>{CAPTCHA_JOB}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><img id="Aufgabe" src="rechen-captcha.php" alt="{CAPTCHA_JOB_MSG}" /></td></tr>
<tr><td>{CAPTCHA_JOB_RESULT}<span class="small"><sup>(*)</sup></span></td><td width="20"> </td><td><input id="Sicherheitscode" title="{CAPTCHA_JOB_RESULT_MSG}" name="Sicherheitscode" type="text" value="" size="48" maxlength="160" /></td></tr>
<tr><td colspan="3"> </tr>
<tr><td valign="top">{ANLIEGEN}</td><td width="20"> </td><td><textarea name="Anliegen" id="Anliegen" style="width:240px;height:170px;font-family:Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif;font-size:11px;"></textarea></td></tr>
<tr><td colspan="3"> </tr>
<tr><td><input type="submit" value="{ABSCHICKEN}"/></td><td width="20"> </td><td align="right"><input type="reset" value="{LOESCHEN}"/></td></tr>
</table>
Hierzu lasst Ihr den INPUT so wie er ist und tauscht den OUTPUT aus gegen nachfolgenden Code.
Code: Alles auswählen
CONTENIDO MODUL - INPUT unverändert wie beim Original Kontakt Modul
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : Contact form mit Rechen Captcha
* Author(s) : Andreas Lindner, Patrick Dohmen
* Credits : xmurrix
* Copyright : Contenido - four for business
* Created : 20.05.2007
* Erweiterung : apical art webdesign
************************************************/
#Includes
cInclude("classes", "class.phpmailer.php");
if (!isset ($_POST['send'])) {
#Form has not been sent yet
cInclude('classes', 'class.article.php');
cInclude('classes', 'class.template.php');
#Create contact form
echo '<form id="kontaktform" method="post" action="'.$sess->url("front_content.php?idcat=$idcat").'">';
echo '<div id="hidden"><input type="hidden" name="send" value="1" /></div>';
if (!is_object($tpl)) {
$tpl = new Template;
}
$tpl->set("s", "ANREDE", mi18n("Anrede"));
$tpl->set("s", "ANREDE_OPTION1", mi18n("Herr"));
$tpl->set("s", "ANREDE_OPTION2", mi18n("Frau"));
$tpl->set("s", "NACHNAME", mi18n("Name"));
$tpl->set("s", "VORNAME", mi18n("Vorname"));
$tpl->set("s", "FIRMA", mi18n("Firma"));
$tpl->set("s", "STRASSE", mi18n("Straße/Nr."));
$tpl->set("s", "PLZORT", mi18n("PlzOrt"));
$tpl->set("s", "TELEFON", mi18n("Telefon"));
$tpl->set("s", "EMAIL", mi18n("Email"));
$tpl->set("s", "CAPTCHA_JOB", mi18n("Unsere Aufgabe"));
$tpl->set("s", "CAPTCHA_JOB_MSG", mi18n("Bitte teilen Sie uns im nachfolgenden Feld die Lösung mit"));
$tpl->set("s", "CAPTCHA_JOB_RESULT", mi18n("Ihr Ergebnis"));
$tpl->set("s", "CAPTCHA_JOB_RESULT_MSG", mi18n("Eingabefeld, geben Sie hier Ihr Ergebnis ein"));
$tpl->set("s", "ANLIEGEN", mi18n("Nachricht"));
$tpl->set("s", "PFLICHTFELDER", mi18n("Pflichtfelder"));
$tpl->set("s", "ABSCHICKEN", mi18n("Abschicken"));
$tpl->set("s", "LOESCHEN", mi18n("Löschen"));
$tpl->generate($cfgClient[$client]["path"]["frontend"]."templates/kontaktformular.html");
echo '</form>';
} elseif ($_POST['send'] == 1) {
#Form has been sent
#Check user input
$noerrors = true;
$msg = '';
cInclude("frontend","rechen-captcha.php");
$sicherheits_eingabe = encrypt($_POST["Sicherheitscode"]);
$sicherheits_eingabe = str_replace("=", "", $sicherheits_eingabe);
if(isset($rechen_captcha_spam)&&$sicherheits_eingabe == $rechen_captcha_spam){
$sess->unregister("rechen_captcha_spam");
unset($rechen_captcha_spam);
unset($_POST["Sicherheitscode"]);
}
else {
$noerrors = false;
$msg .= mi18n("Rechenaufgabe wurde falsch gelöst")."<br/>";
}
if ($_POST['Nachname'] == '') {
$noerrors = false;
$msg .= mi18n("Bitte geben Sie Ihren Namen ein!")."'<br/>";
}
if ($_POST['Email'] == '') {
$noerrors = false;
$msg .= mi18n("Bitte geben Sie Ihre EMail-Adresse ein!")."<br/>";
}
if ($noerrors == false) {
#Errors have been found
echo mi18n("<p>Beim Versenden sind folgende Fehler aufgetreten:")."<br/>";
echo $msg.'<br/>';
echo '<a href="javascript:history.back();">'.mi18n("Zurück").'</a></p>';
} else {
#No errors, create and send mail
$mail = new phpmailer;
$mail_body = '<html><head></head><body bgcolor="#ffffff"><table cellspacing="0" cellpadding="2" border="0">';
if (is_array($_POST)) {
foreach ($_POST as $key => $value) {
if ($key != 'send') {
$mail_body .= "<tr><td>$key</td><td>$value</td></tr>";
}
}
}
$mail_body .= '</table></bo'.'dy></html>';
$mail->Host = "localhost";
$mail->IsHTML(true);
#Get mailer from settings
switch (strtolower("CMS_VALUE[4]")) {
case "smtp" :
$mail->IsSMTP();
$host = "CMS_VALUE[5]";
$user = "CMS_VALUE[6]";
$password = "CMS_VALUE[7]";
if (($host != '') && ($user != '') && ($password != '')) {
$mail-> $SMTPAuth = true;
$mail->Host = $host;
$mail->Username = $user;
$mail->Password = $password;
}
break;
case "mail" :
$mail->IsMail();
break;
case "sendmail" :
$mail->IsSendmail();
break;
case "qmail" :
$mail->IsQmail();
break;
default :
}
$mail->From = "CMS_VALUE[0]";
$mail->FromName = "CMS_VALUE[2]";
$mail->AddAddress("CMS_VALUE[1]", "");
$mail->Subject = "CMS_VALUE[3]";
$mail->Body = $mail_body;
$mail->WordWrap = 50;
$mail->Send();
#Display message after mail is sent
echo mi18n("<p>"."Ihr Anliegen wurde uns übermittelt. Vielen Dank!")."<br/></p>";
}
}
?>
Im Einsatz sieht das dann so aus: http://www.apicalart.de/cms/front_content.php?idcat=29
Wichtiger Hinweis :
Die nachfolgenden 7 Threads braucht ihr nicht zu berücksichtigen. Die sind beim Enstehen des Moduls entstanden ! Die fertige Lösung ist diese hier.