PHP-Einführung

  • PHP-Einleitung

    1) Unterschiede zwischen PHP und C

    In PHP werden keine Variablen initialisiert, wenn man eine braucht, benutzt man sie einfach.
    Es gibt auch keine Variablentypen, jedenfalls muss sich der Programmierer nicht darum kümmern.
    Intern hat natürlich jede Variable ihren Typ, je nachdem, was in ihr steht.
    Auch sind Typumwandlungen möglich, aus einer Integer kann man leicht einen String machen.

    Beispiele:

    PHP
    $int = 123;            //Integer
    $str = "123";          //String
    $int = (string) $int;  //Jetzt ist $int auch ein String
    $tstr = $str[0];       //Gib mir den ersten Buchstaben von $str


    Siehe auch: http://www.php.net/manual/de/language.variables.php

    Funktionen sehen in PHP recht ähnlich aus wie in C, mit dem Unterschied, das sie keinen Rückgabetyp
    haben. Warum auch, ist ja egal, was in der Variable steht. ;)

    Beispiel:

    PHP
    function machwas($bla)
    {
      if (is_int($bla))  //Wenn $bla ein Integer ist
        $bla++;          //erhöhe $bla um 1 
      
      return $bla;       //Und gib $bla zurück
    }


    Siehe auch: http://www.php.net/manual/de/functions.php

    Es gibt in PHP keine Zeiger. Aber Referenzen.
    Die sind in PHP aber etwas anderes als in C.
    Eine Referenz ist eine Art Alias für einen Variableninhalt.
    Ein Inhalt kann also mehrere Namen haben, die dann gleichberechtigt nebeneinander stehen.

    Beispiel:


    Siehe auch: http://www.php.net/manual/de/language.references.php


    Nun ja, das eine PHP-Datei mit <?php eingeleitet wird und mit ?> aufhört, weiß man inzwischen, oder? ;)


    2) Erste Anfänge

    Fangen wir daher mit den interessanten Sachen an:

    Ich will ja nicht nur Zeit und Datum ausgeben lassen (das haben wir ja schonmal gemacht), sondern vielleicht auch
    auf das reagieren, was der User so macht. Ich will also Daten von "außen" übernehmen.
    Jeder kennt HTML-Formulare, hier im Forum sind sie ja überall.

    PHP
    <form action="test.php" method="post">                       //Das Formular selber, nach dem Absenden werden die Daten an die Datei test.php gesendet                             
      <input type="text" name="test" value="">                   //Ein einzeiliges Eingabefeld mit Namen test
      <textarea name="message" rows="20" cols="80"></textarea>   //Ein mehrzeiliges Eingabefeld (Textbereich) mit Namen message (rows und cols geben die Größe an)
      <input type="input" type="submit" value="Absenden">        //Der Absendebutton
    </form>


    Wir haben also ein HTML-Formular mit einem Eingabefeld und einem Textbereich, das an unsere Datei test.php gesendet wird und zwar via der POST-Methode.
    Es gibt zwei Methoden, Daten an PHP zu übertragen, POST und GET. Bei GET sind die Variablen in der URL zu sehen, siehe Forum, das nach dem ? sind Variablen.
    POST wird "unsichtbar" gesendet.
    Für diese beiden Methoden gibt es in PHP sogenannte superglobale Variablen, die überall gültig sind (wie globale Variablen in C, mit dem Unterschied, das superglobale
    Variablen auch in anderen Klassen gelten).
    Für unseren Fall benötigen wir die superglobale Variable $_POST.
    Geben wir also die Eingaben des Users aus:

    PHP
    <?php
    echo "Sie haben in das Eingabefeld folgendes eingegeben: ";
    echo $_POST["test"];
    echo "<br>";
    echo "Sie haben in das Textfeld folgendes eingegeben: ";
    echo $_POST["message"];
    ?>


    Mit GET geht es genauso.
    Es gibt auch noch $_COOKIE für Daten, die von einem Cookie übertragen wurden.
    $_FILES ist für den Upload von Dateien gedacht.
    $_SERVER liefert Daten über die Laufzeitumgebung und anderes, wird durch den Webserver (normalerweise Apache) generiert und ist daher recht vertrauenswürdig.
    In $_SERVER['REMOTE_ADDR'] steht z.B. die IP-Adresse des Hosts, der die Seite gerade aufgerufen hat.
    $_SESSION speichert Sessiondaten, doch dazu später mehr.
    Es gibt noch andere superglobale Variablen, die aber nicht so wichtig sind.

    Siehe auch: http://www.php.net/manual/de/lang….predefined.php


    3) Sicherheit in PHP
    PHP ist unsicher.
    Daher ist oberstes Gebot: Traue niemandem. Validiere allen Input oder stirb.
    Wer das nicht macht kann sich gleich einsargen lassen und sollte niemals ernsthaft PHP coden!

    3.1) Globals
    Es gibt in PHP die Möglichkeit, das fremde Variablen (eben die von außen) automatisch erstellt werden und dann eben nicht
    mit $_POST angesprochen werden müssen. Wenn Globals ON sind (was sie bei neueren PHP-Versionen nicht sein sollten!) hast du
    schon deine erste Sicherheitslücke. Denn dann kann JEDE Variable, die nicht initialisiert wird, manipuliert werden!
    z.B:

    PHP
    if ($_POST['pwd'] == "geheim")
      $login = true;
    
    
    if ($login == true)
    {
      //Code
    }


    Da $login nicht vorher initialisiert wird, kann jetzt ein Angreifer einfach die Datei so aufrufen:
    login.php?login=true
    Und schon ist er drin, ohne das er das Passwort kannte!
    Der obige Code ist also Schrott!
    Wie gehts richtig?

    PHP
    $login = false;
    if ($_POST['pwd'] == "geheim")
      $login = true;
      
    if ($login == true)
    {
      //Code
    }


    Jede Variable sollte vorher mit einem Startwert versehen werden, bzw. irgendwie initialisiert.
    Ein Array kann z.B. mit $var = array(); erstellt werden.
    Auch wenn Globals OFF sind, sollte man so verfahren. Es ist einfach besser und sicherer.

    3.2) Prüfe jede Variable die von außen kommt!
    Warum? Ganz einfach, wenn du eine Integer erwartest, es kommt aber ein String, kann das sehr leicht
    zu seltsamen Reaktionen führen. Besonders wenn du mit SQL und Datenbanken arbeitest, ist es unvermeidlich,
    das du alles gegencheckst, was du verarbeitest.
    Dazu gibt es einige Funktionen, die findest du unter: http://www.php.net/manual/de/ref.variables.php
    Wenn du eine Integer erwartest, dann prüfe mit is_int() obs auch eine ist.
    Und wenn du eine Integer aus einem gewissen Bereich erwartest, so prüfe das ebenfalls!
    if ($int >= 0 && $int <=10) Prüft, ob $int zwischen 0 und 10 liegt.
    Prüfe oder stirb.

    3.3) SQL-Injection
    Auch wenn es heute schon einige nette Automatismen gibt, die da für einige Sicherheit sorgen, so muss man immer
    auch selber für Sicherheit sorgen, denn es kann niemand sagen, wo die eigenen Skripte mal laufen werden. Nicht
    überall ist sowas wie MagicQuotes aktiviert.
    Was ist eine SQL-Injection eigentlich?
    Recht einfach, durch SQL-Injection werden fremde SQL-Anweisungen von außen in die DB geschleust. Nichts, was man
    wirklich will, denn wer sowas tut, macht es meist aus unfreundlichen Gründen!
    Beispiel:
    $id = $_POST['id'];
    $query = "SELECT id, name FROM products WHERE id = $id;";
    $result = mysql_query($query);
    Wenn jetzt jemand $_POST['id'] manipulieren kann, dann schreibt er dort z.B. folgendes hinein:
    0;
    UPDATE user SET Password='crack' WHERE user='admin';
    FLUSH PRIVILEGES;
    So das die Abfrage wie folgend aussehen würde:
    $query = "SELECT id, name FROM products WHERE id = 0; UPDATE user SET Password='crack' WHERE user='admin';";
    Es werden also zwei Abfragen ausgeführt, einmal die, die man haben will und dann die, die man nicht haben will.
    Denn jetzt hat der Angreifer Zugriff auf den Admin-Account und man selber ist ausgesperrt!
    Nun, wie verhindert man das?
    Recht simpel, man muss alle Zeichen, mit denen ein Angriff erfolgen kann escapen.
    Dazu gibt es eine Funktion namens mysql_escape_string() für MySQL (siehe http://www.php.net/manual/de/func…cape-string.php)
    oder auch eine Standardfunktion namens addslashes(), die dies erledigen.
    Wenn man sich so absichert und zusätzlich jede Variable prüft, ob da auch das drin ist, was drin sein soll, ist man ein gutes Stück weiter auf dem
    Weg zum sicheren Script.

    Das soll jetzt erstmal reichen.
    Wenns Fragen gibt, so stellt sie bitte.

    Interessante Links:
    http://www.php-faq.de/
    http://www.php.net/manual/de/

  • Das ist nur die Grundlage und selbst als solche noch arg knapp! ;)
    Und die Sachen zur Sicherheit gelten eigentlich für alle Programmiersprachen.
    Bei den MFCs wird das ja teilweise durch die MFCs für uns erledigt, daher haben wir das im Unterricht nicht behandelt und mit Datenbanken haben wir ja auch nicht so intensiv gearbeitet. ;)
    Ich möchte jetzt halt schnell die graue Theorie erledigen, um dann schnell zum coden zu kommen.
    Ich erwarte jetzt nur noch Rücklauf, Fragen, etc. zu dem obigen Text, damit wir loslegen können.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!