Perl-Praxis. CGI-Skripte. Michael Beckstette Martin Mann, Steffen Heyne. {mbeckste,mmann,sheyne}@informatik.uni-freiburg.de



Ähnliche Dokumente
Perl-Praxis CGI-Skripte 0-0/22

Perl-Praxis. CGI-Skripte. Jörn Clausen

Perl-Praxis. CGI-Skripte.

Perl-Praxis. CGI-Skripte. Jörn Clausen Jens Reeder, Jan Krüger.

Perl-Praxis. CGI-Skripte. Jörn Clausen Jens Reeder, Jan Krüger

Perl-Praxis. CGI-Skripte. Madis Rumming, Jan Krüger.

Perl-Praxis. CGI-Skripte.

Einführung in Perl. WWW, Teil 3: CGI-Skripte

Python CGI-Skripte erstellen

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

Aufgaben HTML Formulare. Prof. Dr. rer. nat. Claus Brell, Wirtschaftsinformatik, Statistik

PPS-Design einer eigenen WWW-Homepage WS 2002/2003. Anforderungen an eine Webseite

Anwendungsprotokolle: HTTP, POP, SMTP

Einführung in die Scriptsprache PHP

SSO-Schnittstelle. Inhalt: Beschreibung der Single Sign-On (SSO) Schnittstelle. NetSlave GmbH Simon-Dach-Straße 12 D Berlin

Wie funktioniert das WWW? Sicher im WWW

Web Visu Tutorial. Hipecs Web Visu. Übersicht

Anleitung zum Login. über die Mediteam- Homepage und zur Pflege von Praxisnachrichten

Programmieren 2 (Prof. Hasbargen) Klausur

Sessions mit PHP. Annabell Langs Sessions in PHP - Annabell Langs 1

Kommunikationsnetze. 7. Das World Wide Web 7.4 Client- vs. Server-basierte Techniken für dynamische Webseiten

Java Webentwicklung (mit JSP)

TimeMachine. Time CGI. Version 1.5. Stand Dokument: time.odt. Berger EDV Service Tulbeckstr München

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Grundlagen der CGI-Programmierung

Dokumentation zum Spielserver der Software Challenge

Aus unserer Projekt- und Schulungserfahrung Oracle TechNet

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

5. Übung: PHP-Grundlagen

PHP-Schwachstellen und deren Ausnutzung

Informatik I: Einführung in die Programmierung

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

HTML5. Wie funktioniert HTML5? Tags: Attribute:

Programmers Manual Geodaten Ver. 2.0

Funktionen in PHP 1/7

Dynamik bis zur DB-Interaktion. Marc Schanne. CGI Möglichkeiten

PHP JavaScript Kapitel 9. Java-Script-Objekte und das Event-Modell

Kennen, können, beherrschen lernen was gebraucht wird

PHP Einsteiger Tutorial Kapitel 4: Ein Kontaktformular in PHP Version 1.0 letzte Änderung:

Proseminar: Website-Management-Systeme

Password Depot für ios

Schiller-Gymnasium Hof

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

2. Interaktive Web Seiten. action in Formularen. Formular. Superglobale Variablen $ POST, $ GET und $ REQUEST. GET und POST

Session Management und Cookies

Web-basierte Anwendungssysteme PHP Teil 2

Diese Anleitung beschreibt das Vorgehen mit dem Browser Internet Explorer. Das Herunterladen des Programms funktioniert in anderen Browsern ähnlich.

Mediator 9 - Lernprogramm

Stellvertretenden Genehmiger verwalten. Tipps & Tricks

ERSTE SCHRITTE.

IT-Zertifikat: Allgemeine Informationstechnologien II PHP

7. TCP-IP Modell als Rollenspiel

Faktura. IT.S FAIR Faktura. Handbuch. Dauner Str.12, D Mönchengladbach, Hotline: 0900/ (1,30 /Min)

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Inhaltsverzeichnis. Open-Xchange Authentication & Sessionhandling

Leitfaden zur Nutzung von binder CryptShare

Artikel Schnittstelle über CSV

LIP Formulare Anleitung zum Speichern, Öffnen und Drucken

Formulare in html Bernd Bl umel Version: 1. April 2003

Schulung SWBcontent. Stand

Web2Lead. Konfiguration

Anleitung zur Lehrgangsanmeldung - 1

Zugriff auf Daten der Wago über eine Webseite

HTML Formulare. Benutzerschnittstelle für interaktive Webseiten

HTML Teil 2. So kann man HTML-Seiten mit <div> und CSS gestalten. So sehen einfache Formulare aus

Multimedia im Netz Wintersemester 2011/12

Bedienungsanleitung für den SecureCourier

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

Autoresponder Unlimited 2.0

Anleitung - Mass er by Patrick Biegel

Python SVN-Revision 12

Arbeiten mit UMLed und Delphi

Es wird das Struts <html:option> Element erläutert und anhand von kleinen Beispielen der Umgang veranschaulicht.

AutoTexte und AutoKorrektur unter Outlook verwenden

4. Network Interfaces Welches verwenden? 5. Anwendung : Laden einer einfachen Internetseite 6. Kapselung von Paketen

Folgende Voraussetzungen für die Konfiguration müssen erfüllt sein:

Einführung in PHP. (mit Aufgaben)

PHP - Projekt Personalverwaltung. Erstellt von James Schüpbach

OP-LOG

Logging, Threaded Server

HTML Programmierung. Aufgaben

Crashkurs http - CGI/Servlets(JSF) - Viewer

Website freiburg-bahai.de

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

Informatik I: Einführung in die Programmierung

Web Grundlagen zum Spidering

Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000

Softwaretechnik Teil Webprogrammierung (HTML, PHP) SS2011

Lokale Installation von DotNetNuke 4 ohne IIS

COMPUTERIA VOM Wenn man seine Termine am Computer verwaltet hat dies gegenüber einer Agenda oder einem Wandkalender mehrere Vorteile.

Dokumentation EGVP-Übertmittlungsfehler bei Server-Engpässen Vorgehensweise Seite 1 von 5

PHP Formulare. Stefan Maihack Dipl. Ing. (FH) Datum:

Aktuelle Sicherheitsprobleme im Internet: Angriffe auf Web-Applikationen

Konfigurieren mit Outlook Express (Windows XP) oder Windows Mail (Windows Vista / Windows 7)

PC-Kaufmann Supportinformation - Proxy Konfiguration für Elster

ESB - Elektronischer Service Bericht

Test mit lokaler XAMPP Oxid Installation

Gibt Daten im erweiterten Format aus. Dies beinhaltet die Angabe von Zugriffsrechten, Besitzer, Länge, Zeitpunkt der letzten Änderung und mehr.

Transkript:

Perl-Praxis CGI-Skripte Michael Beckstette Martin Mann, Steffen Heyne {mbeckste,mmann,sheyne}@informatik.uni-freiburg.de 1

Übersicht WWW, Web-Server CGI-Skripte Parameterübergabe Web-Formulare CGI.pm 2

Datenaustausch im WWW Request Client Response Server Adressierung durch Uniform Resource Locator (URL) Anfrage und Antwort werden per HTTP transportiert HTTP-Nachricht besteht aus header und body body kann leer sein Antwort kann dynamisch generiert werden 3

das lokale Enviroment Web-Server: Apache auf perlws.informatik.uni-freiburg.de Port:80 Login mit Kursaccounts Verzeichnis: /var/www/html/userx X=1,2,3,... Web-Browser starten http://perlws.informatik.uni-freiburg.de Datei index.html auswählen 4

CGI-Skripte informeller Standard: Common Gateway Interface Web-Server führt externes Programm aus Ausgabe des Programms wird als Antwort zurückgeschickt enormes Gefahrenpotential: Ausführung von (fehlerhaftem?) Code Ausführung von beliebigem Code eigenen Code sorgfältig prüfen Keine schnellen Hacks!! 5

CGI-Skripte, cont. Aufbau einer Antwort: header, Leerzeile, body Content-Type: text/html <html> <head>... Perl-Skript helloworld.cgi: #!/usr/local/perl/5.8.7/bin/perl print "Content-Type: text/plain\n\n"; print "hello world!\n"; http://perlws.informatik.uni-freiburg.de/perlkurs/helloworld.cgi Perl-Interpreter direkt angeben, nicht mit /usr/bin/env 6

Aufgaben Schreibe ein CGI-Skript, das die aktuelle Uhrzeit zurückliefert. Zur Erinnerung: ($sec, $min, $hour) = localtime(time()); aktuelle Uhrzeit: #!/usr/local/perl/5.8.7/bin/perl my ($sec, $min, $hour) = localtime(time()); print "Content-Type: text/plain\n\n"; print "It is $hour:$min:$sec\n"; 7

redirects Skript verweist auf andere Ressource neuer URL wird im header zurückgeliefert print "Location: http://www.uni-freiburg.de\n\n"; body kann leer sein redirect verfolgen: $ GET -S http://perlws.informatik.uni-freiburg.de/perlkurs/redirect.cgi more GET http://perlws.informatik.uni-freiburg/perlkurs/redirect.cgi --> 302 Found GET http://www.uni-freiburg.de --> 200 OK <!DOCTYPE html PUBLIC... 302 und 200 Status Codes von HTTP Der body kann zwar leer sein, muß aber vorhanden sein. Beachte die Leerzeile nach dem header. 8

Parameterübergabe Anfrage kann Daten enthalten (Google, Amazon, Wikipedia,... ) Schlüssel-Wert-Paare Datentransfer vom Client zum Web-Server: GET: Parameter werden im URL kodiert...google.de/search?q=boggit&ie=utf-8&oe=utf-8&... POST: Daten werden im body transportiert Datentransfer vom Web-Server zum CGI-Skript: Environment STDIN 9

Einschub: Environment Environment-Variablen mit Shell-Kommando env ansehen Zugriff in Perl: Hash %ENV print "User: $ENV{USER}\n"; print "Suchpfad: $ENV{PATH}\n"; schreibender Zugriff möglich Environment an Prozess gebunden 10

Aufgaben Schreibe ein CGI-Skript showenv.cgi, das das gesamte Environment des CGI-Prozesses anzeigt. Wie sieht das Environment aus, wenn Du showenv.cgi auf der Kommandozeile aufrufst? Hänge an den URL Parameter an:.../showenv.cgi?query=boggit Wie verändert sich das Environment? Gib mehrere Parameter an. Wie könntest Du diese Parameterliste mit Perl weiterverarbeiten? showenv.cgi: print "Content-Type: text/plain\n\n"; foreach $var (sort(keys(%env))) { print "$var: $ENV{$var}\n"; } Environment (gekürzt): REMOTE_ADDR: 129.70.128.82 LD_LIBRARY_PATH: /usr/local/lib:/usr/lib REQUEST_METHOD: GET PATH: /usr/local/bin:/usr/ucb:/bin:/usr/bin GATEWAY_INTERFACE: CGI/1.1 SERVER_SOFTWARE: mini_httpd/1.19 19dec2003 HTTP_HOST: teak.techfak.uni-bielefeld.de:8088 HTTP_USER_AGENT: Mozilla/5.0 (X11; U; SunOS sun4u; en-us; rv:1.6) Gecko/20040121 Das Environment der Shell hat mehr und längere Einträge. Vor allem ist der Suchpfad PATH deutlich verkürzt. Durch den angehängten Parameter wird eine weitere Environment-Variable erzeugt: QUERY_STRING: query=boggit Die Liste der Parameter wird direkt in QUERY_STRING übernommen. Sie läßt sich mit Hilfe von split( &,...) und split( =,...) leicht weiterverarbeiten. 11

Web-Formulare Öffne die Datei form.html mit dem Web-Browser <form action="showenv.cgi" method="get"> Anfrage: <input type="text" name="query"> <br> <input type="submit"> <input type="reset"> </form> Daten werden an showenv.cgi übergeben Methode GET, d.h. Parameter erscheinen im URL Eingabe testen: Ernie & Bert ersetze in form.html Methode GET durch POST Methode GET (gekürzt): SCRIPT_NAME: /showenv.cgi HTTP_REFERER: http://teak.techfak.uni-bielefeld.de:8088/form.html REQUEST_METHOD: GET QUERY_STRING: query=test Ernie & Bert : QUERY_STRING: query=ernie+%26+bert Methode POST: CONTENT_LENGTH: 10 REQUEST_METHOD: POST CONTENT_TYPE: application/x-www-form-urlencoded Die Variable QUERY_STRING ist verschwunden. 12

Auswertung von Web-Formularen immer wiederkehrende Aufgaben/Probleme: Daten können auf verschiedene Arten übertragen werden spezielle Zeichen müssen (de)kodiert werden Antwort muß korrekten header und body enthalten Eingaben müssen vorsichtig ausgewertet werden universeller Helfer: CGI.pm 13

CGI.pm verwenden nochmal aktuelle Uhrzeit: use CGI; my ($sec, $min, $hour) = localtime(time()); my $query=cgi->new; print $query->header("text/plain"); print "It is $hour:$min:$sec\n"; weitere Informationen im header: print $query->header(-type => "text/html", -expires => "+3h"); redirect: print $query->redirect("http://www.uni-freiburg.de"); 14

Aufgaben Schreibe mit Hilfe von CGI.pm ein CGI-Skript, das per Zufall einen redirect auf eine der folgenden Webseiten erzeugt: http://www.google.de/ http://elgoog.rb-hosting.de/ http://www.blug.linux.no/rfc1149/ zufälliger redirect: use CGI; my @urls = ("http://www.google.de/", "http://elgoog.rb-hosting.de/", "http://www.blug.linux.no/rfc1149/"); my $rand = int(rand(@urls)); my $query=cgi->new; print $query->redirect($urls[$rand]); 15

HTML mit CGI.pm erzeugen korrektes HTML, vor allem korrekte Tag-Klammerung: use CGI ":standard"; print header("text/html"), start_html("perl-praxis"), h1("html mit CGI.pm"), p("cgi, das Common Gateway Interface..."), end_html; Import von Symbolnamen bei use prozedurale Verwendung von CGI.pm 16

Aufgaben Ändere das Skript zur Anzeige der aktuellen Uhrzeit so ab, daß mit Hilfe von CGI.pm HTML-Code erzeugt wird. Sieh Dir mit $ GET -e http://vino.techfak...:8088/clock.cgi den header der Antwort an. Sorge dafür, daß die Antwort 10 Sekunden lang im Cache gehalten werden darf. Wie ändert sich der header? Was passiert, wenn Du im Location Bar des Browsers Return drückst? Was passiert, wenn Du die Reload -Funktion des Browsers verwendest? Uhrzeit in HTML: my $query=cgi->new; my ($sec, $min, $hour) = localtime(time()); print header("text/html"), start_html("current time"), h1("it s..."), p("$hour:$min:$sec"), end_html; header der Antwort: Date: Thu, 25 Mar 2004 11:41:33 GMT Content-Type: text/html; charset=iso-8859-1 Client-Date: Thu, 25 Mar 2004 11:41:33 GMT Client-Response-Num: 1 Title: current time Antwort darf 10 Sekunden lang im Cache gehalten werden: print header(-type => "text/html", -expires => "+10s"), zusätzlicher Eintrag im header: Expires: Thu, 25 Mar 2004 11:56:40 GMT Wenn man versucht, die Seite durch drücken von Return im Location Bar neu zu laden, funktioniert das nach frühestens 10 Sekunden. Mit Hilfe der Reload-Funktion kann man diese Zeit abkürzen und die Seite sofort neu laden. 17

Formulare mit CGI.pm erzeugen weitere Eingabemöglichkeiten (formcgi.cgi): print start_form, textfield(-name => "name", -default => "Joe User"), popup_menu(-name => "age", -values => ["-17","18-25","25-35","36+"], -default => "25-35"), scrolling_list(-name => "languages", -values => ["Perl","Java","Haskell"], -default => ["Java","Haskell"], -multiple => "true"), br, submit, reset, end_form; Was passiert beim submit? Sieh Dir den (HTML-)Quelltext der Seite an. Beim submit wird das Formular erneut geladen. Die eingetragenen bzw. ausgewählten Werte bleiben aber erhalten. Im Quelltext sieht man, daß diese als default-werte eingetragen sind: <input type="text" name="name" value="joe User" /> <select name="age"> <option value="-17">-17</option> <option value="18-25">18-25</option> <option selected="selected" value="25-35">25-35</option> <option value="36+">36+</option> </select> <select name="languages" size="3" multiple="multiple"> <option value="perl">perl</option> <option selected="selected" value="java">java</option> <option selected="selected" value="haskell">haskell</option> </select> 18

Parameterübergabe Skript showparams.cgi: my $query=cgi->new; print $query->header("text/plain"); foreach $name ($query->param) { my $val = $query->param($name); print "$name: $val\n"; } probiere URL.../showparams.cgi?query=boggit&answers=10 trage showparams.cgi als action in form.html ein probiere GET und POST als method 19

iterative CGI-Skripte häufig Dialog von Fragen und Antworten komplexere Formulare, Shop-Systeme Zustand muß gespeichert werden ein CGI-Skript mit versteckten Status-Informationen leicht zu überlisten andere (bessere?) Verfahren: Cookies, Session-ID,... 20

iterative CGI-Skripte, cont. Mail-Order-Animals: animal.cgi my $animal = $query->param("animal"); my $color = $query->param("color"); if (!($animal and $color)) { print start_form; if (!$animal) { print "animal: ", textfield(-name => "animal", -default => "tiger"); } elsif (!$color) { print "animal: $animal",br, "color: ", textfield(-name => "color", -default => "yellow"), hidden(-name => "animal"); } print end_form; } else { print p("so you want a $color $animal"); } Das CGI-Skript ruft sich jedesmal selber auf. Falls bereits Daten eingegeben wurden, werden diese in versteckten Formular-Feldern transportiert. Nachdem die Art angegeben wurde, sieht der HTML-Quelltext folgendermaßen aus: <form method="post" action="/animal.cgi" enctype="application/x-www-form-urlencoded"> animal: gnu<br /> color: <input type="text" name="color" value="yellow" /> <input type="hidden" name="animal" value="gnu" /> </form> 21

Aufgaben Schreibe ein CGI-Skript, das folgende Informationen abfragt: Name Textfeld Alter Textfeld optional EMail Textfeld Studiengang NWI / MGS / BIG optional Wiederhole die Eingabe solange, bis alle verpflichtenden Angaben (Name und EMail-Adresse) eingegeben wurden. Implementiere weitere Tests: Das Alter muß eine Zahl zwischen 0 und 120 sein. Die EMail-Adresse muß glaubhaft aussehen, also z.b. ein at-zeichen @ enthalten. ein ganz einfacher Fragebogen: my $name = $query->param("name"); my $age = $query->param("age"); my $email = $query->param("email"); my $stud = $query->param("stud"); my $reload = $query->param("reload"); unless ($name and $email) { print start_form; print "Name: ",textfield(-name => "name"); print strong("bitte den Namen eintragen!") if!$name and $reload; print br, "Alter: ", textfield(-name => "age"); print br, "EMail: ", textfield(-name => "email"); print strong("bitte EMail-Adresse eintragen!") if!$email and $reload; print br, "Studiengang: ", popup_menu(-name => "stud", -values => ["", "NWI", "MGS", "BIG"], -default => ""); print $query->hidden("reload", 1); print br,submit,reset; print end_form; } else { print start_p; print "Hallo $name ($email)."; print " Du bist $age Jahre alt." if $age; print " Du studierst $stud." if $stud; print end_p; } 22