[PHP] variable Variablennamen bei POST

Hinweis: Dies ist sicherheitstechnisch eine sehr bedenkliche Vorgehensweise und sollte auch nicht (vor allem im Produktivsystem) eingesetzt werden!
Ich hatte das leidige Thema aus einem Formular alle POST-Variablen in verwendbare Variablen umzuspeichern:

 $rechnernummer = $_POST['rechnernummer'];
 $monitor_nr = $_POST['monitor_nr'];
 $externe_ip = $_POST['externe_ip'];
 $ipnummer = $_POST['ipnummer'];
 $zertifikat = $_POST['zertifikat'];
 $passwort = $_POST['passwort'];
 $macadresse = $_POST['macadresse'];
 $orts_id = $_POST['orts_id'];
 $verwendungs_id = $_POST['verwendungs_id'];
 $bereichs_id = $_POST['bereichs_id'];
 $seriennummer = $_POST['seriennummer'];
 $bemerkung = $_POST['bemerkung'];

Dies ist natürlich alles andere als dynamisch und sparsamer Code.
Daher habe ich mich nach einer besseren Alternative umgeschaut und bin dabei auf folgendes gestoßen:

foreach($_POST as $k=>$v) $$k=$v;

Dieser Einzeiler macht genau das, was ich gesucht habe.

Hinweis: Aus Sicherheitsgründen ist es ratsam, dass alles, was per POST verschickt wird, erst validiert werden sollte, bevor ihr es blind (wie in meinem Beispiel) weiterverwendet.

Veröffentlicht in PHP. Schlagwörter: , , . 14 Comments »

14 Antworten to “[PHP] variable Variablennamen bei POST”

  1. Daniel Says:

    Diese Lösung gefällt mir absolut nicht. Deine alte Lösung fand ich besser. In der foreach-Lösung würden die Variablennamen und Daten ungefiltert übernommen.

    Siehe auch:

    http://www.cms-sicherheit.de/module-blog-viewpub-tid-1-pid-10.html

    Variable Variablennamen verschlechtern ein Programm im allgemeinen, da es an Wartbarkeit verliert und gerade die Variablennamen für außenstehende nicht auf einen Blick erkennbar sind. Was Du an Code-Zeilen einsparst, müsstest Du an Kommentaren zum entsprechenden Code wieder mit einfügen. Folgende Lösung wäre auch denkbar:

    http://nopaste.us/2367.html

    Ich würde jedoch bei Deiner ersten Lösung bleiben. Ist übersichtlicher. Schöner und übersichtlicher wirds, wenn Du die Einrückungen entsprechend machst:

    http://nopaste.us/2368.html

  2. maTTes Says:

    Ich verstehe dich voll und ganz.
    Soweit es aussieht, bleibe ich der einzige Entwickler bei dem Projekt. Außerdem ist es Firmen-Intern, da kann auch kein Unfug getrieben werden ;)

    Aber danke für deine Hinweise!

  3. tscheckenbach Says:

    Nimm doch einfach extract().

  4. Daniel Says:

    Damit hast du quasi „register_globals“ nachgebaut, und es gab einen Grund, warum das abgeschafft wurde.

    Mit der PHP-Funktion „extract“ hättest das das sogar noch einfacher und eleganter haben können.

  5. Fabian Says:

    Was du suchst ist die wenig beachtete PHP-Funktion extract. extract($_POST) macht genau das was man von register_globals her kennt. Was natürlich nichts daran ändert dass es eine ganz schön unsaubere und unsichere Praxis ist ;-)

    http://de.php.net/extract

  6. maTTes Says:

    Ah danke, die Funktion kannte ich noch nicht.

    Ich verstehe nur nicht, was daran so unsicher sein soll bzw. was gefährlich ist.

  7. Fabian Says:

    stell dir vor, du vergisst irgendwo eine variable zu initialisieren, zb ein leeres array. Willst du dass sie dann jeder via post oder get nach lust und laune befüllen kann? Dazu kommt dass die werte, die du haben willst vor weiterverarbeitung ohnehin validiert werden sollten, um sql injection und andere gemeinheiten zu verhindern. Don’t trust any user input ist ein grundsatz der einfach niemals vernachlässigt werden darf.

  8. Sven Says:

    Mit diesem Beitrag disqualifiziert du dich als „Tutorial-Blog“. Und weil eine Lösung nur Intern verwendet wird, wie du ja schreibst, muss sie doch nicht schlecht geschrieben werden?

  9. maTTes Says:

    Ok, danke Jungs. :-)
    Ich werde einen entsprechenden Hinweis in dem Beitrag oben ergänzen.

  10. Sascha Presnac Says:

    Sowas sollte aus jedem Code sofort gestrichen werden, den Mensch sieht und der verantwortliche Entwickler sollte zumindest an den Pranger.
    Wenn es nicht einen wirklich, wirklich (!), _wirklich_ wichtigen (!!!) Grund gibt, sowas einmal (!) einzusetzen, dann sollte Mensch es nicht machen, da es ganz böse Sicherheitsprobleme geben kann (und wird, wenn es einer weiß).
    Du kannst mit so einem Konstrukt einfach per POST alle Variablen übergeben und dein Code würde diese auch gültig auswerten.
    Bei so einem Konstrukt musst du erst noch prüfen, ob nur alle POST-Daten ankommen, die auch erlaubt sind und keine mehr. Du kommst also um eine Prüfung nicht rum.
    Jemand, der so einen Code ernsthaft in ein Produktivsystem schreibt, gehört gefeuert und öffentlich angeprangert. Der sollte sich wirklich überlegen, ob Programmierung für ihn wirklich in Frage kommt. Sorry, aber das ist so ein Brandgefährliches Thema, da kann man gar nicht genug vor warnen.
    Kids: Don’t try this at home!!!

  11. maTTes Says:

    Hallo Sascha, auch dir danke für deine Meinung. Ich belasse den Artikel trotzdem hier im Blog und habe bereits einen Sicherheitshinweis hinzugefügt.

  12. SkaveRat Says:

    Mal schauen wann ich die ersten gotos in einem Produktivsystem sehe, weil tolle Tutorials es als schnellen fix ansehen….

    http://de.php.net/goto

    man beachte den beigelegten Comic

  13. Clemens Says:

    Warum nicht in die Schleife wenigsten noch ein simples mysql_real_escape_string() einbauen?

    Das wär keine vollständige Prüfung auf korrekte Daten, aber immerhin etwas mehr Sicherheit.

    Grüße

  14. Nico Schubert Says:

    Hallo Clemens,

    mysql_real_escape_string() geht nur, wenn Du ein Mysql Verbindung offen hast. Sonst bekommst Du eine Warnung. Ich würde htmlspecialchars() verwenden und vorher strip_tags() zum entfernen der HTML Zeichen. Danach hast Du alle Sonderzeichen in Html Code. Wenn Du die Daten in einer Mysql Datenbank speichern möchtest, dann musst Du natürlich mysql_real_escape_string() verwenden.

    Mal zu den Beispiel von maTTes, sowas würde ich nur für Scripte verwenden, wenn sicher gestellt werden kann, das keine Manipulation von aussen vorkommt.

    Grüße Nico


Hinterlasse eine Antwort zu maTTes Antwort abbrechen