T-Rex: Array Key exists

Moin,

hab da ein PHP Buch. PHP 5.1 um genau zu sein, ja ich weiß ist schon älter. In dem Buch steht das man bei einem Array immer prüfen sollte ob es den Key gibt. Ganz wichtig ist diese Prüfung, wenn man von außen Einfluss auf dieses Array hat, z.B. wenn man ein Formular wegschickt. PHP gibt (falls richtig eingestellt) in solchen Fällen auch eine Warnung aus, also wenn man auf einen nicht existierenden Key zugreifen möchte.

Die Frage ist einfach nur warum muss man darauf achten? Kann mir da bitte jemand ein Beispiel geben wie man sowas ausnutzen könnte?

if( trex_exists() )
{
Gruß
T-Rex
}

  1. Hi,

    hab da ein PHP Buch. PHP 5.1 um genau zu sein, ja ich weiß ist schon älter. In dem Buch steht das man bei einem Array immer prüfen sollte ob es den Key gibt. Ganz wichtig ist diese Prüfung, wenn man von außen Einfluss auf dieses Array hat, z.B. wenn man ein Formular wegschickt. PHP gibt (falls richtig eingestellt) in solchen Fällen auch eine Warnung aus, also wenn man auf einen nicht existierenden Key zugreifen möchte.

    Die Frage ist einfach nur warum muss man darauf achten? Kann mir da bitte jemand ein Beispiel geben wie man sowas ausnutzen könnte?

    nun, einer der Arrays, die man von "außen" (also seitens des Clients) beeinflussen kann, ist $_POST. Wenn du versuchst, auf z.B. $_POST['meinkey'] zuzugreifen, der Client diesen Schlüssel aber nicht übermittelt hat, dann gibt es, wie du bereits bemerkt hast, eine Notice.

    Nun ist es zunächst einmal so, dass in $_POST prinzipiell erstmal alles drinstehen kann. Du erwartest wahrscheinlich die Daten eines bestimmten Formulars, aber Requests kann jeder an jede URL stellen, dass muss nicht "von einem Formular" kommen. Wenn die Daten nicht komplett sind (also ein Feld nicht übermittelt wurde, was du aber erwartest), ist der Request des Clients fehlerhaft. Du willst diesen Fehler aber nicht ignorieren, sondern abfangen und dem Client einen Fehler bekannt geben. Und das überprüfst du z.B. mit (array_)key_exists. Die Notice hilft dir also dabei, potentielle Fehler besser zu finden.

    Um das ausnützen zu können, musst du aber noch andere Fehler machen. Diese resultieren daraus, dass du in einem Feld einen Wert erwartest, der nicht vorhanden ist, und dann mit dem erwarteten Wert arbeitest. Division durch Null (ein nicht vorhandenes Feld) wäre ein Beispiel, was mir so auf Anhieb einfiele, wo du am Ende grob falsche Ergebnisse bekommst.

    Bis die Tage,
    Matti

    1. nun, einer der Arrays, die man von "außen" (also seitens des Clients) beeinflussen kann, ist $_POST. Wenn du versuchst, auf z.B. $_POST['meinkey'] zuzugreifen, der Client diesen Schlüssel aber nicht übermittelt hat, dann gibt es, wie du bereits bemerkt hast, eine Notice.

      Nun ist es zunächst einmal so, dass in $_POST prinzipiell erstmal alles drinstehen kann. Du erwartest wahrscheinlich die Daten eines bestimmten Formulars, aber Requests kann jeder an jede URL stellen, dass muss nicht "von einem Formular" kommen. Wenn die Daten nicht komplett sind (also ein Feld nicht übermittelt wurde, was du aber erwartest), ist der Request des Clients fehlerhaft. Du willst diesen Fehler aber nicht ignorieren, sondern abfangen und dem Client einen Fehler bekannt geben. Und das überprüfst du z.B. mit (array_)key_exists. Die Notice hilft dir also dabei, potentielle Fehler besser zu finden.

      Um das ausnützen zu können, musst du aber noch andere Fehler machen. Diese resultieren daraus, dass du in einem Feld einen Wert erwartest, der nicht vorhanden ist, und dann mit dem erwarteten Wert arbeitest. Division durch Null (ein nicht vorhandenes Feld) wäre ein Beispiel, was mir so auf Anhieb einfiele, wo du am Ende grob falsche Ergebnisse bekommst.

      Wenn ein Key in $_POST nicht gesetzt ist, ich das nicht abprüfe und eine notice geworfen wird, kann man diese information gegen mich verwenden? Ist das System dann anfällig für Angriffe?

      Man könnte ja mittels "error_reporting(E_ALL ^ E_NOTICE);" alle notice Anweisungen einfach unterdrücken. Mal davon abgesehen dass dies kein guter Programmierstil ist, gibt es noch einen Grund dies nicht zu tun? Also Sicherheitstechnischer art?

      Gruß
      noch nicht befriedigt mit der Antwort
      T-Rex

      1. Hi,

        Wenn ein Key in $_POST nicht gesetzt ist, ich das nicht abprüfe und eine notice geworfen wird, kann man diese information gegen mich verwenden? Ist das System dann anfällig für Angriffe?

        Man könnte ja mittels "error_reporting(E_ALL ^ E_NOTICE);" alle notice Anweisungen einfach unterdrücken. Mal davon abgesehen dass dies kein guter Programmierstil ist, gibt es noch einen Grund dies nicht zu tun? Also Sicherheitstechnischer art?

        Von obskuren Rahmenbedingungen abgesehen (z.B. "Durch das Absetzen der Notice läuft die Festplatte voll") sollte man die Notice nicht ausnutzen können (zumindest fällt mir jetzt kein Weg ein, und wäre höchstwahrscheinlich auch eher ein Bug von PHP denn ein Bug bei dir).

        Bis die Tage,
        Matti

      2. Hallo,

        Wenn ein Key in $_POST nicht gesetzt ist, ich das nicht abprüfe und eine notice geworfen wird, kann man diese information gegen mich verwenden? Ist das System dann anfällig für Angriffe?

        nein, das einzige, was der Nutzer daraus erkennen kann, ist der Name eines POST-Parameters, den das Script erwartet. Den kann er aber ebensogut aus dem Formular entnehmen, mit dem das Script üblicherweise aufgerufen wird.

        So gesehen ist der einzige Nachteil, dass der Eindruck entsteht, der Programmierer hätte geschludert.

        Man könnte ja mittels "error_reporting(E_ALL ^ E_NOTICE);" alle notice Anweisungen einfach unterdrücken. Mal davon abgesehen dass dies kein guter Programmierstil ist, gibt es noch einen Grund dies nicht zu tun? Also Sicherheitstechnischer art?

        Nein. Okay, während der Entwicklung sollte man sich ruhig ALLE Messages anzeigen lassen, auch die Notices, weil sie auf mögliche Programmfehler hinweisen können. Immerhin weiß man als Programmierer beim Auftreten einer "not defined"-Notice, dass man eine mögliche Fehlerquelle übersehen hat.

        noch nicht befriedigt mit der Antwort

        Jetzt besser?

        So long,
         Martin

        --
        Wie kann es sein, dass ich von 100 Gramm Schokolade zwei Kilo zunehme?
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(