Ablauf Vertiefendes Übungsprojekt - SQL II Albert Weichselbraun I Ablauf der Lehrveranstaltung I Vorstellung des Projektthemas I Projektgruppen I Vorstellung der Arbeitsumgebung (Software, Locations) Walkthrough I I I I I Ablauf der Lehrveranstaltung Software Projekt I I Projektphasen entsprechend SA/SD Modell Präsentation / Diskussion I I I I Problemdefintion/Use Cases ER-Modell/DB-Design Implementierung Abnahme und Präsentation I I Benutzerdokumentation Work Reports (wer hat was gemacht) Datenbankentwurf Formulare PHP Security Wichtige Termine I 11. Mai 2011: Vorbesprechung, Gruppeneinteilung und Projektvergabe I 18. Mai 2011: Präsentationen/Besprechung: Problemdefinition und Use Case Diagramme; ER-Modelle, DB-Design I 25. Mai 2011: Interface/Implementierung I 1. Juni 2011: Interface/Implementierung I 8. Juni 2011: Interface/Implementierung I 15. Juni 2011: Abschlusspräsentation und Projektübergabe Beurteilungsschema Vorstellung der Arbeitsumgebung I I I I 20 % Mitarbeit, Präsentation 80 % Projekt (Usability, Datenbankdesign/Performance, Security) I I I 30 % Projektdokumentation 40 % Ausführung 10 % Endpräsentation Walkthrought I Problemdefintion I Durchführbarkeitsstudie → UML Use-Case Diagramme + Bewertung → muss klar werden was zu tun ist! I Analyse (ER-Modell) I Design (Datenbank, Interface), Business Logic Implementierung: I I I I Software im Schulungsraum (dia, kate, psql ...) Verlinken des Arbeitsverzeichnisses: ln -s ~aweichse/public_html/projects/2011s/sql2/{gruppe} sql2 I Struktur: I I I I Zugriff: I über das Web: I http://xmdimrill.ai.wu.ac.at/weichselbraun/projects/2011s/sql2/{gruppe} von Extern: ssh [email protected] Datenbankentwurf I Ausgangspunkt: ER-Modell I Alle Tabellen sind zu normalisieren Indices für abfragerelevante Felder (!= Datum, ...) I I I I UNIQUE in Tabellendefition CREATE INDEX Business Logic I Datenbank + Constrains erstellen Formulare (vorzugewiese HTML + CSS, eventuell Swing) Dokumentation (Benutzer, Projekt, Installation, Work Reports) Application : ./index.php Administration: ./admin Dokumentation : ./projekt Constraints I I I NOT NULL, CHECK, Fremd-/Primärschlüssel ON DELETE, ON UPDATE Datentypen Benutzerinterface I HTML-Head < html > < head > < link rel = " stylesheet " href = " style . css " type = " text / css " / > < meta http - equiv = " Content - Type " content = " text / html ; charset = utf8 " / > < title > PHP Test </ title > </ head > Text Encoding: UTF8 1 2 < meta http - equiv = " Content - Type " content = " text / html ; charset = utf8 " / > I Layout: Cascade Style Sheets (CSS) I HTML-Formulare <FORM>, <INPUT>, <SELECT> I Übergabe der Variablen an/von PHP (POST/GET) HTML-Formulare body a a : active h1 input . url 2 < body > < h1 > TestFormular </ h1 > 2 3 4 4 5 6 7 8 9 < form > Name : < input name = " name " / > Url : < input name = " url " / > < br / > < input type = " submit " value = " Abschicken " name = " fertig " / > </ form > 5 6 7 8 10 11 12 11 </ body > 13 14 13 </ html > background : # FFFFFF ; } color : #0000 FF ; } color : #000000;} font - family : helvetica ; color : blue ;} background : lightgrey ; } Übergabe von Variablen 1 1 { { { { { 15 16 17 < html > < head > < link rel = " stylesheet " href = " style . css " type = " text / css " / > < meta http - equiv = " Content - Type " content = " text / html ; charset = utf8 " / > < title > Summenberechnung </ title > </ head > < body > <h3 > Summe : </ h3 > < form action = " <?= $_SERVER [ ’ PHP_SELF ’]? > " > < input name = " a1 " value = " <?= $_REQUEST [ ’ a1 ’]? > " / > < input name = " a2 " value = " <?= $_REQUEST [ ’ a2 ’]? > " / > < br / > < input type = " submit " value = " Summe " / > </ form > Übergabe von Variablen <h3 > Ergebnis </ h3 > <? php $a1 = $_REQUEST [ ’ a1 ’ ]; $a2 = $_REQUEST [ ’ a2 ’ ]; if ( $a1 and $a2 ) { $sum = $a1 + $a2 ; echo " Die Summe von $a1 und $a2 ist : $sum " ; } ?> 19 20 21 22 23 24 25 26 27 29 30 </ body > </ html > Sessions 1 2 3 4 5 6 7 8 9 10 PHP + PostgreSQL 2 3 Vorgangsweise: 1. Datenbankverbindung mit pg connect herstellen. 2. Query vorbereiten und absetzen. 3. Auf Fehler prüfen / Resultate ausgeben. I I I Wiederkehrende Queries ⇒ pg prepare + pg execute. Einfache Queries ⇒ pg query params. Queries ohne Benutzereingaben im Querytext ⇒ pg query. Benutzer bekommt eine eindeutige Id. I Variablen serverseitig(!) speicherbar <? php session_start (); if (! isset ( $_SESSION [ ’ count ’ ])) { $_SESSION [ ’ count ’] = 0; } else { $_SESSION [ ’ count ’ ]++; } ?> Diese Seite wurde <?= $_SESSION [ ’ count ’]? > mal angesehen . PHP + PostgreSQL 1 I I 4 5 6 7 8 10 11 12 13 14 15 17 18 < html > < head > < link rel = " stylesheet " href = " style . css " type = " text / css " / > < meta http - equiv = " Content - Type " content = " text / html ; charset = utf8 " / > < title > PHP Test </ title > </ head > < body > <h3 > PHP Test </ h3 > <? php if ( $_REQUEST [ ’ company_id ’ ]) { $company_id = $_REQUEST [ ’ company_id ’ ]; } $db = pg_connect ( " host = xmdimrill dbname = weblyzard user = albert password = xyz " ); PHP + PostgreSQL $result = pg_query_params ( $db , " SELECT company_id , name , url FROM company WHERE company_id = $1 LIMIT 1 " , array ( $company_id )); 20 21 22 23 PHP + PostgreSQL while ( $row = pg_fetch_row ( $result ) ) { echo " <tr > < td > $row [0] </ td > </ tr > " ; echo " <td > < input name =\" name \" size =40 value =\" $row [1]\" / > </ td > </ tr > " ; echo " <td > < input name =\" url \" size =40 value =\" $row [2]\" / > <a href =\" $row [2]\" >[ x ] </a > </ td > </ tr > " ; } 37 38 39 40 41 if (! $result ) { echo " No records present " ; exit ; } 25 26 27 28 // Output Table Header echo " < table > " ; echo " <tr > < th > Id </ th > < th > Company Name </ th > " ; echo " <th > Company Url </ th > </ tr > " ; 30 31 32 33 42 43 44 45 48 50 51 52 Security // Table footer echo " </ table > " ; 47 ?> </ body > </ html > Datenbank Passwort I Why security matters I Datenbank Passwort I PHP Security Issues (Global Variables), inc-Files (- .php!) 1 I SQL Injection 2 3 4 I Jede Gruppe erhält einen Benutzer und Passwort für die PostgreSQL Datenbank I Passwort Location: außerhalb des Apache-Trees function getDb () { return pg_connect ( " host = localhost dbname = mdb user = albert password = xyz " ); } PHP Security Issues Dangerous register globals aktiviert. 1 I PHP Include Dateien I I Endung: .php Kritische Dateien: ausserhalb des für den Webserver lesbaren Bereiches I Übergebene Variablen immer aus dem $ REQUEST Array auslesen. I register globals aktiviert → Manipulationen einfacher Correct 2 3 4 6 7 <? php if ( $username == ’ toni ’ and $pwd == ’ secret ’) $authorized = true ; ?> <? php if (! $authorized ): ? > <! - - Formular : Eingabe Benutzer + Passwort --> 10 <? php else : ? > <! - - Geheime Informationen --> 12 <? php endif ; ? > 9 SQL Injection register globals deaktiviert. 1 2 3 4 5 6 8 9 <? php $username = $_REQUEST [ ’ username ’ ]; $password = $_REQUEST [ ’ pwd ’ ]; if ( $username == ’ toni ’ and $pwd == ’ secret ’) $authorized = true ; ?> <? php if (! $authorized ): ? > <! - - Formular : Benutzername / Passwort --> 12 <? php else : ? > <! - - Geheime Informationen --> 14 <? php endif ; ? > 11 I I Benutzereingaben in Queries Gegenmaßnahmen: I I Prüfen der Benutzereingaben Verwendung von pg query params (preferred)