Unterlagen zur ersten Einheit

Werbung
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)
Herunterladen