• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Kontaktformular mit einem bedingungssatz via php schützen.

Shrax

Mitglied
Nachdem ich mein anderes Problem auch dank hilfe nun gelöst habe kommt nun der 2te teil.

Den Aktiven link zu kennzeichenen war das eine.
Nun der 2te teil auf meiner Website der per php umgesetzt werden muss.
Ich hoffe ihr versteht mich ich habe keine Zeit php komplett zu lernen. Ich bin aber mit hilfestellungen auch zu frieden wie Seiten wo das Problem erklährt wird.


Problem:
Ich habe ein Kontaktformular. Der Code steht unter diesem Absatz. Er kommt von dieser Website: WebDesign - Tips und Tricks: universeller Formmailer

Nun möchte ich hierrein einen Spamschutz machen. Kein Captcha sondern etwas ganz simples. Ich möchte eine Frage stellen und per php soll nur geprüft werden ob eine von mir angegebene Antwort richtig ist. Groß und kleinschreibung soll egal sein.
Beispiel:

Wie heißt dieses Forum hier?
Mögliche Antworten zum Beispiel:
html.de
HtMl.De
HTML.DE

Ist die Antwort so richtig darf die Mail abgeschickt werden.


Und bitte keine diskusion ob dies ein sinnvoller Spamschutz ist, ich würde es gerne so haben.

Code meines formulars live hier:
Kontaktformular
als code hier:
PHP:
<?php
define ('MAILTO', "[email protected]"); // Empfänger hier eintragen
define ('MAILFROM', "Kontaktformular"); // ggfls. Absender hier eintragen
define ('CHARSET', "UTF-8"); // Zeichenkodierung ggfls. anpassen
$Pflichtfelder = array('Nachricht'); // ggfls. weitere Pflichtfelder angeben


$AddHeader = 'Content-Type: text/plain; charset='.CHARSET;
if(MAILFROM) $AddHeader .= chr(13).chr(10).'From: '.MAILFROM;

if($Formular_abgeschickt = !empty($_POST)) {
  $Formular_leer = true; set_magic_quotes_runtime(0);
  $_POST = array_map('Formular_Daten', $_POST);
}
function Formular_Daten($val) {
  global $Formular_leer;
  if(is_array($val)) return array_map('Formular_Daten', $val);
  if(get_magic_quotes_gpc()) $val = stripslashes($val);
  if($val = trim($val)) $Formular_leer = false;
  return $val;
}

function Formular_Pflichtfelder() {
  global $Pflichtfelder;
  $Fehler = '';
  foreach ($Pflichtfelder as $Feld) {
    $key = str_replace(' ','_',$Feld);
    if(!(isset($_POST[$key]) && trim($_POST[$key])!=='')) {
      if($Fehler) $Fehler .= '<br />';
      $Fehler .= 'Pflichtfeld "' . $Feld . '" nicht ausgefüllt.';
    }
  }
  return $Fehler;
}

function Formular_neu($log='.htPOSTdata.txt') {
  if(file_exists($log) && is_readable($log)
   && file_get_contents($log) == print_r($_POST,true))
  return false;
  if($handle=@fopen($log, 'w')) {
    fwrite($handle, print_r($_POST,true)); fclose($handle);
  }
  return true;
}

function Formular_Check() {
  global $Formular_leer;
  if($Formular_leer) $Fehler = 'Keine Daten eingetragen.';
  elseif(!$Fehler = Formular_Pflichtfelder()) {
    if(!Formular_neu()) $Fehler = 'Nachricht war bereits verschickt.';
  }
  return $Fehler;
}

function Formular_Eingabe($Feldname, $def='') {
  if(isset($_POST[$Feldname]) && $_POST[$Feldname]!=='')
    echo htmlspecialchars($_POST[$Feldname]);
  else echo $def;
}
?>
<!DOCTYPE html>
<head>
  <title>Kontaktformular</title>
  <meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>" />
</head>
<body>
<h1>Kontakt</h1>

<?php
if($Formular_abgeschickt) {
  if($Formular_Fehler = Formular_Check())
    echo '<p class="Meldung" id="Fehler">',$Formular_Fehler,'</p>';
  elseif(@mail(MAILTO, "Nachricht", print_r($_POST,true), $AddHeader))
    echo '<p class="Meldung" id="OK">Nachricht verschickt.</p>';
  else echo '<p class="Meldung" id="Fehler">Server-Fehler !</p>';
}
?>

<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post"
 enctype="multipart/form-data" accept-charset="<?php echo CHARSET; ?>">
  <fieldset><legend>Kontaktformular</legend>
    <p>
      <label for="Name">Ihr Name:</label>
      <input name="Name" id="Name" size="66"
       value="<?php Formular_Eingabe('Name'); ?>" />
    </p>
    <p>
      <label for="Nachricht">Nachricht:</label>
      <textarea name="Nachricht" id="Nachricht" rows="5" cols="50"><?php
       Formular_Eingabe('Nachricht'); ?></textarea>
    </p>
    <p><input type="submit" value="abschicken" /></p>
  </fieldset>
</form>

</body>
</html>
 
Werbung:
Das muss noch in das Formular rein.
HTML:
<label>Geben Sie den Namen dieses Forums in das folgende Feld ein:</label>
<input type="text" name="securityQuestionInput" value="" />


Dieser Codeaussschnitt muss nun umgeänderte werden:

PHP:
<?php
if($Formular_abgeschickt) {
  if($Formular_Fehler = Formular_Check())
    echo '<p class="Meldung" id="Fehler">',$Formular_Fehler,'</p>';
  elseif(@mail(MAILTO, "Nachricht", print_r($_POST,true), $AddHeader))
    echo '<p class="Meldung" id="OK">Nachricht verschickt.</p>';
  else echo '<p class="Meldung" id="Fehler">Server-Fehler !</p>';
}
?>

Bevor es zum mail() Aufruf kommt, brauchst du eben noch eine if-Bedingung.
Zum Beispiel:
PHP:
<?php
if($Formular_abgeschickt) 
{
    if($Formular_Fehler = Formular_Check())
    {
        echo '<p class="Meldung" id="Fehler">',$Formular_Fehler,'</p>';
    }
    else
    {
        if ($_POST['securityQuestionInput'] == "html.de")
        {      
           if(@mail(MAILTO, "Nachricht", print_r($_POST,true), $AddHeader)) 
           {    
               echo '<p class="Meldung" id="OK">Nachricht verschickt.</p>';
           }
           else
           {
               echo '<p class="Meldung" id="Fehler">Server-Fehler !</p>';
           }
        }
        else
        {
            echo '<p class="Meldung" id="Fehler">Die Sicherheitsfrage wurde falsch beantwortet</p>';       
        }
    }
}
?>
 
ich würde das ändern in
... (strtolower($_POST['securityQuestionInput']) == "html.de") ....


 
Werbung:
Hm, auf meinem Server ist das eigentlich nie notwendig. Gibt es in der php.ini eine Einstellung, mit der man die Groß- und Kleinschreibung Überpüfung ein bzw aussschalten kann?
Ob man das einstellen kann, weiß ich nicht. Ich habe bei mir unter Windows 7 PHP 5, dann habe ich 2 Provider mit beiden Versionen PHP 4 und 5 und der eine hat Windows/IIS, der andere Linux/Apache. Auf allen 5 Umgebungen liefert
PHP:
echo 'Unterschied: ' .  ('a' == 'A') .'<br>Gleich: ' .  ('A' == 'A');
im ersten Fall False (leer) und im zweiten True (1). Eventuell gibt es ja eine Option wie unter MS VB 'Option Compare Text', analog wie man ja auch die Zeitzone einstellen kann. Unabhängig davon finde ich es sauberer, weil der Code dann schon ausdrückt, dass man hier keinen Wert auf die Schreibweise legt und sicherer, weil ich persönlich nie weiß, welche Programmiersprache es nun wie handhabt :-).
 
Hm, auf meinem Server ist das eigentlich nie notwendig. Gibt es in der php.ini eine Einstellung, mit der man die Groß- und Kleinschreibung Überpüfung ein bzw aussschalten kann?

Meines Wissens nach wird unter UNIX-Systemen zwischen Groß- und Kleinschreibung unterschieden. Unter Windoof nicht.
http://technet.microsoft.com/de-de/library/cc732389.aspx

Btw.
PHP:
    else
    {
        if ($_POST['securityQuestionInput'] == "html.de")
        { 
[...]
...lässt sich zu...
PHP:
elseif($_POST['securityQuestionInput'] == "html.de")
	{
[...]
...zusammenfassen. Finde ich persönlich übersichtlicher.

Gruß
 
Werbung:
Zurück
Oben