php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.07.2007, 21:13  
Erfahrener Benutzer
 
Registriert seit: 14.04.2006
Beiträge: 111
tayke
Standard Kontaktformular - Daten vor dem Absenden überprüfen

Hallo,

ich will mir ein Kontaktformular bauen, bei dem man die eingegeben Daten vor dem Abschicken überprüfen soll. Weiß zufällig jemand ob Spam-Bots zweimal klicken werden?

Ich hänge an der Übernahme der Daten. Ausgegeben werden sie, nur die Mail ist leer. Wie bekomme ich die Daten in die Mail? Kann mir da bitte jemand helfen?

Soweit bin ich gekommen:
PHP-Code:
<form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post" >
  Name:

  <input type="text" name="name">

  Betreff:

  <input type="text" name="betreff">

  E-Mail:

  <input type="text" name="email">

  Nachricht:

  <textarea name="nachricht"></textarea>

  <input type="submit" name="vorschau" value="Vorschau">
</form>

<?php
if ( $_POST["vorschau"] == Vorschau ) { ?>

  Sie haben folgendes eingegeben:

  Name: <?php echo $name ?>

  Betreff: <?php echo $betreff ?>

  E-Mail: <?php echo $email ?>

  Nachricht: <?php echo $nachricht ?>

  <form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post" >
    <input type="submit" name="abschicken" value="Abschicken">
  </form>

<?php }
if ( 
$_POST["abschicken"] == Abschicken ) {
  
mail("email@domain.de"$betreff$nachricht"From: $name <$email>");
  echo 
"Die Nachricht wurde verschickt!";
?>
tayke ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 17.07.2007, 21:33  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Sieht nach einem alten Script aus, $name etc. exestieren nur bei aktiviertem register_globals,
wobei dies möglichst vermieden werden sollte.
Per $_POST["vorschau"] greifst du doch schon auf das Superglobale Array $_POST zu.
Warum nicht auch bei den anderen Feldern?
Das Post Array sammelt alle Eingaben und stellt sie über den im "name"
Attribut festgelegten Namen zur verfügung.
<input type="text" name="test" />
ist also per $_POST['test'] verfügbar.

Spambots "klicken" übrigens nicht, sondern durchsuchen den Quelltext nach type="submit".
Man kann also sagen, dass diese Methode nicht vor Spamattacken schützt.
phpdummi ist offline  
Alt 17.07.2007, 21:33  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo tayke,

du prüfst bei deinen Abfragen auch nicht auf einen String, sondern eine Konstante. Es muss zunächst

PHP-Code:
if ( $_POST['vorschau'] == 'Vorschau' ) { 
und

PHP-Code:
if ( $_POST['abschicken'] == 'Abschicken' ) { 
lauten. Ob das ein probates Mittel ist SPAM zu verbindern, glaube ich nicht, denn man muss infach nur die "zweite" Seite mit den entsprechenden Parametern aufrufen und das wars. Hier würde ich mit Sessions arbeiten, sprich beim Anzeigen des Formulars eine Session eröffnen und beim Abschicken fragen, ob diese da ist und entsprechende Sicherheits-Codes enthält.

Ein anderer Weg ist es, die Namen der Formularfelder generisch zu gestalten. Das bedeutet, dass du diese bei jedem Aufruf des Formulars neu vergibst, dann haben es Bots sehr schwer bis unmöglich, dein Formular automatisiert auszunutzen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 17.07.2007, 22:06  
Erfahrener Benutzer
 
Registriert seit: 14.04.2006
Beiträge: 111
tayke
Standard

Zitat:
Zitat von phpdummi
Sieht nach einem alten Script aus...
Das Skript ist von mir.

Zitat:
Zitat von phpdummi
... $name etc. exestieren nur bei aktiviertem register_globals,
wobei dies möglichst vermieden werden sollte.
Per $_POST["vorschau"] greifst du doch schon auf das Superglobale Array $_POST zu.
Warum nicht auch bei den anderen Feldern?
Das Post Array sammelt alle Eingaben und stellt sie über den im "name"
Attribut festgelegten Namen zur verfügung.
<input type="text" name="test" />
ist also per $_POST['test'] verfügbar.
Habs mal geändert... siehe unten.

Zitat:
Zitat von dr.e.
Hallo tayke,

du prüfst bei deinen Abfragen auch nicht auf einen String, sondern eine Konstante. Es muss zunächst

PHP-Code:
if ( $_POST['vorschau'] == 'Vorschau' ) { 
und

PHP-Code:
if ( $_POST['abschicken'] == 'Abschicken' ) { 
lauten.
Ebenfalls geändert. Soll man einfache Anführungszeichen verwenden? Hab da ja immer die Doppelten.

Das mit den Sessions hört sich gut an, nur wie kompliziert ist das?

PHP-Code:
<?php
if ( $_POST["vorschau"] == "Vorschau" ) { ?>

  Sie haben folgendes eingegeben:

  Name: <?php echo $_POST["name"]; ?>

  Betreff: <?php echo $_POST["betreff"]; ?>

  E-Mail: <?php echo $_POST["email"]; ?>

  Nachricht: <?php echo $_POST["nachricht"]; ?>

  <form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post" >
    <input type="submit" name="abschicken" value="Abschicken">
  </form>

<?php }
if ( 
$_POST["abschicken"] == "Abschicken" ) {
  
mail("email@domain.de"$betreff$nachricht"From: $name <$email>");  
  echo 
"Die Nachricht wurde verschickt!";
?>
Wie muss das denn dann bei mail() aussehen mit dem POST?
tayke ist offline  
Alt 17.07.2007, 22:14  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also erstma stecken nach wie vir noch 2 kleine Fehlerchen drinn:
PHP-Code:
mail("email@domain.de"$betreff$nachricht"From: $name <$email>"); 
muss ebenfalls "$_POSTalisiert" werden (herrlich?! )
PHP-Code:
mail("email@domain.de"$_POST['betreff'], $nachricht"From: $_POST['name'] <$_POST['email']>"); 
Dieses Script läuft aber nur sicher wenn du der Einzige bist, der darüber Emails
verschickt. Benutzerdaten sollten nämlich NIEMALS direkt, also ungefiltert, übernommen
werden. Weiteres zu Datenfilterung, Sicherheit etc. findet sich aber hier im Forum
und per Yahoo (und Google natürlich :wink.
phpdummi ist offline  
Alt 17.07.2007, 22:32  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Vielleicht solltest Du den Zweck schildern, dem das Script dienen soll. Wie hier schon gesagt, gibt es mehrere sicherheitsrelevante Probleme, z.B.
- Email-Injection: bei direkter Übernahme von POST Daten können mit Zeilenumbrüchen weitere Headerangaben 'gefälscht'/eingeschleust werden, z.B. durch die Erweiterung der Daten in $_POST['name'] oder $_POST['email']
- Cross Site Scripting: durch direkte Ausgabe der POST Daten können beliebige Javascripts und Html Daten ausgegeben und bspw. genutzt werden, um Cookiedaten o.ä. auszulesen.
- natürlich läßt sich auch die eigene Absenderadresse des Eingebenden fälschen
nikosch ist gerade online  
Alt 17.07.2007, 22:36  
Erfahrener Benutzer
 
Registriert seit: 14.04.2006
Beiträge: 111
tayke
Standard

Zitat:
Zitat von phpdummi
PHP-Code:
mail("email@domain.de"$_POST['betreff'], $nachricht"From: $_POST['name'] <$_POST['email']>"); 
Damit bekomme ich nen Fehler. $nachricht auch muss auch "$_POSTalisiert" werden, oder?
So kommt kein Fehler, Mail aber weiterhin leer:
PHP-Code:
mail("email@domain.de"$_POST['betreff'], $_POST['nachricht'], "From: ".$_POST['name']." <".$_POST['email'].">"); 
Zitat:
Zitat von phpdummi
Dieses Script läuft aber nur sicher wenn du der Einzige bist, der darüber Emails
verschickt. Benutzerdaten sollten nämlich NIEMALS direkt, also ungefiltert, übernommen
werden. Weiteres zu Datenfilterung, Sicherheit etc. findet sich aber hier im Forum
und per Yahoo (und Google natürlich :wink.
Kannst du mir das bitte näher erklären? Das Formular benutze natürlich nicht nur ich.
tayke ist offline  
Alt 17.07.2007, 22:39  
Erfahrener Benutzer
 
Registriert seit: 14.04.2006
Beiträge: 111
tayke
Standard

Hallo,

Zitat:
Zitat von nikosch77
Vielleicht solltest Du den Zweck schildern, dem das Script dienen soll.
Soll ein öffentliches Kontaktformular für eine Seite werden.

Zitat:
Zitat von nikosch77
Wie hier schon gesagt, gibt es mehrere sicherheitsrelevante Probleme, z.B.
- Email-Injection: bei direkter Übernahme von POST Daten können mit Zeilenumbrüchen weitere Headerangaben 'gefälscht'/eingeschleust werden, z.B. durch die Erweiterung der Daten in $_POST['name'] oder $_POST['email']
- Cross Site Scripting: durch direkte Ausgabe der POST Daten können beliebige Javascripts und Html Daten ausgegeben und bspw. genutzt werden, um Cookiedaten o.ä. auszulesen.
- natürlich läßt sich auch die eigene Absenderadresse des Eingebenden fälschen
Das hört sich alles nicht gut an und noch besser, ich hab davon keine Ahnung. Gibt es vielleicht ein Tutorial, bei dem diese Sachen erklärt werden und ich ein Formular erstellen kann?
tayke ist offline  
Alt 17.07.2007, 22:59  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Grundsätzliches zu Formularen:
http://tut.php-q.net/formulare.html

Der Sicherheitsaspekt ist ein sehr umfangreiches Thema, das aber schon oft
besprochen wurde. Such einfach mal im Internet nach "validieren" von Eingaben.
Auch hier im Forum wurde schon darüber gesprochen, benutz einfach mal die
Forum-Suche.
phpdummi ist offline  
Alt 17.07.2007, 23:01  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Das ist schon ein kleines Stück Arbeit. Vielleicht kannst Du mit dem 'Affenformular' anfangen (mit register_globals off und Basisvalidierung), Dich in das Thema Sessions einlesen (wohl unverzichtbar für die Captcha Funktionalität) und Dich dann den Sicherheitproblematiken widmen. Bei letzteren macht es bereits viel aus, das Prinzip zu verstehen, Gegenmaßnahmen sind oftmals gar nicht so kompliziert umzusetzen.
Auch das PHP Manual bietet unter dem Kapitel Sicherheit bereits einen kleinen Einstieg in die Problematik.

Buch zum Einstieg: Kunz/Prochaska - PHP Sicherheit (Probekapitel)
einige Infos zu Email Injection
einige Infos zu XSS
Zu den genannten Angriffsarten läßt sich via Google jede Menge Material finden, auch Tutorials. Nicht zuletzt die Boardsuche hier.
nikosch ist gerade online  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Formular absenden, Query, Daten mitsenden tinchen PHP Tipps 2007 9 01.06.2007 21:04
Mehrere Arrays unterschiedlicher Größe kombinieren querfisch PHP Tipps 2007 9 31.03.2007 21:34
Mehrfaches absenden durch Browserrefresh verhindern HalliGalli PHP Tipps 2006 11 16.05.2006 15:01
Session Frage - gleiches Formular 2 mal alle Daten behalten NetLook PHP Tipps 2007 1 21.11.2005 18:42
[Erledigt] sql daten für einen kunden auslesen/ändern im Formular PHP Tipps 2005-2 3 12.10.2005 08:36
Daten auslesen und ändern Datenbanken 2 17.09.2005 19:28
Daten eintragen und auslesen Rettungsdackel Datenbanken 0 14.09.2005 16:29
Daten in Datenbank ändern PHP Tipps 2005 3 27.01.2005 14:40
array_push nur in begrenzter Anzahl ausführen ? PHP Tipps 2004 2 07.09.2004 09:05

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
kontaktformular überprüfen, kontaktformular mit überprüfung, http://www.php.de/php-tipps-2007/44376-kontaktformular-daten-vor-dem-absenden-ueberpruefen.html, kontaktformular prüfen, kontaktformular prüfen php, kontaktformular mit überprüfung der eingabe, kontaktformular überprüfen php, kontaktformular mit email überprüfung, kontaktformular überprüfung, formmailer mit überprüfung, php formular prüfen vor submit, php kontaktformular überprüfen, php kontaktformular string prüfen, php kontaktformular prüfen, kontaktformular mit prüfung, kontaktformular vor eintrag in datenbank prüfen, prüfen kontaktformular, überprüfung kontaktformular, php formular bevor post fehler abfangen, kontaktformular eingabe überprüfen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.