Benjamin Kühn: PHP und MySQL sicher programmieren

N'Abend,

die Grundkenntnisse von PHP und MySQL habe ich mir in letzter Zeit einigermaßen angeeignet.

Nun möchte ich natürlich auch möglichst sauber und vor allem auch sicher programmieren. Man liest hier und da, dass Eingaben immer überprüft werden sollten, jedoch weiß ich nicht wirklich, wie ich das machen soll. Habt ihr vielleicht Links zu Artikeln o.ä. die sich mit dem Thema Sicherheit und Sauberkeit von PHP und MySQL-Abfragen beschäftigen?

Ich habe bereits bei Google geschaut, aber wirklich etwas gefunden habe ich da auch nicht.

Danke für eure Mühe und viele Grüße,
Ben

  1. Hallo Benjamin.

    Habt ihr vielleicht Links zu Artikeln o.ä. die sich mit dem Thema Sicherheit und Sauberkeit von PHP und MySQL-Abfragen beschäftigen?

    Meiner Meinung nach eine gute Ausgangslage ist http://de.php.net/manual/de/security.database.php.

    Ich habe bereits bei Google geschaut, aber wirklich etwas gefunden habe ich da auch nicht.

    Du bist sicher, dass du brauchbare Suchbegriffe verwendet hast?

    Gruß, Ashura

    --
    Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Day 19: Notes
    Meine Browser: Opera 8.0 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
    [Deshalb frei! - Argumente pro freie Software]
    1. Hi Ashura,

      Meiner Meinung nach eine gute Ausgangslage ist http://de.php.net/manual/de/security.database.php.

      Da hast du recht, das sieht mir schonmal sehr gut aus... Man muss nur wissen, wo mach nachschauen muss...

      Du bist sicher, dass du brauchbare Suchbegriffe verwendet hast?

      Anscheinend nicht. Auch googeln will gelernt sein... Nunja, jedenfalls vielen lieben Dank :)

      Grüße,
      Ben

  2. Hallo!

    Nun möchte ich natürlich auch möglichst sauber und vor allem auch sicher programmieren. Man liest hier und da, dass Eingaben immer überprüft werden sollten, jedoch weiß ich nicht wirklich, wie ich das machen soll.

    Das fällt mir als erstes das Thema SQL-Injektion ein.

    Mal ein simples Beispiel:

    function is_pos_id($id=0) {
       if(preg_match('/[1][0-9]*$/', $id)) {
          return true;
       }
       return false;
    }

    if(is_pos_id($_GET['id'])) {
      $sql = "SELECT spalten FROM tabelle WHERE id=" . $_GET['id'];
      .
      .
      .
    }

    André Laugks

    --
    Die Frau geht, die Hilti bleibt!

    1. 1-9 ↩︎

    1. Hi André,

      Das fällt mir als erstes das Thema SQL-Injektion ein.

      Genau, das war eins der Stichworte, das ich suchte, danke.

      Grüße,
      Ben

    2. echo $begrüßung;

      Das fällt mir als erstes das Thema SQL-Injektion ein.

      Es muss nicht immer gleich das "böse" SQL-Injection herangezogen werden. Das simple Eingeben eines ' (z.B. in einem Namensfeld: O'Conner) ist noch keine SQL-Injection und erzeugt trotzdem einen Fehler, wenn es nicht maskiert wurde. Den Handbuch-Link zum Thema hat ja schon Ashura gepostet.

      function is_pos_id($id=0) {
         if(preg_match('/[1][0-9]*$/', $id)) {
            return true;
         }
         return false;
      }

      Diese Funktion erscheint mir recht überflüssig. Im Allgemeinen wird bei einer ID gern ein numerischer Spaltentyp verwendet. Es reicht ein is_numeric(). Ob da eine führende 0 oder sogar Nachkommastellen eingegeben wurden ist

      $sql = "SELECT spalten FROM tabelle WHERE id=" . $_GET['id'];

      bei dieser Art von Abfrage nicht relevant. Letzlich wird die Abfrage entweder nicht ausgeführt oder liefert eine leere Ergebnismenge. Da sehe ich kein Sicherheitsrisiko, abgesehen von der Möglichkeit, dass das Konzept nicht stimmen könnte, zu dem diese Abfrage gehört.

      echo "$verabschiedung $name";


      1. 1-9 ↩︎

      1. Hallo!

        Es muss nicht immer gleich das "böse" SQL-Injection herangezogen werden.

        Das war das, was mir zuerst eingefallen ist...

        Diese Funktion erscheint mir recht überflüssig. Im Allgemeinen wird bei einer ID gern ein numerischer Spaltentyp verwendet. Es reicht ein is_numeric().

        Klar, es geht auch mit is_numeric. Mir ist meine Funktion aber lieber.

        $sql = "SELECT spalten FROM tabelle WHERE id=" . $_GET['id'];

        Da sehe ich kein Sicherheitsrisiko, abgesehen von der Möglichkeit, dass das Konzept nicht stimmen könnte, zu dem diese Abfrage gehört.

        Das sollte ja auch nur ein einfaches Beispiel sein...

        André Laugks

        --
        Die Frau geht, die Hilti bleibt!
        1. echo $begrüßung;

          Es muss nicht immer gleich das "böse" SQL-Injection herangezogen werden.

          Das war das, was mir zuerst eingefallen ist...

          Jo, kein Wunder, das wird auch in diesem Zusammenhang immer gern als abschreckendes Beispiel herangezogen. So ein Einbruch macht mehr her als eine simple Fehlermeldung.
          Und dann denkt sich der geneigte Anfänger: "Ach, das wird mir schon nicht passieren" und fällt dann auch bei gutartigen Anwendungsfällen auf die Nase.

          echo "$verabschiedung $name";