[PHP] In PHP-Datei E-Mail-Adresse speichern und je nach GET-Parameter versenden

HanZ

Aktiver NGBler
Registriert
16 Juli 2013
Beiträge
997
Hallo,

ich bin mit PHP nicht 100% konform, daher habe ich eine Frage. Ich habe eine Webseite mit einem Kontaktformular. Dieses Kontaktformular soll je nach GET-Parameter an unterschiedliche E-Mails versendet werden. Da ich nicht möchte, dass man diese E-Mails öffentlich sieht, dachte ich an folgendes Konzept:

URL-Aufruf:
xyz.de/contact.php?mail=12345

In der contact.php sind jetzt einmal die E-Mail-Adressen hinterlegt. Je nach value von mail wird eine andere E-Mail genommen und als Empfänger genommen.
Bei Python hätte ich jetzt einfach ein Dictionary genommen (Achtung, hier steht jetzt PHP/Python Mischmasch)

[src=python]mails = {'12345' : 'test@bla.de', '56789' : 'another@email.de'}[/src]

und dann
Code:
Expand Collapse Copy
mail_empfaenger = mails[$_GET['mail']]

Dann hätte mail_empfaenger den wert test@bla.de ohne die E-Mail zu veröffentlichen.

Ist das generell unproblematisch, die E-Mails in der contact.php-Datei zu speichern? Oder gibt es hier andere Lösungen?

Ist die Idee mit dem Dictionary überhaupt in PHP umsetzbar? Andere Möglichkeiten? Die gesamte Idee scheiße? Direkt in die contact.php oder ne eigene PHP "mails.php"? Dann bei contact.php irgendwie Include? Und bei mails.php dann irgendwie Zugriff verweigern?

LG
HanZ
 
Das geht, aber einen numerischen Index sollte man eher so definieren:
[src=php]$mails[0] = "0e@ma.il";
$mails[1] = "1e@ma.il";
...[/src]

folgendes geht auch:
[src=php]$mails["null"] = "0e@ma.il";
$mails["eins"] = "1e@ma.il";
...[/src]

Gibt halt keine strikte Typisierung. ist und bleibt eine zweischneidige Angelegenheit.

Das sollte auch gleich so funktionieren wie ich deinen Post verstehe. Also von der Abruftechnik her.
 
Zuletzt bearbeitet:
Also wenns nur ein mini-Projekt ist würde ich ein Switch-case schreiben, und da den Formularwert durchswitchen mit default value für ungültige Eingaben, etc.

Aber ja, du kannst auch zb ein json File erstellen, dort alle E-Mails abspeichern, das mit php jedesmal auslesen und ähnlich wie ein dictonary nutzen. Oder eben das Array direkt der PHP File definieren.

Eingabe cleanen wäre vermutlich auch gut, kommt eben darauf an, was erlaubt ist im Kontaktfeld.
 
Das wäre vermutlich die sauberste Lösung, zumindest aus Sicht "Prüfung der Usereingaben". Meine erste Antwort entspricht eher der nächsten Übersetzung.
 
  • Thread Starter Thread Starter
  • #5
Korrekt, nennt sich bei PHP assoziatives Array. Etwas das einem Dictionary näher kommt wirst du bei PHP nicht finden.
 
Kürzere Array Syntax (mit => und Kommas )
[src=php]$mails = [
'support' => 'lvl1support@service.domain',
'techguy' => 'lvl2support@service.domain',
'business' => 'sales@service.domain',
];

if (isset($mails[$_GET['mail']]) {
$receiver = $mails[$_GET['mail']];
} else {
// client sent an unknown value. Could be a bug or an attack[/src]
Einfache Anführungszeichen: " und ' unterscheiden sich und wenn du " nicht brauchst, dann nimm '

du kannst auch zb ein json File erstellen, dort alle E-Mails abspeichern, das mit php jedesmal auslesen
Trennung Konfiguration und Code finde ich toll.
Konfig in JSON ist aber nur sinnvoll, wenn man sie woanders auch verwendet, z.B. mit einer GUI editiert.

Aber in einem kleinen PHP Projekt?

config/mail.php
[src=php]<?php return [
'receivers' => [
'support' => 'lvl1support@service.domain',
'technik' => 'lvl1support@service.domain',
'business' => 'sales@service.domain',
],
'otherStuff' => [ ]
];[/src]

logic.php
[src=php]<?php
$config = require 'config/mail.php';

$input = $_GET['mail'];

if (isset($config['receivers'][$input]) {[/src]

Ja das requiren wird hässlich, wenn Projekte größer werden, aber wenn Projekte größer werden wirft man auch mehr Boilerplate drauf ;-)

Was genau meinst du [mit Eingaben cleanen]?
Validate on Input, Escape on Output.

Validation z.B. durch Abgleich einer Liste der erlaubten Werten, siehe else Zweig im Code oben.

Kontextsensitives Escaping bedeutet den String umzuschreiben, damit Steuerzeichen des Kontextes, in den er gerendert wird, auf dessen Art "escaped" sind und daher nicht als Code interpretiert werden, wenn später der Interpreter jenes Kontextes (z.B. ein Browser oder ein E-Mail-Client oder eine Datenbanke) diese verarbeitet.

Einige Leute "Sanitizen" dazwischen noch, d.h. sie streichen alles aus dem String, was ihnen nicht gefällt und behalten nur den Rest als Eingabewert (der immer noch kontextsensitiv escaped werden muss, da man beim Sanitizen den Kontext nicht kennt).

Beispiel: Meine Input enthält HTML-Tags: <span color=green>Das NGB streicht mir den Tag nicht weg, dein Browser wertet es aber auch nicht aus, der Text wurde escaped</span>
 
  • Thread Starter Thread Starter
  • #8
Danke, das grobe Gerüst steht und funktioniert soweit. Morgen gehts erstmal in Urlaub, danach guck ich mir das nochmal genauer an mit dem cleanen.
 
Man sollte NIE ein HTTP GET Request wichtige Daten wie Email und PWs uerbermitteln. GET wird mit der Antwort uebertragen und kann auch schnell trotz einfacher base64 oder md5 etc. Verschluesselung abgegriffen werden. Ich wuerde es als POST definieren. POST uebermittel nicht per Header sondern als inhalt der Message auf welche man schwirieger zugreifen kann. Erlaube allg. nur bestimmte HTTP request Parameter und erstelle nicht unabsichtlich einen HTTP proxy. Aber bitte die POST stark beschraenken und reglementieren. Sonst laden man dir so viel Schrott hoch.

Absolut wichtig ist, das du die die php dateien entsprechend configurierst und davor schuetzt, dass unautoresierte user .php files mittels url testingen finden und manipulieren koennen. Du solltest auch die cookies filtern und jede input moeglichkeit fuer user mit entsprechender filtern ausrueusten und festhalten, dass keine .php dateien oder andere heraufgeladen werden koennen und mit unvorsichtig gestallteten Rechten auf deinem Server ausgefuehrt werden koennen.

und bitte... hide und filtere deine urls vor bestimmten Eingaben und .dateien wie urlpaths mit .php?iwasCMD=<angriff> vor injection Angriffen. Das ist einfach so der klassiker, den man wirklich vermeiden kann und der wird mal schnell trollige Eigenschaften in kurzer Zeit annehmen.
 
Zurück
Oben