Referat über PHP (Ausarbeitung)

Vor ca. 2 Monaten habe ich bei mir in der Schule eine GFS (Gleichwertige Feststellung von Schülerleistungen) gehalten. Das ist eigentlich nur ein Referat mit einer schriftlichen Ausarbeitung. Soweit ich weiß, gibt es die GFS nur in Baden-Württemberg. Dort muss jeder Schüler in der Oberstufe (12+13. Klasse) 3 GFS in 3 unterschiedlichen Fächern halten.

Eines meiner Fächer war CT (Computertechnik) und als Thema hatte ich „Einführung in PHP“. Da keiner der anwesenden Schüler jemals mit PHP zu tun hatte, sondern immer nur mit C++, bestand die Schwierigkeit darin, Ihnen die Abläufe des Internets und die Aufgaben von PHP zu erläutern.

Es gab dazu immer wieder kleine Aufgaben. In diesem Artikel veröffentliche ich die Ausarbeitung des Referats. Sie umfasst 19 Seiten (ohne Deckblatt, Quellenangabe, Inhaltsverzeichnis sind es nur 16) und sollte für Anfänger verständlich geschrieben sein.

Ich schreibe diesen Artikel erst jetzt, weil ich nicht will, dass mein Lehrer denkt, ich hätte mein Referat von hier geklaut (obwohl es ja meins ist).

(Zum Download gehts ganz unten auf dieser Seite)

„Geil! Danke für das Referat“

Ich kann dir nur raten, mein Referat höchstens als Quelle zu benutzen. Wenn rauskommt, dass du hier alles kopiert hast, handelst du dir damit eine 6 ein. Sieh das als gutgemeinten Rat 😉

GFS von Simon – Einführung in PHP

Einführung in die Skriptsprache PHP

 

TGI 12/1

Inhaltsverzeichnis

Thema

Seite

1. Was ist PHP?

3-4

1.1 Einrichtung eines Webservers mit PHP

4

2. Geschichte von PHP

5

3. Zukunft von PHP

6

4. Unterschiede zwischen PHP und C(++)

7-8

5. Einführung in die Programmierung mit PHP

9

5.1 Die superglobalen Arrays

9-10

5.2 Formulare mit PHP verarbeiten

10-11

5.3 Sicherheitslücke durch register_globals

12

5.4 Dateien einbinden

13

5.5 Funktionen in PHP

13-14

5.6Die foreach-Schleife

15

5.7 Fehlermeldungen ein- und ausschalten

16

5.8 Festes Layout, variabler Inhalt

17-18

6. Quellenangabe

19

Was ist PHP?

PHP ist eine sehr bekannte und weit verbreitete Skriptsprache. Der Großteil aller Webanwendungen wird mit PHP realisiert. Es gibt allerdings auch Sonderversionen von PHP, die Skripts für lokale Rechner ermöglichen. Diese werden dann unabhängig vom Internet ausgeführt. Diese Möglichkeit ist jedoch sehr wenig verbreitet, weil für lokale Anwendungen schon Sprachen wie C++ oder Java existieren und mit diesen Sprachen schnellere und komplexere Programme realisierbar sind.

Die Abkürzung PHP stand ursprünglich für „Personal Homepage Tools“ und wurde mit der Version 3 in „PHP: Hypertext Preprocessor“ umbenannt. Anhand des „Hypertext“ im Namen kann man schon erkennen, dass PHP das HTTP (Hypertext Transerfer Protocol) nutzt. HTTP ist das Standartprotokoll für Internetanwendungen.

Preprozessor heißt soviel wie „Vorarbeiter“. PHP wird ausgeführt, bevor die Antwort an den Client geschickt wird. So hat PHP die volle Kontrolle über den Zustand des HTTP oder den Inhalt der Antwort (Response). Man kann z.B. Cookies (Textdateien auf dem Rechner des Benutzers) setzen lassen oder den Benutzer auf eine andere Seite umleiten. Wenn die Verarbeitung einer Anfrage fehlschlägt, kann PHP auch entsprechende Header setzen, so dass der Client dies erkennt.

Ein typischer Ablauf mit Request und Response (Anfrage und Antwort)

request_response

Im obigen Bild erkennt man die klare Trennung von Serverseite (PHP) und Clientseite (Browser, der HTML darstellt). Es ist ein unter Anfängern weit verbreitetes Irrtum, dass PHP im Browser ausgeführt wird.

Die meisten PHP-Skripts haben Zugriff auf eine Datenbank, um dynamische Inhalte auszulesen oder zu schreiben. Es ist jedoch nicht zwingend eine Datenbank für PHP erforderlich. Daten können z.B. auch in Dateien abgelegt werden. Auch der E-Mail-Versand ist mit PHP sehr einfach realisierbar.

Der Webserver mit PHP als Modul

Um PHP verwenden zu können, braucht man einen sogenannten PHP-Interpreter.Dieser Interpreter wird als Modul in den Webserver eingebunden. Häufig verwendete Webserver sind Apache und IIS. Apache kann im Gegensatz zu IIS nicht nur auf Windows-Systemen installiert werden, sondern auch auf Linux oder Macintosh und vielen anderen Betriebssystemen.

Da die Konfiguration von PHP und Apache für unerfahrene Anwender sehr schwierig und mit Sicherheitslöchern verbunden ist, werden vorkonfigurierte Versionen des Apache-Webservers angeboten:

XAMPP

Dies ist die am weitesten verbreitete Version. Sie beinhaltet Apache, das Datenbanksystem MySQL, PHP und eine weitere Skriptsprache namens Perl. Das X im Namen sagt aus, dass diese Version auf den meisten Betriebssystemen verfügbar ist.

WAMP

Für Windows: Apache, MySQL und PHP sind in diesem Paket enthalten. Es funktioniert – wie der Name schon sagt – nur auf Windowsrechnern.

LAMP

Für Linux: Apache, MySQL und PHP sind in diesem Paket enthalten. Es funktioniert – wie der Name schon sagt – nur auf Betriebssystemen, die auf dem Linuxkernel basieren..

MAMP

Für Macintosh: Apache, MySQL und PHP sind in diesem Paket enthalten. Es funktioniert – wie der Name schon sagt – nur auf Macs.

Einrichtung eines Webservers mit PHP

Wenn man schnell mit dem Entwickeln von PHP-Skripts loslegen will, holt man sich am besten den geeigneten Server für sein Betriebssystem (Für Windows empfehle ich XAMPP) und installiert ihn.

Man muss danach gar nichts einstellen, sondern kann sofort loslegen.

Bei XAMPP wird folgender Ordner angelegt: C:\xampp\htdocs

In diesen Ordner kommen alle PHP-Skripts. Man kann ihn im Browser unter http://localhost/bzw. http://127.0.0.1 erreichen.

Apache sucht dann in C:\xampp\htdocs nach einer index.php. Ist keine vorhanden, wird nach index.html bzw. index.htm gesucht. Falls auch diese Dateien nicht existieren, wird der Inhalt des Verzeichnisses angezeigt.

Zum Test legt man am besten C:\xampp\htdocs\index.php an und schreibt folgendes hinein:

<?php

phpinfo();

?>

Wenn man jetzt localhost aufruft, wird eine Seite angezeigt, die alle Informationen über den Webserver und die PHP-Version auflistet. Falls nicht, sollte man prüfen, ob alle Installationsschritte richtig durchgeführt wurden und XAMPP läuft. Manchmal blockieren auch Firewalls oder Programme wie Skype den Port 80, auf dem XAMPP läuft.

Geschichte von PHP

Die aktuelle Version von PHP ist 5.2.8 (Stand 4.1.2009). Seit der ersten Version von PHP, die 1995 von Rasmus Lerdorf entwickelt wurde und eine Ansammlung von Perl-Skripts war, hat sich sehr viel getan. Vor allem ab Version 3 wurde PHP für viele Entwickler interessant. Hier die wichtigsten Änderungen in den einzelnen Versionen:

1

Die erste PHP-Version. Sie hatte noch den Namen „Personal Homepage Tools“ und bestand nur aus ein paar Perl-Skripts, die die Entwicklung von (dynamischen) Homepages erleichterten.

3

Die Basis, auf der PHP aufbaut, wurde in der dritten Version vollständig neu geschrieben. PHP bekam in dieser Version auch den neuen Namen „PHP: Hypertext Preprocessor“

4

Die Firma „Zend Technologies Ltd.“ aus den USA wurde gegründet. Ab PHP4 war Zend für die Weiterentwicklung von PHP verantwortlich. Zend schrieb auch den Kern von PHP, die Zend Engine, neu.

Mit PHP 4 wurden sehr einfache objektorientierte Skripts möglich. PHP 4 beherrschte aber noch keine Schlüsselwörter wie private, public oder protected. Alle Attribute waren automatisch immer public. Dadurch war keine richtige OOP möglich.

4.1

In PHP 4.1 kamen die superglobalen Arrays $_GET, $_POST, $_FILES, $_SESSION, $_COOKIE, $_REQUEST und $_SERVER hinzu. Diese ermöglichen den einfachen Zugriff auf Daten, die vom Client (PC des Benutzers, der die Seite bedient) kommen.

4.2

Die sicherheitskritische Einstellung register_globals ist seit PHP 4.2 standartmäßig ausgeschaltet. Mehr zu register_globals auf Seite 12!

4.3

Ab PHP 4.3 werden mit PHP auch Skripts auf Kommandozeilenbasis möglich.

4.4.9

PHP 4.4.9 ist die letzte Version vor PHP 5. Sie schließt weitere Sicherheitslücken. Der PHP4-Zweig wird seit dieser Version nicht mehr weiterentwickelt. Die Unterstützung für PHP 4-Systeme wurde vom PHP-Team Mitte 2008 eingestellt. Das PHP-Team rät dringend zur Aktualisierung auf Version 5.

5

Die Zend Engine 2 ist erschienen. Die Objektorientierung von PHP wurde in dieser Version erheblich verbessert. Es gibt jetzt Interfaces, abstrakte und finale Klassen und die Schlüsselwörter private, public, protected, die die Sichtbarkeit von Methoden und Attributen manipulieren und das Verhalten bei der Vererbung bestimmen. Außerdem gibt es jetzt Exceptions, die geworfen und gefangen werden können. Diese sorgen für eine deutlich bessere Fehlerbehandung.

In PHP 5 wurde auch die Verarbeitung von XML-Dokumenten durch SimpleXML vereinfacht.

5.2

Die Speicherverwaltung wurde verbessert, um PHP auch auf langsameren Servern zu ermöglichen. Seit PHP 5.2 können mit der Skriptsprache auch Zip-Archive erstellt und ausgelesen werden.

5.2.8

Die aktuelle PHP-Version behebt nochmal einige Fehler.

Ein Blick in die Zukunft: PHP 5.3 und PHP6

PHP 5.3

Für die nächste PHP-Version (5.3) wurden die folgenden Änderungen angekündigt.

  • Zum einen sollen Namespaces möglich sein. Namespaces dienen zum Vermeiden von Namenskonflikten (vorallem in sehr großen Anwendungen mit vielen Klassen).
  • Außerdem sollen Sprungmarken (goto) ermöglicht werden.
  • Weitere Neuerungen sind statische Bindungen in Klassen und verbesserte XML-Unterstützung.

Es existiert bereits seit ungefähr einem Jahr eine Betaversion von PHP 5.3. Für den Produktivbetrieb wird momentan allerdings noch PHP 5.2.8 empfohlen.

Die finale Version von PHP 5.3 soll am Anfang des Jahres 2009 erscheinen. Der genaue Termin steht noch nicht fest.

PHP 6

In PHP 6 werden Einstellungen, die für die Sicherheit von Skripts teilweise gefährlich sind, entfernt. Dazu zählen register_globals, magic_quotes und safe_mode.

Weiterhin kommt mit PHP6 erstmals die Unicode-Unterstützung, die den Umgang mit deutschen Umlauten oder anderen Sonderzeichen sehr vereinfacht. Dadurch können in Zukunft Variablennamen oder Klassennamen auch Sonderzeichen enthalten.

Bisher wurden bei Zeichen, die nicht dem ASCII-Code entsprachen, Probleme bei der Ermittlung der Stringlänge verursacht. Das soll bald der Vergangenheit angehören.

Wann PHP 6 veröffentlicht wird, ist noch unklar.

Unterschiede zwischen PHP und C/C++

Der größte Unterschied zwischen PHP und C bzw. C++ ist, dass PHP eine Skriptsprache ist. C und C++ sind dagegen echte Programmiersprachen. Weitere Unterschiede werden in der folgenden Tabelle erklärt

Allgemeine Unterschiede

PHP

C/C++

PHP-Skripts werden nicht kompiliert. Sie werden bei der Ausführung vom PHP-Interpreter interpretiert. Bei der Entwicklung spart das viel Zeit, aber im eigentlichen Betrieb gibt es dadurch einen kleinen Geschwindigkeitsverlust.

Programme in diesen Sprachen müssen vor der Ausführung kompiliert werden. Die Ausführung ist dadurch im Vergleich zu PHP schneller. Allerdings ist die Entwicklung von Internetapplikationen mit PHP wesentlich einfacher.

PHP ist plattformunabhängig. PHP-Skripts funktionieren auf jedem Rechner, auf dem ein PHP-Interpreter verfügbar ist.

C bzw. C++ greifen auf die API (Application Programming Interface) des Betriebssystems zu, z.B. um die GUI (Graphical User Interface) darzustellen. Deshalb muss für jedes Betriebssystem ein anderes Programm geschrieben werden.

PHP-Skripts haben eine kurze Laufzeit. Meistens dauern sie nur wenige Millisekunden. Sie werden in der Regel bei jedem Request (Aufruf des Skripts, meistens bei jeder Benutzeraktivität) neu ausgeführt.

Aufgrund der Spezifikationen des HTTP ist dies auch nicht anders möglich.

Diese Programme haben meistens (vorallem GUI-Programme) eine längere Ausführungszeit. In dieser Zeit können auch mehr als eine Benutzeraktion ausgeführt werden.

Unterschiede in der Syntax und Programmierung

PHP

C/C++

Variablen fangen mit einem Dollarzeichen an, z.B. $variable.

Variablen fangen mit einem Buchstaben an, z.B. variable

PHP besitzt eine sehr schwache Typisierung, was von vielen Programmierern (darunter auch ich) als großer Vorteil angesehen wird. Eine Variable kann im Laufe des Skripts alle Typen annehmen und auch ohne Probleme konvertiert werden. Sogenannte Type-Casts machen das möglich:

$variable = ‚100‘;

$variable = (int)$variable;

In der ersten Zeile wird $variable die Zeichenkette (String) 100 zugewiesen. PHP erkennt automatisch, welchen Datentyp die Variable erhalten muss. In der zweiten Zeile wird durch den Type-Cast (int) die Variable in eine Ganzzahl (Integer/int) umgewandelt.

Variablen in C und C++ müssen schon bei der Deklaration einen Typ zugewiesen bekommen. Eine Änderung des Typs ist auch nachträglich nicht möglich. Deshalb werden diese Sprachen auch stark typisierte Sprachen genannt.

Eine Variable bekommt ihren Typ z.B. so:

int ganzzahl;

Und den Wert so:

ganzzahl = 100;

oder direkt so:

int ganzzahl = 100;

Es gibt in PHP sowohl indizierte Arrays als auch assoziative Arrays. Bei assoziativen Arrays kann der Schlüssel eines Arrays auch ein String sein. So werden Skripts einfacher verständlich.

Beispiel:

$array = array();

$array[„Hallo“] = „test“;

echo $array[„Hallo“];

Man kann gleich bei der Deklaration Werte zuweisen:

$array = array(„Hallo“ => „test“, „test1“ => „Hallo“);

Das belegt das Array mit 2 Werten

Schlüssel (Index)

Wert

Hallo

test

test1

Hallo

Auch bei Arrays macht sich die schwache Typisierung bemerkbar. Ein String kann problemlos ein Array werden:

$variable = „String“;

$variable = array(„hallo“ => „tschüss“);

PHP gibt hier keine Fehlermeldung aus.

So erstellt man ein indiziertes Array:

$array = array(„wert1“, „wert2“, „wert3“);

Oder so:

$array[] = „wert1“;//[0] wird angelegt

$array[] = „wert2“;//[1] wird angelegt

$array[] = „wert2“;//[2] wird angelegt

Wie man sieht, gibt es sehr viele Möglichkeiten, wie man ein Array mit Werten belegen kann. Man muss auch nicht wissen, wie viele Werte es insgesamt gibt.

In C++ gibt es nur indizierte Arrays mit Zahlen als Schlüssel.

Beispiel:

int array[10];

cout<<array[4];

Es muss schon bei der Deklaration angegeben werden, wie viele Elemente das Array hat. Der Index startet bei 0. Der maximale Index ist also immer n-1, wenn n bei der Deklaration als Zahl in den eckigen Klammern angegeben wird.

Bei PHP gibt es keine main-Funktion. Alles, was außerhalb von Funktionsdefinitionen oder Klassen steht, wird ausgeführt, wenn man das Skript aufruft.

In C und C++ wird als erstes die main-Funktion ausgeführt.

Einführung in die Programmierung mit PHP

Die Syntax von PHP ist vergleichbar mit der Syntax von C. Es gibt Kontrollstrukturen wie if und Switch-Case. Außerdem gibt es die Schleifen for, while und do-while. Eine weitere Schleife für den einfachen Umgang mit (assoziativen) Arrays ist die foreach-Schleife. Sie wird später noch genauer erklärt.

Jede Anweisung wird mit einem Semikolon („;“) abgeschlossen.

Da der PHP-Interpreter nur PHP-Code zwischen <?php und ?> bzw. <? und ?> interpretiert, kann PHP auch problemlos in HTML-Dokumente eingebunden werden. Man sollte aber aufgrund der Übersichtlichkeit auf das EVA-Prinzip (Zuerst Eingabe, dann Datenverarbeitung und zuletzt die Ausgabe der Daten) achten.

Hier ein kleines Beispiel:

<html>

<head>

<title> PHP-Test </title>

</head>

<body>

<?php

echo „Mein erstes PHP-Skript“;

?>

</body>

</html>

Das würde – wenn PHP aktiviert ist – die Ausgabe einer HTML-Seite mit „PHP-Test“ als Titel und dem Text „Mein erstes PHP-Skript“ erzeugen.

Wenn PHP nicht aktiviert ist, wird der PHP-Code direkt an den Benutzer geschickt, was bei Anwendungen mit Datenbankanbindung sehr gefährlich ist, falls die Zugangsdaten direkt im Skript stehen. Der Benutzer würde die Daten im Klartext zu sehen bekommen und hätte Zugriff auf die Datenbank.

Die superglobalen Arrays

Diese besonderen Arrays wurden weiter vorne schon ein paar mal angesprochen. Aber was genau sind die superglobalen Arrays (ein anderer Name ist Superglobals)?

Superglobale Arrays heißen so, weil sie überall im Skript verfügbar sind. Man kann sie in jeder Methode oder Funktion verwenden. Die wichtigsten Superglobals sind folgende:

Name

Funktion

$_POST

Über $_POST hat man Zugriff auf alles, was mit der POST-Methode an das Skript geschickt wurde. In der Regel kommen diese Daten aus Formularen oder AJAX-Requests. (AJAX = Asynchronous JavaScript and XML)

$_GET

$_GET enthält die Parameter, die ein Skript über die URL mitbekommt. z.B. index.php?name=karl&alter=89

In index.php steht jetzt $_GET[„name“] mit dem Inhalt „karl“ und $_GET[„alter“] mit dem Inhalt 89 zur Verfügung.

$_COOKIE

Cookies sind Textdateien auf dem Rechner des Benutzers. Sie dienen zum Speichern von Dateien, die zur Identifikation des Benutzers notwendig sind. Häufig werden auch andere Daten darin gespeichert. z.B. welches Design der Benutzer auf einer Website ausgewählt hat.

Alle Cookies, die von der Domain, auf der sich das Skript befindet, gesendet wurden, sind in $_COOKIE wieder abrufbar.

$_REQUEST

Wenn man nicht weiß, ob Daten von $_POST, $_GET oder $_COOKIE kommen, verwendet man $_REQUEST. In $_REQUEST sind alle Elemente der Post-, Get- und Cookie-Superglobals enthalten. Wenn möglich, sollte man $_REQUEST vermeiden, weil Skripts dadurch komplizierter und fehleranfälliger werden.

$_SERVER

Hier finden sich sowohl Informationen über den Server (z.B. die Uhrzeit oder die Domain) als auch über den Benutzer und dessen Browser. Unter anderem kann abgefragt werden, welche IP-Adresse der Benutzer verwendet und von wo er kommt (Der sogenannte Referer)

$_FILES

Wenn der User Dateien über ein Formular hochlädt, kann man im PHP-Skript über $_FILES damit arbeiten.

$_SESSION

$_SESSION ist ein wesentliches Feature von PHP. Mit Sessions ist es möglich, benutzerbezogene Daten über mehrere Skriptaufrufe hinweg zu erhalten. Das häufigste Anwendungsgebiet von Sessions sind Loginsysteme, wo sich ein Benutzer einloggen und unter seinem Nickname bestimmte Aktionen ausführen kann.

PHP identifiziert den Benutzer anhand der Session-ID, die meistens über Cookies ($_COOKIE) oder die URL ($_GET) übertragen wird. So weiß das Skript automatisch, welche Daten zum aktuellen Benutzer gehören.

Formulare mit PHP verarbeiten

Die Möglichkeit, Benutzereingaben mit PHP zu verarbeiten und zu speichern, hat PHP berühmt gemacht. Formulare nutzenmeistens die Superglobals $_GET und $_POST, manchmal auch $_FILES, wenn Dateien hochgeladen werden.

Ein kleines Beispiel zu einem $_GET-Formular. Bei der Ausgabe wird auf das HTML-Gerüst verzichtet, um sich auf das Wichtige zu konzentrieren.

(Inhalt von index.php bzw. index.html)

<html>

<head><title>Das erste Formular</title></head>

<body>

<form action=“verarbeitung.php“ method=“get“>

Bitte geben Sie Ihren Namen ein:

<input type=“text“ name=“textfeld“ />

<input type=“submit“ value=“Abschicken“ />

</form>

</body>

</html>

(Inhalt von verarbeitung.php)

<?php

if(isset($_GET[„textfeld“]))

{

echo „Hallo, „.$_GET[„textfeld“].“!“;

}

else

{

?>Es wurde kein Name übertragen<?php

}

?>

Erklärung

Die Datei mit dem Formular muss nicht zwingend eine PHP-Datei sein, da sie keinen PHP-Code enthält. Deshalb kann man sie auch index.html nennen.

Das Attribut action im form-Tag gibt die Datei an, an die die Daten gesendet werden. Das Attribut method lautet entweder get oder post. Da wir hier die Daten über die URL übertragen wollen, steht hier get.

Nachdem das Formular abgeschickt wurde, schickt der Browser eine Anfrage an den Server. Er fordert die Datei verarbeitung.php an und gibt die Daten über die URL (Adresse) mit:

verarbeitung.php?textfeld=DER_INHALT

DER_INHALT steht in dem Fall für das, was der Benutzer in das Textfeld eingegeben hat.

Wurde z.B. „Peter“ eingegeben, lautet die Adresse verarbeitung.php?textfeld=Peter

Im PHP-Skript ist dann automatisch der Schlüssel textfeld in $_GET belegt. Das erledigt PHP automatisch.

Der Befehl isset() prüft, ob eine Variable existiert. In diesem Fall wird geprüft, ob $_GET[„textfeld“] vorhanden ist. Wenn ja, wird „Hallo, NAME“ ausgegeben.

Wenn nein, wird „Es wurde kein Name übertragen“ ausgegeben. Das ist z.B. der Fall, wenn verarbeitung.php ohne Parameter aufgerufen wird.

Übertragung per POST

Normalerweise werden Eingaben, von denen man die Länge nicht weiß, per POST übertragen. Bei der POST-Methode können viel größere Datenmengen als mit GET übertragen werden. GET erlaubtmeistens nur 255 Byte. Das variiert aber von Browser zu Browser.

Wenn man die Anwendung von oben auf POST umstellen will, muss man einfach folgende Änderungen vornehmen:

  1. In index.html wird method=“get“ durch method=“post“ ersetzt.
  2. In verarbeitung.php muss der Arrayname von $_GET auf $_POST umgeändert werden. (an allen Stellen, an denen $_GET vorkommt). Der Index „textfeld“ bleibt.

Wenn man das Formular jetzt abschickt, wird der Name nicht mehr über die Adresse übertragen.

register_globals

Es gibt in der zentralen Konfigurationsdatei von PHP (php.ini) eine Einstellung, die register_globals heißt und folgendes erlaubt:

Alle Elemente der superglobalen Arrays ($_GET, $_POST, $_COOKIE, $_FILES, $_SESSION, $_REQUEST, …) werden automatisch globalisiert, d.h. folgendes wäre möglich:

Beispiel

Ein Skript wird so aufgerufen: index.php?parameter=hallo

In index.php kann jetzt mit $_GET[„parameter“] gearbeitet werden. PHP registriert jedoch (aufgrund register_globals = on) nicht nur $_GET[„parameter“], sondern auch $parameter. Beide Variablen haben den gleichen Inhalt. Ursprünglich sollte das die Arbeit mit superglobalen Arrays erleichtern, bis folgende Sicherheitslücke festgestellt wurde:

einloggen.php

if(isset($_GET[„password“])

&& isset($_GET[„username“])

&& $_GET[„password“] == „,mein_kennwort“

&& $_GET[„username“] == „mein_username“)

{

$is_admin = true;

}

if($is_admin == true)

{

//zeige Adminbereich an

//erlaube alle Zugriffe auf Datenbank

}

Dieses Skript funktionert, wenn es wie erwartet aufgerufen wird, nämlich so:

einloggen.php?password=mein_kennwort&username=mein_username

Da PHP aber mit register_globals alle superglobalen Arrayelemente globalisiert, wäre auch das hier denkbar: einloggen.php?is_admin=1

Der Benutzer hätte so ohne Passwort und Benutzernamen Administratorenrechte. (PHP wertet alles, was nichtNULL oder 0 ist, als true.)

Maßnahme

Um diese Lücke auszuschalten, muss man entweder register_globals ausschalten, oder $is_admin am Anfang des Skripts mit false initialisieren.

Die Reaktion

Als man diese Sicherheitslücke entdeckte, führte das PHP-Team register_globals in den folgenden PHP-Versionen (PHP 4.4 und neuer) so ein, dass sie standardmäßig ausgeschaltet ist. In PHP6 soll diese Einstellung endgültig entfernt werden.

Dateien einbinden

Wie auch in C kann man in PHP Dateien einbinden. Meistens werden Funktionen und Klassen ausgelagert, so dass diese nur bei Bedarf geladen werden.

Eine Datei kann man mit folgenden 4 Befehlen laden lassen:

include(„meine_datei.php“)

Include() ist der Standardbefehl zum Laden von weiteren PHP-Dateien. Falls die Datei, die in der Klammer angegeben wird, nicht existiert, wird eine Fehlermeldung ausgegeben, das Skript wird aber nicht abgebrochen.

require(„meine_datei.php“)

Dieser Befehl arbeitet gleich wie include(). Der Unterschied ist jedoch, dass das Skript abgebrochen wird, wenn die Datei nicht existiert. Das ist sinnvoll, wenn eine Datei sehr wichtige Funktionen enthält, ohne die die Abarbeitung des Skripts fehlschlagen würde.

include_once(„meine_datei.php“)

Dieser Befehl hat die gleiche Funktion wie include(). Im Gegensatz zu include() bindet include_once() aber jede Datei nur einmal ein. Selbst wenn man das hier schreiben würde, würde meine_datei.php nur einmal geladen werden:

include_once(„meine_datei.php“);

include_once(„meine_datei.php“);

include_once(„meine_datei.php“);

Das wird oft genutzt, um Funktionen zu inkludieren. Wenn eine Funktion mehrmals deklariert wird, verursacht PHP eine Fehlermeldung.

require_once(„meine_datei.php“)

require_once macht das gleiche wie require() und bindet eine Datei ebenfalls nur einmal ein.

Funktionen in PHP

Auch in PHP kann man eigene Funktionen definieren. Im Gegensatz zu C++ und C haben diese aber keinen Rückgabewerttyp. Eine Funktion kann alle Datentypen (int, float, array, string, bool, …) zurückgeben.

Beispiel

(Inhalt von getValue.php)

function getValue($type=“integer“)

{

switch($type)

{

case „string“: return „ein String“; break;

case „integer“: return 10; break;

case „float“: return 10.5; break;

default: return false;

}

}

getValue() kann sowohl mit als auch ohne Parameter aufgerufen werden. Wird getValue ohne Parameter verwendet, wird 10 zurückgegeben, da der Fall „integer“ eintritt ($type ist ein optionaler Parameter mit Standartwert „integer“). Wenn kein Fall eintritt, wird der boolesche Wert false zurückgegeben. Man kann der Funktion die Werte „integer“, „string“, „float“ übergeben. Je nach dem wird ein anderer Wert zurückgegeben.

Ein möglicher Aufruf sieht so aus:

(Inhalt von index.php)

//getValue.php einbinden

require(„getValue.php“);

//getValue() ist jetzt verfügbar

$zahl = getValue(„integer“);//$zahl enthält jetzt 10

$string = getValue(„string“); //$string enthält jetzt „ein String“

$float = getValue(„float“);//$float enthält jetzt 10.5

$bool= getValue(„undefinierter_fall“); //$bool ist false, weil es „undefinierter_fall“ nicht gibt

Dieses Beispiel ist zwar sinnlos, zeigt aber, dass PHP in ein und der selben Funktion verschiedene Datentypen zurückgeben kann.

Zahlen addieren

Hier ein sinnvolleres Beispiel, das 2 Zahlen addieren kann:

<?php

function addieren($zahl1, $zahl2)

{

return $zahl1+$zahl2;

}

echo addieren(1,2);

?>

Hier wird 3 ausgegeben. Man könnte hier auch folgendes machen:

<?php

echo addieren(1.2, 3);//4,2

echo addieren(true, true); //2 (true wird als 1 gewertet)

echo addieren(„3“, „5.8“); //8,8

?>

Die foreach-Schleife

In C++ und den meisten anderen Sprachen gibt es nur for-, while-, und do-while-Schleifen. PHP bietet für den Umgang mit (vor allem assoziativen) Arrays die foreach-Schleife an, mit der man über alle Elemente eines Arrays iterieren kann.

(Inhalt von foreach.php)

<?php

//Array initialisieren

$person = array();

$person[„name“] = „Peter“;

$person[„alter“] = 17;

$person[„wohnort“] = „Berlin“;

$person[„Beruf“] = „arbeitslos“;

//Alle Elemente von $person ausgeben

echo „Person enthält folgende Elemente: <br />“;

foreach($person as $key => $value) //$key macht den Schlüssel des Elements zugänglich,

//$value den Inhalt

{

echo $key.“: „.$value;

echo „<br />“;

}

?>

Ausgabe

Das Skript erzeugt diese Ausgabe:

Person enthält folgende Elemente:

name: Peter
alter: 17
wohnort: Berlin
Beruf: arbeitslos

Arrays und for-Schleifen

Man kann in PHP zwar auch mit normalen for-Schleifen mit Arrays arbeiten, aber spätestens wenn es assoziative Arrays gibt, bekommt man Probleme, da man in der Regel den Schlüsselnamen des Elements nicht kennt.

Deshalb wird fast immer die foreach-Schleife benutzt.

Fehlermeldungen ein- und ausschalten

Wenn man eine Webanwendung entwickelt, ist es mehr als sinnvoll, das sogenannte error_reporting auf (E_ALL |E_STRICT) zu stellen.

E_ALL heißt, dass alle Fehlermeldungen angezeigt werden. E_STRICT zeigt Verbesserungsvorschläge für das Skript an.

Beispiel

(Inhalt von fehlermeldungen.php)

error_reporting(E_ALL | E_STRICT);

echo $test[„irgendwas“];

Wenn vorher $test[„irgendwas“] noch nicht mit einem Wert belegt wurde, gibt PHP diese Meldung aus:

Notice: Undefined variable: person in C:\xampp\htdocs\fehlermeldungen.php on line 2

Anhand dieser Meldung kann man den Fehler sehr schnell erkennen und beheben.

Produktivbetrieb

Wenn die Anwendung fertig entwickelt ist und das Produkt im Internet der Öffentlichkeit zugänglich gemacht wird, muss error_reporting unbedingt auf E_NONE gestellt werden. Damit werden alle Fehlermeldungen deaktiviert. Denn jede Fehlermeldung verrät Informationen über ein Skript, mit denen ein Angreifer möglicherweise unbefugten Zutritt erhält.

Beispiel

(Inhalt von fehlermeldungen.php)

error_reporting(E_NONE);

echo $test[„irgendwas“];

Dieses Skript zeigt keinen Fehler an, sondern ignoriert die undefinierte Variable einfach. Der potentielle Angreifer bekommt von allem nichts mit.

Festes Layout, variabler Inhalt

Das letzte Beispiel zeigt, wie man ein Problem beim Aktualisieren einer Homepage einfach lösen kann.

Wenn man eine Homepage rein mit HTML schreibt, hat man meistens viele Dateien, die den Header, das Menu und den Inhalt enthalten. Wenn man z.B. das Menü um einen Punkt erweitern will, muss man alle diese Dateien bearbeiten.

Mit PHP kann man eine zentrale Datei schreiben, die Inhalte, die auf allen Seiten enthalten ist, enthält und nur den eigentlichen Inhalt dynamisch (per GET-Parameter) nachlädt.

Die Datei mit dem Layout heißt meistens index.php. Hier ein Beispiel:

(Inhalt von index.php)

<html>

<head>

<title>Meine Homepage</title>

</head>

<body>

<!– Header –>

<h1>Meine Homepage</h1>

<!– Menu –>

<a href=“index.php?page=startseite“>Startseite</a> |

<a href=“index.php?page=bilder“>Bilder</a> |

<a href=“index.php?page=sonstiges“>Sonstiges</a>

<hr />

<!– Inhalt –>

Noch nicht vorhanden

</body>

</html>

Ruft man dieses Skript auf, bekommt man das zu sehen:

homepage

Das Skript macht jetzt noch nicht viel. Es fehlt die Verarbeitung des GET-Parameters „page“, der angibt, welcher Bereich der Seite angezeigt werden soll:

(neuer Inhalt von index.php)

<?php

$pages = array(„starseite“, „bilder“, „sonstiges“);//(1)

$page = $_GET[„page“];//(2)

if($page == „“ || $page == NULL || !in_array($page, $pages)) //(3)

{

$page = „startseite“;

}

$ordner_mit_inhalten = „inhalte/“;//(4)

$include_pfad = $ordner_mit_inhalten.$page.“.php“;//(5)

?>

<html>

<head>

<title>Meine Homepage</title>

</head>

<body>

<!– Header –>

<h1>Meine Homepage</h1>

<!– Menu –>

<a href=“index.php?page=startseite“>Startseite</a> |

<a href=“index.php?page=bilder“>Bilder</a> |

<a href=“index.php?page=sonstiges“>Sonstiges</a>

<hr />

<!– Inhalt –>

<?php

include($include_pfad);//(6)

?>

</body>

</html>

Der obere Teil des Skripts wird hier erklärt:

  • (1): In diesem Array stehen alle $_GET[„page“]-Parameter, die erlaubt sind.
  • (2): $_GET[„page“] wird $page zugewiesen
  • (3): Wenn $page leer ist oder nicht in $pages steht, wird automatisch die Startseite angezeigt
  • (4): $ordner_mit_inhalten speichert den Pfad zu den Skripts mit den Inhalten
  • (5): Hier wird der Pfad zusammengebaut.
  • (6): Schließlich wird noch der Inhalt eingebunden

Das Skript funktioniert nur, wenn es einen Ordner namens „inhalte“ im gleichen Ordner wie index.php gibt und dieser Ordner die entsprechenden Dateien (startseite.php, sonstiges.php, bilder.php“) enthält.

Die Vorteile

Wenn man jetzt einen Menüpunkt hinzufügen will, muss man nur index.php verändern und eine Datei in inhalte/ anlegen, die zu diesem Menüpunkt gehört.

Quellenangabe

http://de.wikipedia.org/wiki/PHP

– Mein Gehirn

Benutzungshinweise

Wie oben schon erwähnt, sollt ihr das hier nicht einfach kopieren und auswendig lernen. Die Rechte auf diesen Text und auf die Bilder liegen zu 100% bei mir. Sollte von hier zitiert oder kopiert werden, bitte nur mit Angabe einer Quelle.  (Link zu diesem Artikel)

1 Star2 Stars3 Stars4 Stars5 Stars (1 Stimme, durchschnittlich 5,00 / 5)
Loading...


2 Kommentare zu “Referat über PHP (Ausarbeitung)”

  1. Also ich habe sehr lange im Unterricht PHP behandelt und habe zu Hause ewig lange Quellcodes programmiert bis ich endlich drin war.
    Mit PHP hab ich den einstieg ins Programmieren gefunden und bin durch die PHP programierung sogar wesentlich ordentlicher geworden! Seid dem ich so ordentlich und mit vielen Kommentaren arbeite spare ich mir im Nachhinein sehr viel Zeit, die ich sonst mit der Fehlersuche oder sonstigen verbraucht habe.
    Manchmal denke ich ich verstehe die Programiersprachen besser als meine eigene Muttersprache wenn ich so in die ganzen Rechtschreibreformen gucke 🙂

  2. Schau dir mal Haskell an, wenn du ordentlich werden willst 🙂 DAS ist kranker Shit 😛

Hinterlasse einen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

»Informationen zum Artikel

Autor: Simon
Datum: 30.03.2009
Zeit: 21:52 Uhr
Kategorien: PHP
Gelesen: 67934x heute: 3x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Mehr zum Thema erfahren

Schlagwörter: , , ,

»Meta