Sicherheit bei Formularen

Gesperrt
BagHira
Beiträge: 486
Registriert: Do 23. Feb 2006, 19:42
Wohnort: Tirschenreuth / Oberpfalz / Bayern
Kontaktdaten:

Sicherheit bei Formularen

Beitrag von BagHira » So 22. Aug 2010, 18:40

Hallo zusammen,

ich wende mich Heute mit einer Frage an Euch:
Wie kann man / ich die (Spam)- Sicherheit bei Formularen erhöhen bzw. Wie kann vermieden werden das Spam über Formulare verschickt wird?

Sicher werden im www diverse Wege aufgezeigt. Jedoch möchte ich von Euch d.h. den PhP-Cracks oder von denen die mit Spam zu tun hatten wissen "Wie würdet / habt Ihr dies lösen / gelöst?"

Hintergrund ist der:
Wie ja einige hier wissen habe ich z.B. das vpGuestbook von Ingo um das Captcha von eBiene erweitert. >>> http://forum.contenido.org/viewtopic.php?f=51&t=21062
Ich ging die ganze Zeit davon aus, das dieses Captcha "sicher" ist, also kein Spam durch kommt. Das Modul (ebenso auch alle anderen Formulare) wurde von mir auf einigen Seiten eingesetzt, wo es bis jetzt auch nicht zu Spameinträgen gekommen ist. Auch habe ich bisher noch keine Infos über das Forum bekommen, dass das Captcha Spamer durchlässt.
Nun ist es aber so, das Armin hier http://forum.contenido.org/viewtopic.ph ... 45#p145789 schrieb, das er Spameinträge habe. Durch Umkonfiguration des Moduls ließen sich die Spamer nicht eliminieren.

Wie oben bereits beschrieben, ist dies aber der erste / einzige Fall, wo Spam durch kommt. Armin war so lieb, eine info_php auf den Server zu legen, vielleicht hilft die den Profis weiter? >>> http://web116.c2.webspace-verkauf.de/php_info.php
Das angesprochene Gästebuch läuft hier >>> http://www.basecore-hh.de/front_content ... catart=411
Wieso kommt es also gerade hier zu Spameinträgen, liegt es an der Konfiguration des Servers (was ich mir nicht vorstellen kann)?

Sicher ist jedoch, das Captcha wurde von den Spambots geknackt. Mir geht es also darum, Formulare effektiv gegen Spam abzusichern.
Welchen Weg geht Ihr, wie macht Ihr das, was habt Ihr für Erfahrungen?

Ich möchte das Gästebuch, sowie auch diverse andere Module zur Verfügung stellen, jedoch halt auch "so weit es geht" sicher.

Ich hoffe, Ihr könnt mir / uns helfen.

Für Codeschnipsel bin ich Dankbar, gerne auch PN.
Gruß Holger

Träumer haben vielleicht keinen Plan, aber Realisten haben keine Vision.

Handgewickelte Glasperlen Facebook Google+

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von Dodger77 » So 22. Aug 2010, 19:18

Hallo Holger,

einfach mal so als erste Hinweise zum Einsatz von grafischen CAPTCHA:

http://de.wikipedia.org/wiki/CAPTCHA#L. ... _Maschinen
http://caca.zoy.org/wiki/PWNtcha

Mein Fazit: grafische CAPTCHAs sind mittlerweile für Maschinen teilweise besser lösbar als für Menschen

Für kleinere Websites reicht IMO oft schon ein individuelles Frage-CAPTCHA, das die Besucher der Website einfach lösen können, aber für Bots nicht lösbar ist. Wird das geknackt, kann die Frage-Antwort-Kombination schnell geändert werden. Sergej Müller (der Autor des ebiene-CAPTCHAs) setzt mittlerweile ja auch auf andere Lösungen (http://playground.ebiene.de/1137/antisp ... ss-plugin/).

Eine Lösung ist das natürlich nicht. Für das Forum hier probieren wir jetzt aber trotzdem mal reCAPTCHA aus, weil die bisher eingesetzte Lösung für einige Nutzer Probleme bereitet hat.


Gruß

Ingo

Oldperl
Beiträge: 4254
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von Oldperl » So 22. Aug 2010, 23:19

Hallo Holger,

Spam ist ein nettes Thema. Man sollte sich von dem Glauben an einen "absoluten" Spamschutz befreien. Jede Spamschutzmaßnahme kann mit mehr oder weniger Aufwand auch umgangen werden.
Die meisten heutzutage eingesetzten Spamschutzsachen sind bei den Spammern bekannt bzw. es existieren bereits Routinen um sie zu umgehen/zu überwinden in den SpamBots. Ich persönlich denke ein "einigermaßen" sicherer Schutz ist eine Kombination aus vielen Lösungen. Hier mal eine Liste von denen, die mir grad so einfallen, wobei es bestimmt noch weitere gibt.
  • Ein Captcha mit einer nicht standardmäßigen bzw. nicht öffentlich verbreiteten Verarbeitung
  • Eine Kombination verschiedener Captchavarianten, z.B. auch zufällig
  • Ein AntiBotScript (z.B. das BadBehavior-Plugin)
  • Keine Standard-Feldnamen (email, name, comment), die nimmt ein Bot generell schon mal zum Testen, sondern ein Verschleiern von diesen
  • IP-Sperre und Begrenzung der Anzahl der Sendeversuche
  • Nach Möglichkeit kein Relaying, also kein Versenden von Antworten an im Formular eingetragene Emailadressen
  • Eine Kombination von client- und serverseitiger Prüfung der Formulareingaben, Bots z.B. interessiert kein JS
  • Black- und Whitelists
  • Sperrung oder Begrenzung von Linkeinträgen, z.B. bei Gästebüchern, da diese oft ein Ziel der Spammer sind um auf eigen Webseiten zu verweisen
  • Nutzung von AntiSpam-Diensten, z.B. zum Prüfen der Emails oder des Betreffs (wie bei Emails auf dem PC)
Keiner dieser Punkte hilft jedoch wirklich gegen manuelle Spammer, die es offensichtlich immer mehr gibt, da viele gegen Bots aufrüsten. Denn wenn ich die auch noch alle Aussperren will, dann kommt auch kaum ein "erlaubter" Eintrag mehr durch.
Dann lieber etwas moderiertes zusätzlich, um den Spammern das Interesse zu nehmen.

Der beste Spamschutz ist jedoch keine Möglichkeit zum Eintragen oder Versandt von Daten anbieten. :mrgreen:

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von McHubi » Mo 23. Aug 2010, 11:14

Ich bin noch nie ein Freund von Captchas gewesen, da sie oftmals derart unleserlich sind (ist das jetzt eine 1, ein großes i oder ein kleines L?) das man mehrere Versuche braucht bis die Nachricht dann genervt abgeschickt werden kann.

Die besten Erfahrungen habe ich bislang mit "Countchas" gemacht, selbst mit sehr einfach gestrickten. Z. B. hier zu sehen: http://www.mein1job.de/cms/front_content.php?idcat=23
Klopf auf Holz, bislang nicht ein einziger Spameintrag auf allen Seiten in denen ich nach diesem Schema vorgehe. Diese simple Version lässt sich beliebig ändern, erweitern, Symbole austauschen, nicht nur zwei sondern drei oder vier und ein Bot kann mit Sicherheit nicht erkennen "wie viele Enten" abgebildet sind. Für Menschen ist das jedoch sehr schnell und gut erfassbar.

Aber wie Ortwin schon schrieb:
Keiner dieser Punkte hilft jedoch wirklich gegen manuelle Spammer,
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Oldperl
Beiträge: 4254
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von Oldperl » Mo 23. Aug 2010, 11:47

McHubi hat geschrieben:...und ein Bot kann mit Sicherheit nicht erkennen "wie viele Enten" abgebildet sind.
Hmm, aber auch nur weil sich da noch keiner die Mühe gemacht hat, den für einen Bot-Programmierer ist eine Abfrage des angesprochene Captcha recht einfach zu implementieren.
Es wäre schwerer wenn man die Daumen und den Punkt nur in einem Bild anzeigen würde. Momentan muss ich nur die Anzahl der Bilder und die Unterscheidung gut/schlecht (im Beispiel eine Nummer im Dateinamen) wissen um das richtige Ergebnis eintragen zu können.

Aber ansonsten gefällt mir diese Lösung wirklich gut, zumal sie Humanreadable sein sollte, sofern der Ausfüller des Formulars Mathe kann :-)

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von McHubi » Mo 23. Aug 2010, 12:19

Hallo Ortwin,

ja, der Schwachpunkt ist sicher der, dass man die im Quelltext vorhandenen "Dateinamen" nur zählen müsste und entweder die eine oder andere Summe passt dann. Hier könnte man dann aber auch noch eine dritte Variante dazupacken oder ggf. weitere Symbole in einem hidden-Div einbinden die nicht in die Antwort reingezählt werden. Oder aber man macht es tatsächlich mit nur einem Bild in das eine mögliche Kombination eingebunden ist. Zur Zeit ist es halt so, dass man in der Konfiguration frei angeben kann wie viele Symbole angezeigt werden und welche (Hab mich noch nicht damit beschäftigt, wie ein einzelnes Bild automatisch aus Einzelbildern zusammengebaut werden kann). Nur, auch mit der Ein-Bild-Lösung wären hier - sofern der Bot die Logik durchschauen sollte - max. 11 Antworten, d.h. die Anzahl 0 bis 10 durchzuraten. Ne Trefferchance von 9%... Man könnte aber auch einen Abbruch einbauen wenn man sich mehr als zwei Mal verzählt...

Grüße aus dem Bergischen Land
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von kummer » Mo 23. Aug 2010, 12:37

das ist wohl, was du meinst: https://www.mri-roentgen.ch/deutsch/kontakt

1 bild und mehrere symbole, von welchen eines zu zählen ist. aktuell null spam.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

BagHira
Beiträge: 486
Registriert: Do 23. Feb 2006, 19:42
Wohnort: Tirschenreuth / Oberpfalz / Bayern
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von BagHira » Sa 28. Aug 2010, 17:05

Hallo zusammen und vielen Dank für die wegweisenden Typs und Antworten,

ich habe mich jetzt eine ganze Weile nicht mehr gemeldet um einfach mal abzuwarten. Aus den Augen habe ich dies hier jedoch nicht.

Wie im ersten Post schon beschrieben, bin ich jetzt nicht so der PHP- Profi um solche genialen Scripte wie die von Sergej Müller, Markus oder Andreas umzusetzen. Gerne würde ich so etwas in bestehende Module meinerseits einbinden (ich denk das bring ich hin) und dann der Community zur Verfügung stellen. Jedoch bin ich nicht in der Lage solche Scripte selbst zu programmieren.

Deswegen ganz offen und ehrlich die Frage, wer kann sein Modul oder Plugin und GNU/GPL zur Verfügung stellen. Auch wenn dies Kundenprojekt, waren für die ihr entwickelt habt, ist es ja vielleicht nach einer Anfrage beim entsprechenden Kunden möglich dies der Community bereitzustellen.

Ich hoffe, das "wir" da einen Schritt weiter kommen - denke das würde Contenido nicht schaden. :wink:
Gruß Holger

Träumer haben vielleicht keinen Plan, aber Realisten haben keine Vision.

Handgewickelte Glasperlen Facebook Google+

McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von McHubi » Mo 30. Aug 2010, 09:50

Klar, immer gerne. Hier also die "Schnipsel" für eine simple Countcha-Abfrage:

INPUT:

Code: Alles auswählen

echo "<tr><td>Countchas anzeigen?</td><td>";
if ("CMS_VALUE[10]" != "j") { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="j"> ja'; 
} else { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="j" checked> ja'; 
} 
if ("CMS_VALUE[10]" != "n") { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="n"> nein'; 
} else { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="n" checked> nein'; 
} 
echo "</td></tr>";
echo "<tr><td>Anzahl der Symbole gesamt: </td><td><input size=2 type=\"text\" name=\"CMS_VAR[20]\" value=\"CMS_VALUE[20]\"></td></tr>";
echo "<tr><td>Pfad zum Countchasymbol: </td><td><input size=40 type=\"text\" name=\"CMS_VAR[30]\" value=\"CMS_VALUE[30]\"></td></tr>";
echo "<tr><td>Bezeichnung des Countchasymbols: </td><td><input size=20 type=\"text\" name=\"CMS_VAR[40]\" value=\"CMS_VALUE[40]\"></td></tr>";
echo "<tr><td>Pfad zum Ablenkungssymbol: </td><td><input size=40 type=\"text\" name=\"CMS_VAR[50]\" value=\"CMS_VALUE[50]\"></td></tr>";
OUTPUT:
Deklaration der Variablen:

Code: Alles auswählen

$countcha_einschalten="CMS_VALUE[10]";
$anzahl_symbole_gesamt="CMS_VALUE[20]";
$pfad_countcha_1="'CMS_VALUE[30]'";
$bezeichnung_zaehlcountcha="CMS_VALUE[40]";
$pfad_countcha_2="'CMS_VALUE[50]'";
Fehlerabfrage:

Code: Alles auswählen

if ($countcha_einschalten=="j")
  {
  if ($countcha!=$anzahl) {$errors[] = "Bitte geben Sie korrekte Anzahl der ".$bezeichnung_zaehlcountcha." ein.";}
  }

...

if(isset($errors))
{
echo "<p>Fehler:</p><ul>";
  foreach($errors as $f)
    {
     echo "<li>".$f."</li>";
    } 
    echo "</ul>";
}
Im Formular einzubinden:

Code: Alles auswählen

if ($countcha_einschalten=="j")
  {
  print "<br/>Wie viele <u>".$bezeichnung_zaehlcountcha."</u> sehen Sie?<br/><span class=\"hinweis_klein\">(Diese Abfrage dient zur Vermeidung von Spam-Mails.)</span><br/><br/>";
  $anzahl=rand(1,$anzahl_symbole_gesamt);
  $anzahl_symbole_ablenkung=$anzahl_symbole_gesamt-$anzahl;
  $i=0;
  while ($i<$anzahl_symbole_ablenkung)
    {
    echo "<img src=".$pfad_countcha_2." border=\"0\" alt=\"\"></img>&nbsp;";
    $i=$i+1;
    }
  while ($i<$anzahl_symbole_gesamt)
    {
    echo "<img src=".$pfad_countcha_1." border=\"0\" alt=\"\"></img>&nbsp;";
    $i=$i+1;
    }
  echo "<br/><br/>Es sind <input type=\"text\" name=\"countcha\" value=\"$countcha\" size=\"1\" maxlength=\"10\"></input> ".$bezeichnung_zaehlcountcha.".<br/><br/>";
           print "<input type=\"hidden\" name=\"anzahl\" value=\"$anzahl\"></input>"; 
  }
Soooo...

... und da das Ganze aus dem Kontext gerissen dann ggf. etwas "undurchsichtig" sein könnte, hier das komplette Kontaktformular mit Countcha und der Möglichkeit einen Dateianhang zu erlauben. Es ist ein "gewachsenes" Modul, deshalb könnte/ sollte es irgendwann mal (Jaja. Immer diese Zeitprobleme...) schön in functions aufgeteilt und gestrafft werden. Also bitte das eine oder andere Umständliche verzeihen. Es funktioniert jedenfalls wunderbar. :mrgreen:

INPUT:

Code: Alles auswählen

/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname   :     mailformular_2-0
* Author(s)   :     Markus Hübner
* Copyright   :     Markus Hübner
* Created     :     28.07.2009
************************************************/

echo "<table>";
echo "<tr><td>Empf&auml;nger E-Mail: </td><td><input size=40 type=\"text\" name=\"CMS_VAR[70]\" value=\"CMS_VALUE[70]\"><br><small>(mehrere Empf&auml;nger mit // trennen)</small></td></tr>";
echo "<tr><td>Betreff E-Mail: </td><td><input size=40 type=\"text\" name=\"CMS_VAR[80]\" value=\"CMS_VALUE[80]\"></td></tr>";
echo "<tr><td colspan=2><hr></td></tr>";
echo "<tr><td>Countchas anzeigen?</td><td>";
if ("CMS_VALUE[10]" != "j") { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="j"> ja'; 
} else { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="j" checked> ja'; 
} 
if ("CMS_VALUE[10]" != "n") { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="n"> nein'; 
} else { 
   echo '          <input type="radio" name="CMS_VAR[10]" value="n" checked> nein'; 
} 
echo "</td></tr>";
echo "<tr><td>Anzahl der Symbole gesamt: </td><td><input size=2 type=\"text\" name=\"CMS_VAR[20]\" value=\"CMS_VALUE[20]\"></td></tr>";
echo "<tr><td>Pfad zum Countchasymbol: </td><td><input size=40 type=\"text\" name=\"CMS_VAR[30]\" value=\"CMS_VALUE[30]\"></td></tr>";
echo "<tr><td>Bezeichnung des Countchasymbols: </td><td><input size=20 type=\"text\" name=\"CMS_VAR[40]\" value=\"CMS_VALUE[40]\"></td></tr>";
echo "<tr><td>Pfad zum Ablenkungssymbol: </td><td><input size=40 type=\"text\" name=\"CMS_VAR[50]\" value=\"CMS_VALUE[50]\"></td></tr>";
echo "<tr><td colspan=2><hr></td></tr>";
echo "<tr><td>Dateianhang ermöglichen?</td><td>";
if ("CMS_VALUE[85]" != "j") { 
   echo '          <input type="radio" name="CMS_VAR[85]" value="j"> ja'; 
} else { 
   echo '          <input type="radio" name="CMS_VAR[85]" value="j" checked> ja'; 
} 
if ("CMS_VALUE[85]" != "n") { 
   echo '          <input type="radio" name="CMS_VAR[85]" value="n"> nein'; 
} else { 
   echo '          <input type="radio" name="CMS_VAR[85]" value="n" checked> nein'; 
} 
echo "</td></tr>";

echo "<tr><td>Maximale Dateigröße des Anhangs:</td><td><input size=5 type=\"text\" name=\"CMS_VAR[90]\" value=\"CMS_VALUE[90]\">(in Bytes)</td></tr>";
echo "</table>";
OUTPUT:

Code: Alles auswählen

<div class="formular_einruecker">
<h2>Kontaktformular</h2>

<?php

/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     mailformular_2-0
* Author(s)   :     Markus Hübner
* Copyright   :     Markus Hübner
* Created     :     28.07.2009
************************************************/


/****** Beginn Festlegung von Variablen ******/
$countcha_einschalten="CMS_VALUE[10]";
$anzahl_symbole_gesamt="CMS_VALUE[20]";
$pfad_countcha_1="'CMS_VALUE[30]'";
$bezeichnung_zaehlcountcha="CMS_VALUE[40]";
$pfad_countcha_2="'CMS_VALUE[50]'";

$empfaenger="CMS_VALUE[70]";
$betreff="CMS_VALUE[80]";
//echo "CMS_VALUE[80]";

$attachement_ermoeglichen="CMS_VALUE[85]";
$max_attach_size="CMS_VALUE[90]";
$max_attach_size_hinweis=$max_attach_size/1000000;

$message_vorlage="<table>
                  <tr><td><strong>Anrede:</strong></td><td>$anrede</td></tr>
                  <tr><td><strong>Vorname: *</strong></td><td>$vorname</td></tr>
                  <tr><td><strong>Name: *</strong></td><td>$name</td></tr>
                  <tr><td><strong>Strasse/ Hausnummer:</strong></td><td>$strasse</td></tr>
                  <tr><td><strong>PLZ:</strong></td><td>$plz</td></tr>
                  <tr><td><strong>Ort:</strong></td><td>$ort</td></tr>
<!--                  <tr><td><strong>Geburtsdatum:</strong></td><td>$gebdatum</td></tr>-->
                  <tr><td><strong>Telefon:</strong></td><td>$telefon</td></tr>
                  <tr><td><strong>eMail: *</strong></td><td>$email</td></tr>
                  <tr><td><strong>Dateianhang:</strong></td><td>$probe</td></tr> 
                  <tr><td><strong>Nachricht: *</strong></td><td>$text</td></tr>
                </table>";
/****** Ende Festlegung von Variablen ******/




function QB_SECURE_MAIL_PARAM($param_ = '', $level_ = 2) { 

    unset($filtered); 
    /* replace until done */ 
    while ($param_ != $filtered || !isset($filtered)) { 
        if (isset($filtered)) { 
            $param_ = $filtered; 
        } 
        $filtered = preg_replace( 
            "/(Content-Transfer-Encoding:|MIME-Version:|content-type:|" . 
            "Subject:|to:|cc:|bcc:|from:|reply-to:)/ims", "", $param_); 
    } 
    unset($filtered); 
     
    if ($level_ >= 2) { 
        /* replace until done */ 
        while ($param_ != $filtered || !isset($filtered)) { 
            if (isset($filtered)) { 
                $param_ = $filtered; 
            }         
            $filtered = preg_replace( 
                "/(%0A|\\\\r|%0D|\\\\n|%00|\\\\0|%09|\\\\t|%01|%02|%03|%04|%05|" . 
                "%06|%07|%08|%09|%0B|%0C|%0E|%0F|%10|%11|%12|%13)/ims", "", $param_); 
        } 
    } 
    return $param_; 
}


if (isset($_POST["form_submitted"]))
{
$probe = $_FILES['probe']['name'];

///////////////////////////
// Überprüfung der Daten:
///////////////////////////

unset($errors);

   if ($vorname == '') {$errors[] = "Bitte tragen Sie Ihren Vornamen ein.";}
   if ($name == '') {$errors[] = "Bitte tragen Sie Ihren Namen ein.";}
/*
   if ($strasse== '') {$errors[] = "Bitte trage die Strasse Deiner Anschrift ein.";}
   if (empty($plz) || strlen($plz) < 5 OR strlen($plz)>5) {$errors[] = "Bitte trage die Postleitzahl Deiner Anschrift f&uuml;nfstellig ein.";}
   if ($ort== '') {$errors[] = "Bitte trage den Ort Deiner Anschrift ein.";}
*/ 
/*   if ($gebdatum == '') {$errors[] = "Bitte tragen Sie Ihr Geburtsdatum ein.";}*/

/*   if(empty($telefon) || !preg_match("/^(\+?[0-9 ]{3,}[-\/]?[0-9 ]{3,}]*)$/", $telefon)) 
       { 
         $errors[] = "Bitte trage eine korrekte Telefonnummer ein.";
        } */
   if ($email == '')
       { 
         $errors[] = "Bitte tragen Sie eine eMail-Adresse ein.";
       }
       if (!empty($email))
          { 
          $mail_expr = "/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/"; 
          if (!preg_match($mail_expr, $email) )
             { 
              $errors[] = "Bitte tragen Sie eine korrekte eMail-Adresse ein.";
             } 
          }

if ($text == "") $errors[] = "Bitte tragen Sie eine Nachricht ein.";
if ($_FILES['probe']['size'] > $max_attach_size) $errors[] = "Dateianhang ist zu gro&szlig; (".number_format($_FILES['probe']['size']/1000,0,",","")." KB) - Maximalgr&ouml;&szlig;e: ".number_format($max_attach_size/1000,0,",","")." KB";

if ($countcha_einschalten=="j")
  {
  if ($countcha!=$anzahl) {$errors[] = "Bitte geben Sie korrekte Anzahl der ".$bezeichnung_zaehlcountcha." ein.";}
  }

if (empty($errors))
{
////////////////////////////////////
// Mail mit Anhang
////////////////////////////////////

$vorname=htmlspecialchars($vorname);
$name=htmlspecialchars($name);
$strasse=htmlspecialchars($strasse);
$plz=htmlspecialchars($plz);
$ort=htmlspecialchars($ort);
/*
$gebdatum=htmlspecialchars($gebdatum);
*/
$telefon=htmlspecialchars($telefon);
$text=htmlspecialchars($text);
$trenner_name_absender=" ";
$name_absender=$name.$trenner_name_absender.$vorname;
if ($name != "") $mail_name=$name_absender; else $mail_name="unbekannt";
if ($betreff!= "") $mail_subject = $betreff; else $mail_subject = "kein Betreff";
if ($email != "") $mail_email = $email; else $mail_email = "email@unknown.xyz";
$ip = $_SERVER["REMOTE_ADDR"];

// Wenn Attachment, dann MIME-Mail erstellen:
if (isset($_FILES['probe']['name']) && trim($_FILES['probe']['name']) != "")
{
// Datei einlesen und codieren:
$datei_content = fread(fopen($_FILES['probe']['tmp_name'],"r"),filesize($_FILES['probe']['tmp_name']));
$datei_content = chunk_split(base64_encode($datei_content),76,"\n");

// Boundary festlegen:
$boundary = md5(uniqid(rand()));

// Mail-Header:
$mail_header = "From: ".$mail_name." <".$mail_email.">\n";
$mail_header .= "X-Sender-IP: ".$ip."\n";
$mail_header .= "MIME-Version: 1.0\n";
$mail_header .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n";
$mail_header .= "This is a multi-part message in MIME format.\n";
// Mail-Text:
$mail_header .= "--".$boundary;
$mail_header .= "\nContent-Type: text/html; charset=iso-8859-1\r\n";
$vorname=QB_SECURE_MAIL_PARAM($vorname);
$name=QB_SECURE_MAIL_PARAM($name);
$strasse=QB_SECURE_MAIL_PARAM($strasse);
$plz=QB_SECURE_MAIL_PARAM($plz);
$ort=QB_SECURE_MAIL_PARAM($ort);
/*
$gebdatum=QB_SECURE_MAIL_PARAM($gebdatum);
*/
$telefon=QB_SECURE_MAIL_PARAM($telefon);
$text=QB_SECURE_MAIL_PARAM($text);
$message=$message_vorlage;
$mail_header .= "\n\n".$message;
// Attachment:
$mail_header .= "\n--".$boundary;
$mail_header .= "\nContent-Type: ".$_FILES['probe']['type']."; name=\"".$_FILES['probe']['name']."\"";
$mail_header .= "\nContent-Transfer-Encoding: base64";
$mail_header .= "\nContent-Disposition: attachment; filename=\"".$_FILES['probe']['name']."\"";
$mail_header .= "\n\n".$datei_content;

// Ende:
$mail_header .= "\n--".$boundary."--";
// Sende E-Mail und gebe Fehler bzw. Bestaetigung aus
$emails_in_array=explode("//",$empfaenger);
foreach($emails_in_array as $mailto)
{
if (@mail($mailto,$mail_subject,"",$mail_header)) $sent = true; else $errors[] = "keine Verbindung zum Mailserver - bitte nochmal versuchen";
}
}

////////////////////////////////////
// kein Attachment, normale E-Mail:
////////////////////////////////////

else
{
// Mail-Header:
$mail_header = "From: ".$mail_name." <".$mail_email.">\n";
$mail_header .= "X-Sender-IP: $ip\n";
$mail_header .= "Content-type: text/html; charset=iso-8859-1\r\n";
$vorname=QB_SECURE_MAIL_PARAM($vorname);
$name=QB_SECURE_MAIL_PARAM($name);
$strasse=QB_SECURE_MAIL_PARAM($strasse);
$plz=QB_SECURE_MAIL_PARAM($plz);
$ort=QB_SECURE_MAIL_PARAM($ort);
/*
$gebdatum=QB_SECURE_MAIL_PARAM($gebdatum);
*/
$telefon=QB_SECURE_MAIL_PARAM($telefon);
$text=QB_SECURE_MAIL_PARAM($text);
$message=$message_vorlage;
$mail_header .= "\n\n".$message;
// Sende E-Mail und gebe Fehler bzw. Bestaetigung aus
$emails_in_array=explode("//",$empfaenger);
foreach($emails_in_array as $mailto)
{
if (@mail($mailto,$mail_subject,"",$mail_header)) $sent = true; else $errors[] = "keine Verbindung zum Mailserver - bitte nochmal versuchen";
}
}

} //if (empty($errors))
} //if (isset($_POST["form_submitted"]))

//////////////////////////////////////////////////
// Wenn noch nicht abgesendet, Formular darstellen
//////////////////////////////////////////////////

if (empty($sent))
{
if(isset($errors))
{
echo "<div class=\"formular_einruecker\">";
echo "<span class=\"fehler_kontaktformular\">";
echo "<p>Fehler:</p><ul>";
  foreach($errors as $f)
    {
     echo "<li>".$f."</li>";
    } 
    echo "</ul></span><br/>";
echo "</div>";
}

echo "<form method=\"post\" action=\"http://www.meine-region-meine-kasse.de/cms/front_content.php?idart=".$idart."\" enctype=\"multipart/form-data\">";
echo "<table class=\"tabelle_formular\">";
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Anrede:</td><td class=\"tabellenzelle_formular\"><input type=\"radio\" name=\"anrede\" value=\"Herr\" checked=\"checked\"/> Herr<br/><input type=\"radio\" name=\"anrede\" value=\"Frau\"/> Frau</td></tr>"; 
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Vorname: *</td><td class=\"tabellenzelle_formular\"><input type=\"text\" name=\"vorname\" size=\"39\"value=\"";
 if (isset($vorname)) {echo htmlentities(stripslashes($vorname));} else echo "";
echo "\"/></td></tr>"; 
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Name: *</td><td class=\"tabellenzelle_formular\"><input type=\"text\" name=\"name\" size=\"39\"value=\"";
 if (isset($name)) {echo htmlentities(stripslashes($name));} else echo "";
echo "\"/></td></tr>"; 
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Strasse & Hausnummer:</td><td class=\"tabellenzelle_formular\"><input type=\"text\" name=\"strasse\" size=\"39\"value=\"";
 if (isset($strasse)) {echo htmlentities(stripslashes($strasse));} else echo "";
echo "\"/></td></tr>"; 
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">PLZ/ Ort:</td><td class=\"tabellenzelle_formular\"><input type=\"text\" name=\"plz\" size=\"4\"value=\"";
 if (isset($plz)) {echo htmlentities(stripslashes($plz));} else echo "";
echo "\"/>"; 
echo "<input style=\"margin-left: 1px;\" type=\"text\" name=\"ort\" size=\"30\"value=\"";
 if (isset($ort)) {echo htmlentities(stripslashes($ort));} else echo "";
echo "\"/></td></tr>"; 
/*
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Geburtsdatum:</td><td class=\"tabellenzelle_formular\"><input type=\"text\" name=\"gebdatum\" size=\"10\" value=\"";
 if (isset($gebdatum)) {echo htmlentities(stripslashes($gebdatum));} else echo "";
echo "\"/></td></tr>";
*/
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Telefonnummer:</td><td class=\"tabellenzelle_formular\"><input type=\"text\" name=\"telefon\" size=\"39\" value=\"";
 if (isset($telefon)) {echo htmlentities(stripslashes($telefon));} else echo "";
echo "\"/></td></tr>"; 
echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">eMail: *</td><td class=\"tabellenzelle_formular\"><input type=\"text\" name=\"email\" size=\"39\" value=\"";
 if (isset($email)) {echo htmlentities(stripslashes($email));} else echo "";
echo "\"/></td></tr>"; 
?>

<tr><td class="tabellenzelle_formular_ueberschrift">Nachricht: *</td><td class=\"tabellenzelle_formular\"><textarea name="text" cols="30" rows="5"><?php if (isset($text)) echo htmlentities(stripslashes($text)); else echo ""; ?></textarea></td></tr>
<?php
if ($attachement_ermoeglichen=="j")
 {
  ?>
  <tr><td class="tabellenzelle_formular_ueberschrift">Datei-Anhang:</td><td class=\"tabellenzelle_formular\"><input type="file" name="probe" value="<?php if (isset($_POST['probe'])) echo htmlentities(stripslashes($_POST['probe'])); else echo ""; ?>" size="20"/> (max. Dateigröße: <?php echo $max_attach_size_hinweis; ?> MB)</td></tr>
 <?php
 } 
echo "</table>";
echo "<p><span class=\"hinweis_klein\">Mit einem * versehende Felder sind Pflichtfelder.</span></p>";

if ($countcha_einschalten=="j")
  {
  print "<br/>Wie viele <u>".$bezeichnung_zaehlcountcha."</u> sehen Sie?<br/><span class=\"hinweis_klein\">(Diese Abfrage dient zur Vermeidung von Spam-Mails.)</span><br/><br/>";
  $anzahl=rand(1,$anzahl_symbole_gesamt);
  $anzahl_symbole_ablenkung=$anzahl_symbole_gesamt-$anzahl;
  $i=0;
  while ($i<$anzahl_symbole_ablenkung)
    {
    echo "<img src=".$pfad_countcha_2." border=\"0\" alt=\"\"></img>&nbsp;";
    $i=$i+1;
    }
  while ($i<$anzahl_symbole_gesamt)
    {
    echo "<img src=".$pfad_countcha_1." border=\"0\" alt=\"\"></img>&nbsp;";
    $i=$i+1;
    }
  echo "<br/><br/>Es sind <input type=\"text\" name=\"countcha\" value=\"$countcha\" size=\"1\" maxlength=\"10\"></input> ".$bezeichnung_zaehlcountcha.".<br/><br/>";
           print "<input type=\"hidden\" name=\"anzahl\" value=\"$anzahl\"></input>"; 
  }

echo "<br/><input class=\"button\" type=\"submit\" name=\"form_submitted\" value=\"Versenden\" />";
echo "</form><br/><br/>";
}
else
{
if (isset($_POST["form_submitted"]))
   {
    echo "<br/><u>Vielen Dank f&uuml;r Ihre Nachricht.</u><br/><br/>";
    echo "<table class=\"tabelle_formular\">";
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Anrede:</td><td class=\"tabellenzelle_formular\">".$anrede."</td></tr>"; 
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Vorname:</td><td class=\"tabellenzelle_formular\">".$vorname."</td></tr>"; 
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Name:</td><td class=\"tabellenzelle_formular\">".$name."</td></tr>"; 
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Strasse & Hausnummer:</td><td class=\"tabellenzelle_formular\">".$strasse."</td></tr>"; 
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">PLZ/ Ort:</td><td class=\"tabellenzelle_formular\">".$plz."&nbsp;".$ort."</td></tr>"; 
    //echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Geburtsdatum:</td><td class=\"tabellenzelle_formular\">".$gebdatum."</td></tr>"; 
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Telefonnummer:</td><td class=\"tabellenzelle_formular\">".$telefon."</td></tr>"; 
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">eMail:</td><td class=\"tabellenzelle_formular\">".$email."</td></tr>"; 
if ($attachement_ermoeglichen=="j")
   {
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Dateianhang:</td><td class=\"tabellenzelle_formular\">".$probe."</td></tr>";
   }
    echo "<tr><td class=\"tabellenzelle_formular_ueberschrift\">Nachricht:</td><td class=\"tabellenzelle_formular\">".$text."</td></tr>";
    echo "</table>";
   }
}

?>

</div> <!-- formular_einruecker -->
CSS-Klassen (ggf. nicht vollständig):

Code: Alles auswählen

div.formular_einruecker {
margin-left: 0px;
padding-right: 0px;
margin-bottom: 20px;
}
span.fehler_kontaktformular,
span.fehler_mailkontakt,
span.fehlerhinweis {
color: #ff0000;
}
table.tabelle_formular {
border: 1px solid #3d857d;
}
td.tabellenzelle_formular {
}
td.tabellenzelle_formular_ueberschrift {
font-weight: 900;
padding: 3px;
vertical-align: top;
color: #3d857d;
}
input.button {
border: 1px solid #3d857d;
}
input.feld,
textarea.feld {
border: 1px solid #3d857d;
background-color: #ffffff;
}
Viel Spaß! :)
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

BagHira
Beiträge: 486
Registriert: Do 23. Feb 2006, 19:42
Wohnort: Tirschenreuth / Oberpfalz / Bayern
Kontaktdaten:

Re: Sicherheit bei Formularen

Beitrag von BagHira » Mo 30. Aug 2010, 18:35

Vielen Dank Markus, ich werd mal schauen wie weit ich komme. :roll:
Falls es Probleme gibt melde ich mich, ansonsten werd ich neue Threads mit den neuen Modulen aufmachen. :wink:
Gruß Holger

Träumer haben vielleicht keinen Plan, aber Realisten haben keine Vision.

Handgewickelte Glasperlen Facebook Google+

Gesperrt