Sicherheitsabfrage

CreativPur

Erfahrenes Mitglied
Hallo,
ich versuche gerade eine Sicherheitsabfrage für mein Kontaktformular zu erstellen.
Bei diesem Tool soll eine kleine Rechenaufgabe gelöst werden, die aus zwei Zufallszahlen zusammen addiert werden sollen.

PHP:
<?php
$showFormular = true;

$zahl1 = mt_rand(1,20);
$zahl2 = mt_rand(1,20);       

$numbers = array($zahl1, $zahl2);
$operators = array('+');

$mathString = '';
foreach ($numbers as $id => $number) {
if ($id < count($numbers)-1) {
$mathString .= $number . $operators[$id];
} else {
$mathString .= $number;
}
}
if($showFormular) {
?>

Die Aufgabe wird folgend dargestellt:
PHP:
<label> <span style="color:red;">Sicherheitsfrage:</span> Was ergibt <?php echo $zahl1. ' + ' .$zahl2 ?></label>

Nun soll geprüft werden, ob das richtige Ergebnis eingegeben wurde...
PHP:
<?php
echo '<br />';
$ergebnis = $_POST['ergebnis'];   
$summe = $_POST['zahl1'] + $_POST['zahl2'];
        
if($ergebnis != $summe) {
echo '<strong style="color:red;">Das Ergebnis ist falsch</strong>';
$error = true;
}
else {
echo '<strong style="color:green;"></strong>';
$error = true;
}   
?>

Das Eingabefeld für das Ergebnis und die Hiddenfelder für $zahl1 und $zahl2 sehen folgendermaßen aus..
PHP:
<div class="sicherheit" style="font-size:12px">                       
<div class="mb-3">
<input class="form-control form-control-sm" type="text" placeholder="Ergebnis eingeben" style="height: 10px; margin-top:5px;" name="ergebnis" required>
</div>
<div class="mb-3">
<input type="text" style="display: none" id="exampleFormControlInput1" name="zahl1" value="<?php echo $zahl1 ?>">
</div>
<div class="mb-3">
<input type="text"  style="display: none" id="exampleFormControlInput1" name="zahl2" value="<?php echo $zahl2 ?>">
</div>
</div>

Erst wenn die richtige Summe eingetragen wurde, soll das Formular sendebereit sein
Das Problem ist, ich weiß nicht, wie ich das umsetzen kann.
 
Ich wollte nach dem Beispiel eines Registrierformualres gehen, wo das Passwort auch zweimal eigegeben werden muss und geprüft wird, ob sie identisch sind.
daher habe ich gerade meinen Code nochmals etwas verändert..

PHP:
<?php
echo '<br />';
$ergebnis = $_POST['ergebnis'];   
$ergebnis2 = $_POST['ergebnis2'];
        
if($ergebnis != $ergebnis2) {
echo '<strong style="color:red;">Das Ergebnis ist falsch</strong>';
$error = true;
}
else {
echo '<strong style="color:green;"></strong>';
$error = true;
}   
?>

Somit fällt ein Hiddenfeld weg...
PHP:
<div class="sicherheit" style="font-size:12px">                       
<div class="mb-3">
<input class="form-control form-control-sm" type="text" placeholder="Ergebnis eingeben" style="height: 10px; margin-top:5px;" name="ergebnis" required>
</div>
<div class="mb-3">
<input type="text" style="display:none" id="exampleFormControlInput1" name="ergebnis2" value="<?php eval('echo ' . $mathString . ';'); ?>">
</div>
</div>

Aber dennoch komme ich nicht weiter....
 
Das Überprüfen funktioniert ja.
Ich weiß nur nicht, welchen Befehl ich noch einbauen kann, damit das Eingabefeld ok ist und somit das Formular abgeschickt werden kann.
Wenn der Wert nicht ok ist, soll das Senden des Formulars blockiert werden
 
Simples Beispiel:
PHP:
<?php
   session_start();
 
   if (isset($_POST['result']) && isset($_SESSION['result']))
   {
      if ($_POST['result'] == $_SESSION['result'])
          $info = "Ergebnis ist korrekt";
      else
          $info = "Ergebnis ist nicht korrekt";    
   }

   $z1 = mt_rand(1,20);
   $z2 = mt_rand(1,20);
     
   $_SESSION['result'] = $z1 + $z2;

?>
<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Abfrage</title>
  </head>
  <body>
   <form action="" method="post">
    Geben Sie bitte das Ergebnis von <?php echo "$z1 + $z2"; ?> ein:
    <input type="text" name="result">
    <input type="submit" name="submit" value="Senden">
   </form>
   <br>
<?php
   if (isset($info))
       echo $info;
?>  
  </body>
</html>

Und dann wurde ich noch einen Honeypot einbauen. Und noch sicherer wird es, wenn du den Text
PHP:
Geben Sie bitte das Ergebnis von <?php echo "$z1 + $z2"; ?> ein:
per PHP als Grafik erzeugst und diese anzeigst. Gute Bots erkennen nämlich auch Texte w.z.B. 3 + 5
 
Zuletzt bearbeitet:
Guten Morgen btd600;
vielen Dank für Deine Mühe.
Ich habe es auch umgesetzt und habe sogar per PHP die Grafik erstellt..
Diese Grafik habe ich Datei Test2.php genannt

PHP:
<?php
session_start();
header("Content-type: image/png");

$z1 = mt_rand(1,20);
$z2 = mt_rand(1,20);
$_SESSION['result'] = $z1 + $z2;

$breite = 70;
$hoehe = 20;
$marsbild = imageCreateTruecolor($breite, $hoehe); // Grafik erstellen

$wasserfarbe = imageColorAllocate($marsbild, 255, 255, 255); // Farbe für den Hintergrund erstellen
imageFill($marsbild, 0, 0, $wasserfarbe); // Grafik mit der Hintergrundfarbe füllen
$schriftfarbe = imageColorAllocate($marsbild, 0, 0, 0); // Farbe der Schrift
ImageString($marsbild, 6, 1, 1, "$z1 + $z2", $schriftfarbe); // Text in die Grafik zeichnen
imagePng($marsbild); // Ausgabe der Grafik an den Browser senden
imageDestroy($marsbild); // Grafik aus dem Speicher entfernen
?>

Das Formular..
PHP:
<?php
session_start();
if (isset($_POST['result']) && isset($_SESSION['result']))
{
 if ($_POST['result'] == $_SESSION['result'])
 $info = "Ergebnis ist korrekt";
 else
 $info = "Ergebnis ist nicht korrekt";   
}
?>

<!DOCTYPE html>
<html lang="de">
<head>     
      
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Abfrage</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
</head>
<body>   
<div class="container" style="margin-top:50px;" align="center">   
<form action="#" method="post">
<hr />
Geben Sie bitte das Ergebnis von <img src="rech_img.php" width="80px;"  alt=""/>ein:
<br /> <br />
<input type="text" name="result">
<hr />
<input type="submit" name="submit" value="Senden">
</form>
<hr>
<?php
   if (isset($info))
   echo $info;
?> 
</body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
</html>

Auch die Info, ob der Wert, den ich eingebe richtig, oder falsch ist, wird auch korrekt angezeigt.
Wenn ich aber <form action="formmailer,php" method="post"> eingebe, wird mann auch bei Fehleingabe weitergeleitet.
Das soll natürlich nicht passieren!
Was habe ich da nur falsch gemacht ?

Als nächstes werde ich mich um den Honeypot kümmern..
 
Ich habe die Weiterleitung zu meinem Formmailer ausprobiert.
Und dabei ging die Email auch bei Falscheingabe raus.

Code:
<form action="formmailer.php" method="post">
<hr />
Geben Sie bitte das Ergebnis von <img src="rech_img.php" width="80px;"  alt=""/>ein:
<br /> <br />
<input type="text" name="result">
<hr />
<input type="submit" name="submit" value="Senden">
</form>
 

Neue Beiträge

Zurück