Upload
reto-strope
View
109
Download
0
Embed Size (px)
Citation preview
Spezielle Aspekte der Anbindung von Datenbanken im Web
© Prof. T. Kudraß, HTWK Leipzig
Überblick: Spezielle Aspekte der Datenbankanbindung
Sitzungsverfolgung– Authentifizierung durch Webserver– Versteckte Felder in Formularen– Umschreiben von URLs– Cookies– Sitzungsobjekte
Skalierbarkeit und Wartbarkeit– Trennung von Anwendungs- und Präsentationslogik– Komponententechnologie (Java Beans)– Gestaltung des GUI bei wachsenden Datenmengen
Sicherheit– Zugriffssicherheit– Übertragungssicherheit
© Prof. T. Kudraß, HTWK Leipzig
Problem: Sitzungsverfolgung
HTTP zustandsloses Protokoll vs. Zuordnen mehrerer Interaktionen zu Benutzern
Anwendungen:– Virtueller Warenkorb bei E-Shops– Erstellung von Zugriffsstatistiken zur Analyse des Benutzerverhaltens
Zuordnung mehrerer Anfragen zu einem Web-Client – Erfordert eindeutige Identifikation des Client (Session ID)– Verschlüsselung der Session ID möglich
Methoden:– Authentifizierung durch Webserver– Versteckte Felder in Formularen– Umschreiben von URLs– Cookies– Sitzungsobjekte (möglich bei PHP, JSP)
© Prof. T. Kudraß, HTWK Leipzig
Authentifizierung durch Webserver
Benutzerliste (mit Passwörtern) im Webserver verwaltet Einschränkung der Angebote für Benutzer durch
Zuordnung von Ressourcen zu berechtigten Usern Dateien
– .htaccess: Zugang zu bestimmten Bereichen für identifizierte Benutzer auf Webserver
– .htgroup und .htpasswd: Benutzernamen und Passwörter Benutzername bei jedem Request gesendet (ermöglicht
Zuordnung) Nachteil:
nur anwendbar für angemeldete Benutzer im Web Anforderung:
anonyme Sitzungsverfolgung (ohne explizite Sitzungs-verfolgung)
© Prof. T. Kudraß, HTWK Leipzig
Versteckte Felder in Formularen
Versteckte Formular-Felder (Hidden Fields): Nicht im Browser angezeigt, aber an den Server gesendet
Bei erster Anfrage: Serverseitige Erzeugung einer eindeutigen Sitzungskennung Zurücksendung an den Client Bei weiteren Anfragen
Bei weiteren Anfragen bzw. bei Antworten: Feld mit Sitzungskennung immer mit übertragen
<form><input type="hidden" name="sessionID" value="1ggj534"></form>
Vorteile:– Anonym (d.h. keine explizite Anmeldung erforderlich)– Keine Speicherung im Server erforderlich
Nachteile:– Nur im Zusammenhang mit dynamisch erzeugten Dokumenten einsetzbar– Sitzungskennung kann auf Clientseite manuell verändert werden
© Prof. T. Kudraß, HTWK Leipzig
Umschreiben von URLs (URL Rewriting)
Generierte Sitzungskennung wird bei jeder Anfrage an die URL dynamisch angehängt
Verschiedene Möglichkeiten für URL Rewrite
http://url.de/test/1ggj534
http://url.de/test?sessionID=1ggj5341ggj534
http://url.de/test;$ID$1ggj534
- Anfügen einer zusätzliche Pfadangabe
- Modifizieren der URL
- Anhängen der Sitzungskennung als Parameter
Vorteil– Anonym / unabhängig von Formularen– Erfordert keine Ressourcen auf Client- oder Serverseite
Nachteil– Sitzungsschlüssel in der URL sichtbar (Gefahr der Manipulierbarkeit)
© Prof. T. Kudraß, HTWK Leipzig
Tabelle SESSION_VALUES
Name Null? Typ
SESSION_ID NOT NULL VARCHAR2(255)
SESSION_MATRIKEL NUMBER(7)
SESSION_LASTCHECK TIMESTAMP(6)
SESSION_VALUES VARCHAR2(2000)
© Prof. T. Kudraß, HTWK Leipzig
Beispielprogramm mit Session-Tabelle
-- Passwort auslesenSELECT stud_passwortINTO stud_pwdFROM studentenWHERE stud_matrikel=matrikel;-- ¨Überprüfe ausgelesenes mit übergebenem PasswortIF stud_pwd!=pwd THEN-- Fehlerseite anzeigen psp_sess_error;ELSE sess_id:= to_char(sysdate, ’DDMMYYHH24MISS’)||matrikel;-- nicht gelöschte Sessions desselben Studenten löschen DELETE session_values WHERE session_matrikel = matrikel;-- Einfügen des neuen Datensatzes INSERT INTO session_values VALUES(sess_id, matrikel,SYSTIMESTAMP, null);-- Aufruf der Hauptseite mit ¨Ubergabe der Session-ID psp_sess_form(sess_id);END IF;
© Prof. T. Kudraß, HTWK Leipzig
Prozedur SessionCheck-- Lesen des letzten Checks aus der Tabelle SELECT session_matrikel, session_lastcheck INTO matrikel, lastcheck FROM session_values WHERE session_id = sess_id;-- Aktuelle Zeit ermitteln SELECT SYSTIMESTAMP INTO current_time FROM DUAL;
-- Ermitteln der Differenz der beiden ZeitenSELECT substr((current_time-lastcheck), instr((current_time-lastcheck),’ ’)+4,2), substr((current_time-lastcheck), instr((current_time-lastcheck),’ ’)+1,2), trunc(to_number(substr((current_time-lastcheck),1, instr(current_time-lastcheck,’ ’)))), trunc(to_number(substr((current_time-lastcheck),1, instr(current_time-lastcheck,’ ’)))/7) INTO minuten, stunden, tage, wochen FROM DUAL;
© Prof. T. Kudraß, HTWK Leipzig
Prozedur SessionCheck (Forts.)-- Wenn Differenz kleiner als 16 Minuten, ist Session gültig IF (wochen=0 AND tage=0 AND stunden=0 AND minuten<16) THEN -- aktuellen Zeitstempel in Sitzungstabelle einfügen UPDATE session_values SET session_lastcheck = SYSTIMESTAMP WHERE session_id = sess_id; ELSE -- Sitzung ist ung¨ultig, l¨osche Datensatz DELETE session_values WHERE session_id = sess_id; -- Anzeigen, dass Session abgelaufen ist RAISE err_timeout; END IF;-- Matrikelnummer zurückgebenRETURN matrikel;
Aufruf der Prozedur Sessioncheck in jeder Seite, die vom Studenten aufgerufen wird
<% -- Sessioncheck matrikel := psp_sessioncheck(sess_id); IF matrikel<0 THEN return; END IF;%>
© Prof. T. Kudraß, HTWK Leipzig
HTTP-Cookie
Unabhängig vom eigentlichen HTML-DokumentBestandteil der Meta-Information zu einer HTML-Seite
– zwischen Webserver und Browser ausgetauscht– im Browser gespeichert (temporär oder persistent in einer Datei)
Erstellen eines Cookie: Set-Cookie-Anweisung im HTTP-Header bei Server Response
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
NAME=VALUE: Name-Wert-Paar mit Namen des Cookies und Wert, der gespeichert werden soll
Expires: Zeitangabe in Sekunden, innerhalb der das Cookie gültig istDomain: Name der Internet-Domain, in der das Cookie erzeugt wurdePath: Unterpfad für die Domain, in der das Cookie gültig istSecure: Wenn gesetzt, wird das Cookies nur über HTTPS-Verbindung
übertragen
© Prof. T. Kudraß, HTWK Leipzig
HTTP-Cookie
Einschränkungen:– Maximale Größe 4 KB– Maximale Anzahl von Cookies im Browser des Clients 30 – Pro Server bzw. Domäne max. 20 Cookies erlaubt– Cookies nur von der Domäne lesbar, von der sie erzeugt
wurden Löschen:
– Setzen mit leerem Wert (kein explizites Löschen) Speicherung von Sitzungsdaten
– IP-Adresse des HTTP-Client reicht nicht aus– neben Session-ID weitere Statusinformationen– Serverseitige Speicherung (DB) vs. Speicherung mehrerer
Werte in Cookies
© Prof. T. Kudraß, HTWK Leipzig
HTTP-Cookie Bewertung
Vorteile:– Automatische Unterstützung durch den Browser– Einsatz unanhängig von der Kodierung in einer
HTML-Seite– Bei gleichzeitiger Verwendung mehrerer Cookies
Speicherung vieler Informationen möglich– Anwendung bei E-Shops: Speichern von Waren-
korbinhalten (Session ID)Nachteile
– Nicht von allen Browsern unterstützt– Benutzer kann Cookies abschalten bzw.
verweigern
© Prof. T. Kudraß, HTWK Leipzig
Cookies in PHP
Methode setcookie zum Setzen eines Cookies Syntax
bool setcookie ( string name [,string value [. Int expire [, string path [, string domain [, int secure]]]]])
Beispiel: Zuweisung der Matrikel-Nr. als Session-ID
setcookie ($sess_id, $matrikel, time()+3600, “/“);
Auslesen eines Cookies
$sess_id = $_GET["sess_id"];if (isset($_COOKIE[$sess_id])) {$matrikel = $_COOKIE[$sess_id];
© Prof. T. Kudraß, HTWK Leipzig
Cookies in PSP
Package owa_cookies mit Datentyp cookie
type cookie is RECORD ( name varchar2(4000), vals vc_arr, num_vals integer);
Senden eines Cookies
Auslesen eines Cookies
owa_cookie.send( name in varchar2, value in varchar2, expires in date DEFAULT NULL, path in varchar2 DEFAULT NULL, domain in varchar2 DEFAULT NULL, secure in varchar2 DEFAULT NULL);
© Prof. T. Kudraß, HTWK Leipzig
Cookies in PSP (Forts.)
Erzeugung eines Cookies mit dem Namen einer Session-ID und zugehöriger Matrikel-Nr
OWA_UTIL.MIME_HEADER(’text/html’, FALSE);OWA_COOKIE.send(sid, matrikel, Sysdate + 1);OWA_UTIL.HTTP_HEADER_CLOSE;
Prüfe Existenz eine Cookies
Beispiel
owa_cookie.get(name in varchar2) return cookie;
cookie := owa_cookie.get(sid);
if (cookie.num_vals >0) THEN matr := cookie.vals(1);ELSE return;END IF;
© Prof. T. Kudraß, HTWK Leipzig
Cookies in JSP / Servlets
Klasse Cookie zum Setzen und Lesen von Cookie-Werten (aus dem Paket javax.servlet.http)
Erzeugung eines Cookies: neues Objekt der Klasse Cookie mit einem Name-Wert-Paar
sess_id = new Integer((request.getRemoteAddr()+matrikel).hashCode()).toString();
Cookie cookie = new Cookie(sess_id, new Integer(matrikel).toString());// Setze Lebensdauer in SekundenCookie.setMaxAge(3600*24)
Einfügen des Cookie-Objeks in den HTTP-Header
Response.addCookie(cookie)
Cookie[] cookies = request.getCookies();for (int i=0;i<cookies.length;i++) { if (cookies[i].getName().equalsIgnoreCase(sess_id)) { matrikel = (new Integer(cookies[i].getValue())).intValue(); break; }}
Lesen der Werte eines Cookies
© Prof. T. Kudraß, HTWK Leipzig
Sessions in PHP
Session-Objekte Alternative zu Cookies erzeugte Session-ID im Cookies speichern oder innerhalb URL übertragen
session_start();
$matrikel = $_POST["matrikel"];if (!session_is_registered ("matrikel")) { session_register ("matrikel");}
globales Array $_SESSION zur Speicherung von Werten (Speicherung in DB möglich) - Alternative zu Cookies
Beispiel: Speicherung der Variablen Matrikel in der Session
Zugriff auf bereits erstellte Sitzung<?php session_start(); if (session_is_registered ("matrikel")) { $matrikel = $_SESSION[’matrikel’]; }?>
© Prof. T. Kudraß, HTWK Leipzig
Sessions in Servlets
Sitzungsobjekte speichern Informationen zu einer Sitzung im Webserver Realisierung: HttpSession-Interface des javax.servlet.http-Pakets
HttpSession session = request.getSession(true)
public void setAttribute(String name, Object wert)public Object getAttribute(String name)void removeAttribute(String name)public Enumeration getAttribute()
nur Übertragung der Sitzungskennung: über Cookies oder URL-Rewriting (Methode encodeURL) – abhängig ob Client Cookies senden kann
Methoden zur Speicherung und zum Zugriff auf Sitzungsobjekte
Gestartete Sitzung durch Aufruf der invalidate()-Methode der Klasse HttpSession beenden
Timeout-Werte setzen zum automatischen Beenden der Sitzung im Server mittels setMaxInactiveInterval(int sekunden)
© Prof. T. Kudraß, HTWK Leipzig
Sessions in Servlets – Beispiel
Erzeugen einer Sitzung in der doGet()-Methode und Festlegung Timeout
// neue Session erstellen, wenn noch keine existiertHttpSession session = request.getSession(true);// Sessiongültigkeit auf 15 Minuten setzensession.setMaxInactiveInterval(60*15);
matrikel = new Integer(request.getParameter("matrikel")).intValue();pwd = request.getParameter("pwd");
Passwort für Matrikelnummer ermitteln und mit Passwort der Anfrage vergleichen Bei Übereinstimmung Werte für Studenten im Sitzungsobjekt speichern
Übergabeparameter aus Request-Objekt lesen
pstmt = conn.prepareStatement("SELECT stud_name, stud_vorname, stud_passwort "+"FROM studenten "+"WHERE stud_matrikel=?");// Matrikelnummer an Parameter bindenpstmt.setInt(1,matrikel);rset = pstmt.executeQuery();
© Prof. T. Kudraß, HTWK Leipzig
Sessions in Servlets – Beispiel (2)
String pwd_db=null;// Passwort aus Resultset lesenif (rset.next()) { pwd_db = rset.getString("stud_passwort");}//Vergleich der Passwörterif (pwd_db != null && pwd.equals(pwd_db)) { pwd_korrekt = true; vorname = rset.getString("stud_vorname"); name = rset.getString("stud_name");// Speicherung der Werte im Sessionobjekt mit setAttribute session.setAttribute("vorname", vorname); session.setAttribute("name", name); session.setAttribute("matrikel",new Integer(matrikel));}
© Prof. T. Kudraß, HTWK Leipzig
Sessions in Servlets – Beispiel (3)
Zugriff auf das Sitzungsobjekt mit seinen gespeicherten Werten möglich
// Session anfordernHttpSession session = request.getSession(true);// Sessiong¨ultigkeit erneuernsession.setMaxInactiveInterval(60*15);// Lesen der Matrikelnummer mit getAttributeif (session.getAttribute("matrikel")!=null) matrikel = ((Integer)session.getAttribute("matrikel")).intValue();else matrikel = -1;
Funktionen auch in JSP anwendbar Implementierung von Sessions in JSP weniger aufwendig, da Seiten, die an einer Session teilnehmen sollen, über das session-Attribute hinzugefügt werden können
<%@ page session="true" %> Zugriff auf das implizite HttpSession-Objekt möglich (setAttribute, getAttribute) Sparsamer Umgang mit Ressourcen im Webserver → Timeout verwenden!
© Prof. T. Kudraß, HTWK Leipzig
Skalierbarkeit und Wartbarkeit
Weiterentwicklung von Web-Anwendungen bei neuen Anforderungen
Wachsende Anzahl von Benutzern und Anfragen Wartbarkeit des Codes Verschiedene Rollen: Webdesigner, Anwendungs-
programmierer Trennung Anwendungs- und Präsentationslogik (vgl. 3-
Schichten-Architektur)– reine HTML-Dateien im Webserver speichern– PHP: Einbindung zusätzlicher Dateien mittels include()- oder
require()-Methoden (darin enthalten: HTML-freie Funktionen)– PSP: Include-Dateien (bei Übersetzung)– Servlets: Klassen (für Anwendungslogik)
Flexible Präsentation (Nutzung XML-Technologie)
© Prof. T. Kudraß, HTWK Leipzig
Trennung von Anwendungs- und Präsentationslogik in PSP
Datenbanklogik in PL/SQL Prozeduren, die unabhängig von anderen PSP-Dateien in der Datenbank gehalten werden
Beispiel: Wiederverwendung von Seitenköpfen durch Prozedur html_header
<BODY><% html_header(’Titel’); %>[...]</BODY>
<%@ plsql procedure="html_header" %><%@ plsql parameter="title" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head> <title><%=title%></title> <link rel="STYLESHEET" type="text/css" href="/stylesheets/STYLE.CSS"></head><body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0"><div align="center">
© Prof. T. Kudraß, HTWK Leipzig
JSP und Java Beans
Auslagerung von Logik (z.B. Kommunikation mit der DB) in Java Beans
Beispiel-Szenario: Login eines Benutzers und Anzeige der eingeschriebenen Kurse
StudentBean: Ausgabe des Namens des angemeldeten Studenten
KurslistBean: Liste der vom Studenten gewählten Kurse
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: StudentBean Klasse StudentBean stellt Methoden zum Öffnen und Schließen der DB zur
Verfügung
public void valueBound(HttpSessionBindingEvent e){ try { // Herstellung einer Datenbankverbindung DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); conn = DriverManager.getConnection(url, "username", "password"); } catch (SQLException ex) { }}
public void valueUnbound(HttpSessionBindingEvent e){ try { // Schließen der Datenbankverbindung conn.close(); } catch (SQLException ex) { // Fehlerbehandlung }}
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: StudentBean (2) Initialisierung der Bean für einen bestimmten Studenten erfordert Übergabe der
Matrikel-Nr.
// private Variable, auf die über public Methoden zugegriffen wirdprivate int matrikel = -1;
public int getMatrikel() {return matrikel;}
public void setMatrikel(int matrikel) { this.matrikel = matrikel; try { pstmt = conn.prepareStatement("SELECT stud_name, stud_vorname "+ "FROM studenten "+ "WHERE stud_matrikel=?"); pstmt.setInt(1,matrikel); // Query ausführen und Ergebnis zuweisen rset = pstmt.executeQuery(); // Resultset auslesen if (rset.next()) { vorname = rset.getString("stud_vorname"); name = rset.getString("stud_name"); }[. . .]
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: StudentBean (3)
private String name="";private String vorname="";
public String getName(){ return name;}
public String getVorname(){ return vorname;}
Daten des Studenten (Name, Vorname) in privaten Variablen get-Methoden zum Lesen
Methode validPasswort(String pwd): Test, ob übergebener String mit dem Passwort des Studenten in Studententabelle übereinstimmt (Quellcode siehe Beispiel-Software)
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: Aufruf StudentBean
<jsp:useBean id="student" scope="session" class="mypackage1.StudentBean"/>
Einbinden einer Java Bean in eine JSP mittels JSP-Tag jsp:useBean– Klasse des Bean – Gültigkeitsbereich (Scope)– ID, über die das Bean auf der ganzen Seite angesprochen werden kann
Automatischer Aufruf der valueBound-Methode des Beans und Herstellung der DB-Verbindung
Initialisierung des Beans mit der Matrikel-Nr. durch Aufruf von setMatrikel
Student.setMatrikel(matrikel);
Abfrage der Studenteninformation und Belegung der privaten Variablen für Vor- und Nachname
Zugriff auf diese Daten über getProperty-Tag auf die get-Methoden
<title>Hallo <jsp:getProperty name="student" property="vorname"/> <jsp:getProperty name="student" property="name"/></title>
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: KurslistBean KurslistBean dient der Ausgabe einer Tabelle mit allen Kursen eines Studenten
enthält Methode setMatrikel zur Initialisierung des Bean mit einer Matrikel-Nr.
public void setMatrikel(int matrikel) {[...]pstmt = conn.prepareStatement("SELECT kurs_id, kurs_name "+
"FROM kurse LEFT JOIN teilnehmer "+"ON kurs_id = teiln_kurs_id_fk "+"WHERE teiln_smatrikel_fk = ?");
// Matrikel an Parameter bindenpstmt.setInt(1,matrikel);rset = pstmt.executeQuery();// Ausgabestring für Tabelleausgabe = "";while (rset.next()) { ausgabe += "<tr>"+
"<td class=\"inner\">"+ "<a href=jsp_session_details.jsp?kurs_id="+
rset.getString("Kurs_ID")+">"+rset.getString("Kurs_Name")+"</a></td>"+
"</tr>";}[...]
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: KurslistBean (Forts.)
für Ausgabezeichenkette wird eine get-Methode erstellt, die den String zurück-liefert
durch Einbinden mittels jsp:getProperty Tag kann die getAusgabe()-Methode aufgerufen werden → Ausgabe der Tabellenzeilen innerhalb JSP-Datei
<tr><th class="inner" colspan="3">Sie sind eingeschrieben in:</th></tr> <jsp:getProperty name="kursliste" property="ausgabe"/>
Model-View-Controller (unabhängig von verwendeter Technik)
1. Model: Anwendungslogik mit Kommunikation zur Datenbank
2. View: Benutzerschnittstellen mit llen Ausgaben
3. Controller: Weiterleiten von Anfragen des Clients an die entsprechenden Objekte
© Prof. T. Kudraß, HTWK Leipzig
Skalierbarkeit des User Interface bei wachsendem Datenvolumen
Entwurf des GUI muß späteres Datenaufkommen beeachten
Verfügbare Objekte– Combo-Boxen, die dynamisch mit Daten aus der
Datenbank gefüllt werden werdne können– Checkboxen oder Radio Buttons für die Auswahl
bestimmter Werte– Tabellen für die Darstellung von Datenmengen– Listen für die Auswahl von Werten (in Verbindung
mit Links)
© Prof. T. Kudraß, HTWK Leipzig
Bewertung der GUI-Elemente
Checkboxen / Radion Buttons– Nur für die Darstellung weniger Daten (fehlender Scrollbalken)– Checkboxen sehr gut geeignet für variable Anzahl anzuzeigender
Felder (Spalten) Tabellen
– strukturierte Auflistung von Datensätzen– für viele Sätze geeignet– einige Elemente können mit Hyperlinks versehen werden
Comboboxen– Auswahlbox für wenige Werte– bei alphabetischer Ordnung auch für viele Auswahlwerte– Vorteil: geringer Platzbedarf, da immer nur ein Wert sichtbar
Auswahllisten– Syntax wie Comboboxen, aber Anzeige mehrer Werte– Darstellung vieler Werte möglich (Scrollbar)
© Prof. T. Kudraß, HTWK Leipzig
Beispiel zur Verwendung von Comboboxen
Geeignet für Darstellung von Master-Detail-Beziehungen – auch bei größerem Datenaufkommen
Auch Selektion mit mehreren Werten möglich Beispiel: Auswahl eine Kursleiters → Auswahl eines Kurses des
gewählten Kursleiters → Anzeige der Teilnehmer des Kurses
© Prof. T. Kudraß, HTWK Leipzig
Zugriffssicherheit
Benutzgruppen in Beispiel-Anwendung– anonyme Benutzer (ohne Anmeldung):
Informationen über Kurse– Studenten (angemeldete Benutzer):
Einschreibungen in Kurse– Kursleiter und Professoren: Pflege der Kursdaten– Administrator: neue Kursleiter,
Einschreibezeiträume, Zugriff auf sämtliche Daten Authentifizierung
– mittels Webserver– Umsetzung innerhalb der Anwendung
© Prof. T. Kudraß, HTWK Leipzig
Umsetzung im Webserver
Verzeichnisse oder einzelne Dokumente nur für bestimmte Benutzer zugänglich machen
Mehrere Authentifizierungs-Schemata in HTTP-Spezifikation, i.allg. BASIC: Bereiche (Realms), Gruppen, Benutzer
Speicherung der Informationen in Dateien im Webserver– .htaccess: geschützte Bereiche der Webanwendung– .htgroup und .htpasswd: verwaltet Benutzernamen und Passwörter
Keine dynamische Registrierung von Benutzern möglich
© Prof. T. Kudraß, HTWK Leipzig
Umsetzung im Programm
erfordert Umsetzung eines Session-Konzepts Benutzerkennung bei jeder Anfrage übertragen oder innerhalb der
Anwendung persistent halten Unterscheidung der Benutzergruppen DB-seitig unterstützen Bei Seitenaufruf: Session noch aktiv? Benutzer in berechtigter
Gruppe? Beispiel (PSP): Benutzeranmeldung und Kontrolle der
Berechtigung für Kursleiter
sid:= to_char(sysdate, ’DDMMYYHH24MISS’)||matrikel;
-- erzeuge Cookie mit SessionID und IDOWA_UTIL.MIME_HEADER(’text/html’, FALSE);OWA_COOKIE.send(sid, id, Sysdate + 1);OWA_UTIL.HTTP_HEADER_CLOSE;
© Prof. T. Kudraß, HTWK Leipzig
Umsetzung im Programm (Beispiel)
Mit der aus Cookie gewonnen ID aus DB ermitteln, ob Benutzer als Kursleiter berechtigt ist
cookie := owa_cookie.get(this_sid);
IF (cookie.num_vals >0) THEN id := cookie.vals(1); SELECT COUNT(kl_id) INTO anzahl FROM kursleiter WHERE kl_id=id; IF (anzahl=0) return;ELSE return;END IF;
© Prof. T. Kudraß, HTWK Leipzig
Authenticate Header (in PHP)
<?phpfunction authenticate() { header("WWW-Authenticate: Basic realm=\"Geschuetzter Bereich\""); header("HTTP/1.0 401 Unauthorized");
# Text der bei Scheitern oder Abbruch erscheintecho "Anmeldung gescheitert: Benutzername und Passwort erforderlich";
exit;}
if(!isset($_SERVER['PHP_AUTH_USER'])) { authenticate(); } else { # Verbindung zur Datenbank herstellen
# username und passwort setzen $conn = ocilogon("username","passwort","sample") or die("Keine Verbindung zum Datenbank-Server!!!");
# Matrikel ist Nutzername $matrikel=$_SERVER['PHP_AUTH_USER'];
© Prof. T. Kudraß, HTWK Leipzig
Authenticate Header (Forts.) # Statement für Abfrage erstellen $stmt = OCIParse($conn,"SELECT * ". "FROM Studenten ". "WHERE Stud_Matrikel=".$matrikel. " AND Stud_Passwort='".$_SERVER['PHP_AUTH_PW']."'");
# Abfrage ausführen ociexecute($stmt);
# Anzahl der Ergebnisdatensätze holen $anzahl = ocifetchstatement($stmt, $arr_bestellung); # Ressource freigeben und Verbindung zur Datenbank schließen ocifreestatement($stmt); ocilogoff($conn);
# Wenn kein Datensatz in Tabelle gefunden, # erneut Authentifizierung starten if($anzahl==0) { authenticate(); } else echo "Authentifizierung erfolgreich."; }?>
© Prof. T. Kudraß, HTWK Leipzig
Verschlüsselung
Verschiedene Pakete und Algorithmen für Speicherung vertraulicher Daten in verschlüsselter Form
Beispiel: PL/SQL Package DBMS_OBFUSCATION_TOOLKIT – Nutzt symmetrische Verfahren (d.h. gleicher Schlüssel für Ver- und
Entschlüsselung)– Verfahren
DES (Data Encryption Standard) Triple DES Algorithmus
– 2 Funktionen zur Ver- bzw. Entschlüsselung (VARCHAR- oder RAW-Parameter)
Verschlüsselung im Server– Verhindere unbefugte SELECT-Zugriffe – Übertragung über ein sicheres Protokoll
Weitere Option: Speicherung des Schlüssels im Dateisystem des Servers
© Prof. T. Kudraß, HTWK Leipzig
Beispiel-Prozedur encrypt
CREATE OR REPLACE PROCEDURE encrypt(matrikel number, passwort varchar2)IS eingabe_string VARCHAR2(24); -- Schlüssel zur Vereinfachung festgelegt, sollte -- aus Datenbank oder Datei gelesen werden schluessel VARCHAR(8) := 'schluess';
encrypted_string VARCHAR2(2048);BEGIN -- Auffüllen des Passworts auf 24 Zeichen eingabe_string := rpad (passwort, 24); dbms_obfuscation_toolkit.DESEncrypt( input_string => eingabe_string, key_string => schluessel, encrypted_string => encrypted_string);
UPDATE studenten SET stud_passwort_encrypt = encrypted_string WHERE stud_matrikel = matrikel;END;
© Prof. T. Kudraß, HTWK Leipzig
Beispiel-Prozedur decryptCREATE OR REPLACE PROCEDURE decrypt(matrikel IN NUMBER, decrypted_string OUT VARCHAR2)IS -- Schlüssel zur Vereinfachung festgelegt, sollte -- aus Datenbank oder Datei gelesen werden schluessel VARCHAR(8) := 'schluess';
encrypted_string VARCHAR2(24);BEGIN -- Lesen des verschlüsselten Passworts aus Tabelle SELECT stud_passwort_encrypt INTO encrypted_string FROM studenten WHERE stud_matrikel = matrikel;
--Entschlüsselung dbms_obfuscation_toolkit.DESDecrypt( input_string => encrypted_string, key_string => schluessel, decrypted_string => decrypted_string);
-- aufgefüllte Leerzeichen entfernen decrypted_string := rtrim(decrypted_string);END;
© Prof. T. Kudraß, HTWK Leipzig
Anwendung der Ver- und Entschlüsselung
Verschlüsselung beim Eintragen der Werte für einen Studenten Ermittlung des verschlüsselten Passworts für übergebene
Matrikel-Nr Aktualisiere Datensatz durch encrypt-Prozedur
-- Eintragen der Studentenwerte INSERT INTO studenten (stud_matrikel, stud_name, stud_vorname, stud_email, stud_gebdat, stud_studiengang) VALUES (stud_matrikel, stud_name, stud_vorname, stud_email, stud_gebdat, stud_studiengang);-- Aufruf der Verschlüsselungsprozedur encrypt(stud_matrikel, stud_passwort);
Einloggen mit Eingabe Passwort Vergleiche mit gespeichertem Passwort
-- verschlüsseltes Passwort lesendecrypt(matrikel, stud_pwd);
© Prof. T. Kudraß, HTWK Leipzig
Übertragungssicherheit
Vertrauliche Daten bei Übertragung vom Client zum Server und zurück schützen
Protokoll HTTPS (S = Secure) SSL (Secure Socket Layer) zur Verschlüsselung - ein
Protokoll in der Transportschicht von TCP/IP Oracle unterstützt HTTPS durch den integrierten
Apache HTTP-Server URLs, die verschlüsselte Verbindung nutzen mit
Präfix https:// SSL-Handshake-Protokoll zum Aufbau einer
gesicherten Verbindung
© Prof. T. Kudraß, HTWK Leipzig
Verbindungsaufbau über HTTPS
1.Client sendet Verbindungsanfrage an Server und übermittelt, welche kryptographischen Verfahren für die Verschlüsselung unterstützt werden
2.Server wählt Verfahren aus und generiert öffentlichen und privaten SchlüsselZurücksenden des öffentlichen Schlüssels mit einem Zertifikat zur Authentifizierung des Servers
3.Client generiert Sitzungsschlüssel und verschlüsselt diesen mit öffentlichem SchlüsselZurücksenden des verschlüsselten Sitzungsschlüssels mit verschlüsselten Testnachrichten an den Server
4.Server entschlüsselt Sitzungsschlüssel mit seinem privaten Schlüssel und kann damit auch die Testnachrichten dechiffrierenZuücksenden der entschlüsselten Testnachricht an den Client als Bestätigung für korrekte Übertragung des Schlüssels