| Der große Vorteil dynamischer Webseiten ist die Möglichkeit, auf bestimmte Anforderungen (z.B. Wünsche und Anfragen der BesucherInnen) flexibel zu reagieren. | Hier wird vorgestellt, wie die Daten zur Steuerung eines Scripts (Parameter) eingegeben und gesendet werden. Eingabe und Absenden der Daten kann wahlweise manuell, teil- oder vollautomatisch erfolgen. |
PHP
|
PHP Hypertext Processor |
| HTML-Formular | Eingabe in ein Formular, Senden der Daten |
| HTML-HyperLink | Senden von vorprogrammierten Daten mit HyperLinks |
| JavaScript | Senden von frei programmierbaren Daten mit Javascript |
| Validierung | Prüfung der in ein Formular eingegebenen Daten |
| Caching | Wie verhindert man, dass Web-Dokumente lokal gespeichert werden ? |
| Variable Formulare | Mit PHP lassen sich Formulare variabel gestalten und Werte eintragen |
| GET und POST | Die beiden Standard-Verfahren zur Übergabe von Daten |
| URI-Syntax | Die 'Grammatik' zur Formulierung der GET Übergabe-Daten |
Empfang
|
Die PHP-Programmierung zum Empfang der Daten |
| Verwandte Themen | Upload & Download von Dateien, Übernahme von GET-Argumenten durch Javascript-Programme |
Senden von vorprogrammierten Daten mit HyperLinks |
|
HTML-HyperLinksHTML-Links kann man an Texte, Bilder und an die meisten anderen Objekte knüpfen. Ein Klick auf das vom <a>...</a>-Element umschlossene Objekt löst das Ereignis (Event) onclick aus. |
Wenn mit dem href-Argument eine Web-Adresse, ein Verzeichnis
(Ordner) oder eine Datei angegeben ist, dann versucht der Browser, das Ziel zu laden.
Wenn nach dem Namen des Ziels Daten angegeben sind, das können
diese gelesen werden, falls es sich dabei um ein Programm handelt. Als Ziel kann man alternativ auch ein ↓ Javascript-Programm angeben. |
|
In den Beispielen rechts werden Daten mit HyperLinks übergeben, d.h. ohne ein
HTML <form>-Element. Die Daten werden nach einem ?-Zeichen an den Dateinamen angehängt - Allerdings muss man alle in den Daten enthaltenen Sonderzeichen → URI-codieren. Bewegen sie die Maus über die Links und sehen sie dabei auf die Status-Zeile ihres Browsers. Klicken sie die Links und sehen sie die Reaktion des Ziel-Scripts. ♦ Details zu Zeichen-Codes, zu Unicode und zur URL-Syntax |
Klicken sie einen Link zur Live-Demonstration: ► Empfangsseite ohne Daten öffnen: ► URI-Codierung von Leerzeichen mit + ► Trennung von mehreren Variablen mit & (Sendet auch die Variable txt2, die im Formular gar nicht enthalten ist). ► URI-Codierung von ASCII-Zeichen mit % und 2stelligem HexCode: Der Text 'k&k' wird mit 'k%26k' codiert. ► URI-Codierung von Umlauten und beliebigen Unicode-Zeichen: Die einfache Codierung mit % und HexCode>0x7F (Umlaute) funktioniert nicht: ► Unicode-Zeichen werden doppelt codiert: Zuerst → HTML, danach → UTF8. Dazu muss die Webseite im Zeichensatz charset=utf-8 angelegt sein, was in jedem Fall empfehlenswert ist. Beispiel: Ä (Unicode u00C4) wird im HTML-Quelltext des Absenders zu Ä und als UTF-Code %C3%84 übertragen. |
Dieses Beispiel zeigt, wie leicht man auf Client-(AnwenderInnen)-Seite unerwartete,
unerwünschte oder sogar gefährliche Daten absenden kann. |
Testen sie die Reaktion der Ziel-Seite (auch als Anregung für Tests eigener Ziel-Seiten). ► Absenden von (potentiell gefährlichem) HTML-Code (Codierung von <b>Angriff</b> )
►
Absenden von unerwarteten Daten
►
Absenden von unerwarteten Variablen
|
Programmierbare Daten mit Javascript senden |
|
JavascriptMit → Javascript Programmen kann man den aktuellen Inhalt (value) jedes Formular-Felds lesen und/oder schreiben. Hier wird das Argument p in das HTML ↑ Formular-Feld txt1 eingetragen.Mit Methode submit() wird das Formular gesendet. Jede Webseite kann beliebig viele Formulare (mit verschiedenen Namen) enthalten, die mit Javascript frei programmierbar sind. Alternativ kann man mit der open()-Methode ein neues Fenster öffnen - wenn dabei ein (PHP)-Script adressiert wird, kann man wie oben für HTML-Links gezeigt Daten nach der Adresse und einem ?-Zeichen übergeben. |
function js_sub(p) {
Klicken sie einen Link zur Live-Demonstration:document.testform.txt1.value = p; document.testform.submit(); } ► Sendet einen fixen Text: ► Sendet die aktuelle Uhrzeit ihres PC: |
ValidierungJavscript-Programme spielen eine wichtige Rolle bei der ↓ Validierung. Man verlagert diese wichtige Arbeit auf den Client-PC (Browser) und spart damit viel kostbare Server-Zeit. |
Unabhängig davon muss man am Server die erhaltenen Daten zur Sicherheit prüfen und filtern. |
Validierung von Formular-Daten vor dem Absenden |
|
|
Jedes (PHP)-Empfangs-Script muss die erhaltenen Daten vor der Verwendung prüfen. |
Der Zyklus von Eingabe, Prüfung und Fehlermeldung wird so lange fortgesetzt,
bis die/der AnwenderIn zulässige Daten sendet oder abbricht. Jeder kennt derartige
lästige Stituationen, in denen der Server mit den eingetragenen Daten ewig
unzufrieden ist. |
|
Professionell erstellte Formulare werden daher immer bereits auf
AnwenderIn-Seite geprüft (validiert): ▲ Die fixe Eingabe-Taste <input type="submit"> wird durch einen <button> außerhalb (!) des Formular-Elements ersetzt. Dieser startet ein Javascript Validierungs-Programm. ▲ Javascript kann die Daten jedes Formular-Felds lesen und bei Bedarf auch korrigieren. ▲ Wenn keine Korrektur möglich ist, wird die Validierung abgebrochen und ein Alarmfenster mit Fehlermeldung angezeigt. ▲ Das Programm kann automatisch Zufalls-Daten in versteckte Felder eintragen, um damit ↓ Caching zu verhindern. ▲ Nur dann, wenn alle Daten korrekt sind, werden die Daten mit Javascript-Methode submit() an das Ziel-Script abgesendet. |
▲ Unabhängig davon müssen die Daten auch auf Server-Seite validiert werden. Diese Prüfung ist eine Sicherheits-Maßnahme gegen Hacker und wird daher anders programmiert. |
Caching verhindern |
|
CacheIn jedem PC-Umfeld werden (Web)-Dateien, die von einem Programm angefordert wurden, lokal gespeichert.• Jedes Browser-Programm speichert die erhaltenen Daten in einem eigenen Cache-Verzeichnis (Ordner). • In den meisten Netzwerken gibt es darüber hinaus Proxy-Server, welche die angeforderten Daten aller PC des LAN zwischen-speichern. Das ist für gleichbleibende Daten sinnvoll: Sie werden nur bei der ersten Verwendung vom entfernten Server angefordert. Bei jeder weiteren Verwendung werden diese Daten aus einem der lokalen Cache-Speicher entnommen. |
Variable Datenwerden u.a. von den meisten dynamischen Webseiten geliefert, z.B. von Perl- oder PHP-Programmen. Die erhaltenen Daten müssen in diesem Fall stets neu angefordert werden und dürfen nicht aus einem der Cache-Speicher stammen.• Die meisten Browser und Proxy-Server erkennen das richtig. • In einem Fall treten allerdings oft Probleme auf: Wenn ein PHP-Programm mit den gleichen Argumenten variable Daten liefert, dann wird es oft nicht erneut angefordert, sondern die Daten der ersten Verwendung aus einem Cache entnommen. |
Problem-FälleDas Cache-Management funktioniert unzuverlässig, wenn ein (PHP)-Programm bei gleicher Anforderung (keine Argumente, oder gleiche Argumente) variable Daten liefert.Ein typischer Fall liegt vor, wenn das PHP-Programm die aktuelle Zeit oder Zufalls-Daten sendet, z.B. mit derartigen gleichbleibenden Anforderungen:
http://webserver/send_variable_data.php
http://webserver/send_data.php?type=variable |
Es gibt mehrere Methoden, um das Caching zu verhindern: ● Dieses HTML Meta-Element soll Caching verhindern:
<meta http-equiv="expires" content="0">
●
Dieses Element im
→ HTTP Response-Header dient dem gleichen Zweck:
Cache-Control: no-cache
Die HTTP-Anweisung kann man in jedem Fall verwenden (z.B. auch für
→ dynamische Grafik).● Leider werden diese Angaben nicht immer beachtet. |
Zufalls-ArgumenteEs gibt einen Trick, um schon bei der Anforderung (auf Client-Seite) das Caching zuverlässig zu verhindern: Man sendet ein zusätzliches Argument mit Zufalls-Daten, z.B.
http://webserver/send_data.php?trick=123
Das Argument trick des Beispiels erhält bei jeder
Anforderung andere Daten
(eine →
Zufalls-Zahl), wird jedoch vom Empfangs-Programm send_data.php
ignoriert.http://webserver/send_data.php?trick=456 ● Der Trick funktioniert fast immer, erfordert jedoch ein kleines Javascript-Programm in der Anforderungs-Webseite. Man integriert es am besten in das ↑ Validierungs-Programm, welches vor dem Absenden die eingetragenen Formular-Daten kontrollieren sollte. Es gibt viele Möglichkeiten, um mit Javascript Zufalls-Argumenten zu erzeugen. Das Beispiel rechts ist stark auf die wesentlichen Details reduziert und zeigt, wie man in einem Formular f1 ein Feld zuf für die Zufalls-Daten anlegt, das Formular mit einem Javascript-Programm senden absendet und vorher Zufalls-Daten in das Feld einträgt. |
Beispiel:
Man fügt ein unsichtbares Element in das Anforderungs-Formular ein:
<input type="hidden" name="zuf" />
Die Anforderung erfolgt mit einem button-Element außerhalb
des Formulars:
<button onclick="senden()">
Das Javascript-Programm senden kontrolliert die eingetragenen Daten,
trägt Zufallsdaten in das Feld zuf ein und sendet zuletzt
das Formular ab:
Absenden
</button>
function senden() {
var z=Math.floor(Math.random()*1000);
}
document.f1.zuf.value=z; document.f1.submit(); |
Variable Formulare mit PHP |
|
|
Mit PHP kann man variable Formulare nach Bedarf erzeugen und z.B. mit
Anfangsdaten (value='..') füllen. Wenn eine dynamische Webseite Eingangsdaten erhält, und diese nochmals in Formularen aufscheinen, dann ist es guter Stil, die aktuellen Daten bereits in die entsprechenden Felder einzutragen - Das Formular enthält dann genau die zuletzt eingetragenen Daten und Änderungen erfordern wenig Aufwand. ♦ Details zur Sicherheit auf der Empfangs-Seite. |
Annahme: Variable $name enthält als
Parameter übergebene Daten <?php
print "<input type='text' name='txt1'";if(strlen($name)) { print " value='$name'";
}print ' />'; ?>
<input type='text' name='txt1' value='test' />
Im Feld txt1 des Formulars ist daher der
Text test bereits eingetragen, kann aber
natürlich durch die/den AnwenderIn geändert werden.
|
GET und POST |
|
| Zur Übergabe von Daten zwischen Sender (Webseite mit Formular) und Empfänger (Ziel-Programm @ Perl, PHP, ..) stehen die beiden Standard-Methoden GET und POST zur Verfügung |
In diesem Kapitel werden die beiden Methoden kurz verglichen. ♣ Tipp: Wenn sie über wenig Erfahrung verfügen, verwenden sie besser GET, da diese Methode leichter durchschaubar ist. |
| GET | POST |
|---|---|
Absender-Formular
<form name="f1" method="get"
action="ziel.php"></form>
|
<form name="f1" method="post"
action="ziel.php"></form>
|
CodierungDie Daten werden beim Absenden vom Browser nach speziellen → Regeln in die URI-Adresszeile verpackt. Aus der Ziel-Adresse und z.B. den Daten von Feld
<input type="text" name="txt1" value="a9z" />
wird diese URI-Adresszeile erzeugt:
ziel.php?txt1=a9z
Die Codierung kann auch manuell oder mit einem (Javascript)-Programm erfolgen (Beispiele
im Kapitel ↑
vorprogrammierte Daten dieser Seite).
|
Die Daten werden nicht codiert, sondern so abgesendet, wie eingetragen. |
LängeDie maximale Länge des gesamten URL-Strings (inkl. http... ) beträgt 1024 Zeichen.Das muss kein Nachteil sein: Je weniger Text übergeben wird, desto geringer das Sicherheits-Risiko. |
Die maximale Länge der Empfangs-Daten wird durch die PHP → Konfigurations-Variable post_max_size bestimmt. Sie beträgt z.B. für diesen Server Live
get_cfg_var('post_max_size') =
|
TransportDie Daten (d.h. der URI-String) werden an den Webserver gesendet. Dieser empfängt den Eingangs-Datenstrom, zerlegt den String und verpackt allfällig gefundene GET-Daten in die Umgebungs-Variable QUERYSTRING. Diese Variable wird an das Ziel-Programm übergeben. |
Die Daten werden direkt an das angegebene Ziel gesendet, d.h. an ein (PHP)-Programm. Dieses muss den Eingangs-Datenstrom selbst verarbeiten und verwendet dazu normalerweise die Umgebungs-Variable CONTENT_LENGTH |
Browser-AdresszeileDer gesamte URI-String wird in der Browser-Adresszeile der Ziel-Seite angezeigt, d.h. inklusive Adresse, ? Zeichen und den Formular-Daten. Auch verschlüsselte und versteckte Felder werden in Klartext angezeigt.Das ist leichter zu debuggen, kann aber ein Sicherheits-Risiko darstellen. |
Die empfangenen POST-Daten werden nicht angezeigt, die Browser-Adresszeile enthält lediglich die Internet-Adresse der Zielseite. |
DecodierungDas Ziel-Programm (PHP) muss den erhaltenen QUERYSTRING zuerst an den & Zeichen in Datenfelder zerlegen, danach die erhaltenen Teil-Strings an den = Zeichen in Name und Wert. |
Alle modernen Programmiersprachen bieten bequeme Möglichkeiten zur Decodierung. In PHP sind die Daten in den → Globalen PHP-Arrays $_GET und $_REQUEST verfügbar. |
| Das Globale Array $_REQUEST enthält alle übergebenen Daten unabhängig von der Methode, und ist daher die bevorzugte Quelle zur Übernahme dieser Daten im Programm der → Ziel-Seite. | |
| ♦ Details zu Common Gateway Interface (CGI)-Programmen sowie zu den Methoden GET und POST | ♦ Details zur Syntax der URI-Adresszeile |