Spezielle Aspekte der Anbindung von Datenbanken im Web
Spezielle Aspekte der Anbindung von Datenbanken im Web
© Prof. T. Kudraß, HTWK Leipzig Überblick: Spezielle Aspekte der Datenbankanbindung l Sitzungsverfolgung – – – l Skalierbarkeit und Wartbarkeit – – – l Authentifizierung durch Webserver Versteckte Felder in Formularen Umschreiben von URLs Cookies Sitzungsobjekte 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 l l HTTP zustandsloses Protokoll vs. Zuordnen mehrerer Interaktionen zu Benutzern Anwendungen: – – l Zuordnung mehrerer Anfragen zu einem Web-Client – – l Virtueller Warenkorb bei E-Shops Erstellung von Zugriffsstatistiken zur Analyse des Benutzerverhaltens 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 l l l Benutzerliste (mit Passwörtern) im Webserver verwaltet Einschränkung der Angebote für Benutzer durch Zuordnung von Ressourcen zu berechtigten Usern Dateien – – l l l . 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 Sitzungsverfolgung)
© Prof. T. Kudraß, HTWK Leipzig Versteckte Felder in Formularen l l l 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 bzw. bei Antworten: Feld mit Sitzungskennung immer mit übertragen <form> <input type="hidden" name="session. ID" value="1 ggj 534"> </form> l Vorteile: – – l 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) l l Generierte Sitzungskennung wird bei jeder Anfrage an die URL dynamisch angehängt Verschiedene Möglichkeiten für URL Rewrite - Anfügen einer zusätzliche Pfadangabe http: //url. de/test/1 ggj 534 - Anhängen der Sitzungskennung als Parameter http: //url. de/test? session. ID=1 ggj 534 - Modifizieren der URL http: //url. de/test; $ID$1 ggj 534 l Vorteil – – l 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 VARCHAR 2(255) SESSION_MATRIKEL NUMBER(7) SESSION_LASTCHECK TIMESTAMP(6) SESSION_VALUES VARCHAR 2(2000)
© Prof. T. Kudraß, HTWK Leipzig Beispielprogramm mit Session. Tabelle -- Passwort auslesen SELECT stud_passwort INTO stud_pwd FROM studenten WHERE stud_matrikel=matrikel; -- ¨Überprüfe ausgelesenes mit übergebenem Passwort IF stud_pwd!=pwd THEN -- Fehlerseite anzeigen psp_sess_error; ELSE sess_id: = to_char(sysdate, ’DDMMYYHH 24 MISS’)||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 Session. Check -- 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 Zeiten SELECT 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, ’ ’)))/7) INTO minuten, stunden, tage, wochen FROM DUAL;
© Prof. T. Kudraß, HTWK Leipzig Prozedur Session. Check (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ückgeben RETURN 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-Dokument l Bestandteil der Meta-Information zu einer HTML-Seite – zwischen Webserver und Browser ausgetauscht – im Browser gespeichert (temporär oder persistent in einer Datei) l Erstellen eines Cookie: Set-Cookie-Anweisung im HTTP-Header bei Server Response l 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 l Expires: Zeitangabe in Sekunden, innerhalb der das Cookie gültig ist l Domain: Name der Internet-Domain, in der das Cookie erzeugt wurde l Path: Unterpfad für die Domain, in der das Cookie gültig ist l Secure: Wenn gesetzt, wird das Cookies nur über HTTPS-Verbindung übertragen l
© Prof. T. Kudraß, HTWK Leipzig HTTP-Cookie l Einschränkungen: – – l Löschen: – l 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 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 l. 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 Warenkorbinhalten (Session ID) l. Nachteile – – Nicht von allen Browsern unterstützt Benutzer kann Cookies abschalten bzw. verweigern
© Prof. T. Kudraß, HTWK Leipzig Cookies in PHP l Methode setcookie zum Setzen eines Cookies l 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 varchar 2(4000), vals vc_arr, num_vals integer); Senden eines Cookies owa_cookie. send( name in varchar 2, value in varchar 2, expires in date DEFAULT NULL, path in varchar 2 DEFAULT NULL, domain in varchar 2 DEFAULT NULL, secure in varchar 2 DEFAULT NULL); Auslesen eines Cookies
© Prof. T. Kudraß, HTWK Leipzig Cookies in PSP (Forts. ) l 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 owa_cookie. get(name in varchar 2) return cookie; Beispiel 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 l l 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. get. Remote. Addr()+ matrikel). hash. Code()). to. String(); Cookie cookie = new Cookie(sess_id, new Integer(matrikel). to. String()); // Setze Lebensdauer in Sekunden Cookie. set. Max. Age(3600*24) Einfügen des Cookie-Objeks in den HTTP-Header Response. add. Cookie(cookie) Lesen der Werte eines Cookie[] cookies = request. get. Cookies(); for (int i=0; i<cookies. length; i++) { if (cookies[i]. get. Name(). equals. Ignore. Case(sess_id)) { matrikel = (new Integer(cookies[i]. get. Value())). int. Value(); break; } }
© Prof. T. Kudraß, HTWK Leipzig Sessions in PHP l l Session-Objekte Alternative zu Cookies erzeugte Session-ID im Cookies speichern oder innerhalb URL übertragen session_start(); l l globales Array $_SESSION zur Speicherung von Werten (Speicherung in DB möglich) - Alternative zu Cookies Beispiel: Speicherung der Variablen Matrikel in der Session $matrikel = $_POST["matrikel"]; if (!session_is_registered ("matrikel")) { session_register ("matrikel"); } Zugriff auf bereits erstellte Sitzung <? php session_start(); if (session_is_registered ("matrikel")) { $matrikel = $_SESSION[’matrikel’]; } ? >
© Prof. T. Kudraß, HTWK Leipzig Sessions in Servlets l l Sitzungsobjekte speichern Informationen zu einer Sitzung im Webserver Realisierung: Http. Session-Interface des javax. servlet. http-Pakets Http. Session session = request. get. Session(true) l nur Übertragung der Sitzungskennung: über Cookies oder URL-Rewriting (Methode encode. URL) – abhängig ob Client Cookies senden kann l Methoden zur Speicherung und zum Zugriff auf Sitzungsobjekte public void set. Attribute(String name, Object wert) public Object get. Attribute(String name) void remove. Attribute(String name) public Enumeration get. Attribute() l Gestartete Sitzung durch Aufruf der invalidate()-Methode der Klasse Http. Session beenden l Timeout-Werte setzen zum automatischen Beenden der Sitzung im Server mittels set. Max. Inactive. Interval(int sekunden)
© Prof. T. Kudraß, HTWK Leipzig Sessions in Servlets – Beispiel l Erzeugen einer Sitzung in der do. Get()-Methode und Festlegung Timeout // neue Session erstellen, wenn noch keine existiert Http. Session session = request. get. Session(true); // Sessiongültigkeit auf 15 Minuten setzen session. set. Max. Inactive. Interval(60*15); l Übergabeparameter aus Request-Objekt lesen matrikel = new Integer(request. get. Parameter("matrikel")). int. Value(); pwd = request. get. Parameter("pwd"); l l Passwort für Matrikelnummer ermitteln und mit Passwort der Anfrage vergleichen Bei Übereinstimmung Werte für Studenten im Sitzungsobjekt speichern pstmt = conn. prepare. Statement( "SELECT stud_name, stud_vorname, stud_passwort "+ "FROM studenten "+ "WHERE stud_matrikel=? "); // Matrikelnummer an Parameter binden pstmt. set. Int(1, matrikel); rset = pstmt. execute. Query();
© Prof. T. Kudraß, HTWK Leipzig Sessions in Servlets – Beispiel (2) String pwd_db=null; // Passwort aus Resultset lesen if (rset. next()) { pwd_db = rset. get. String("stud_passwort"); } //Vergleich der Passwörter if (pwd_db != null && pwd. equals(pwd_db)) { pwd_korrekt = true; vorname = rset. get. String("stud_vorname"); name = rset. get. String("stud_name"); // Speicherung der Werte im Sessionobjekt mit set. Attribute session. set. Attribute("vorname", vorname); session. set. Attribute("name", name); session. set. Attribute("matrikel", new Integer(matrikel)); }
© Prof. T. Kudraß, HTWK Leipzig Sessions in Servlets – Beispiel (3) l Zugriff auf das Sitzungsobjekt mit seinen gespeicherten Werten möglich // Session anfordern Http. Session session = request. get. Session(true); // Sessiong¨ultigkeit erneuern session. set. Max. Inactive. Interval(60*15); // Lesen der Matrikelnummer mit get. Attribute if (session. get. Attribute("matrikel")!=null) matrikel = ((Integer)session. get. Attribute("matrikel")). int. Value(); else matrikel = -1; l l 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" %> l l Zugriff auf das implizite Http. Session-Objekt möglich (set. Attribute, get. Attribute) Sparsamer Umgang mit Ressourcen im Webserver → Timeout verwenden!
© Prof. T. Kudraß, HTWK Leipzig Skalierbarkeit und Wartbarkeit l l l Weiterentwicklung von Web-Anwendungen bei neuen Anforderungen Wachsende Anzahl von Benutzern und Anfragen Wartbarkeit des Codes Verschiedene Rollen: Webdesigner, Anwendungsprogrammierer Trennung Anwendungs- und Präsentationslogik (vgl. 3 Schichten-Architektur) – – l 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 l l 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 "-//W 3 C//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 l l Auslagerung von Logik (z. B. Kommunikation mit der DB) in Java Beans Beispiel-Szenario: Login eines Benutzers und Anzeige der eingeschriebenen Kurse Student. Bean: Ausgabe des Namens des angemeldeten Studenten Kurslist. Bean: Liste der vom Studenten gewählten Kurse
© Prof. T. Kudraß, HTWK Leipzig Beispiel: Student. Bean l Klasse Student. Bean stellt Methoden zum Öffnen und Schließen der DB zur Verfügung public void value. Bound(Http. Session. Binding. Event e) { try { // Herstellung einer Datenbankverbindung Driver. Manager. register. Driver(new oracle. jdbc. Oracle. Driver()); conn = Driver. Manager. get. Connection(url, "username", "password"); } catch (SQLException ex) { } } public void value. Unbound(Http. Session. Binding. Event e) { try { // Schließen der Datenbankverbindung conn. close(); } catch (SQLException ex) { // Fehlerbehandlung } }
© Prof. T. Kudraß, HTWK Leipzig Beispiel: Student. Bean (2) l Initialisierung der Bean für einen bestimmten Studenten erfordert Übergabe der Matrikel-Nr. // private Variable, auf die über public Methoden zugegriffen wird private int matrikel = -1; public int get. Matrikel() { return matrikel; } public void set. Matrikel(int matrikel) { this. matrikel = matrikel; try { pstmt = conn. prepare. Statement("SELECT stud_name, stud_vorname "+ "FROM studenten "+ "WHERE stud_matrikel=? "); pstmt. set. Int(1, matrikel); // Query ausführen und Ergebnis zuweisen rset = pstmt. execute. Query(); // Resultset auslesen if (rset. next()) { vorname = rset. get. String("stud_vorname"); name = rset. get. String("stud_name"); } [. . . ]
© Prof. T. Kudraß, HTWK Leipzig Beispiel: Student. Bean (3) l l Daten des Studenten (Name, Vorname) in privaten Variablen get-Methoden zum Lesen private String name=""; private String vorname=""; public String get. Name() { return name; } public String get. Vorname() { return vorname; } l Methode valid. Passwort(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 Student. Bean Einbinden einer Java Bean in eine JSP mittels JSP-Tag jsp: use. Bean – Klasse des Bean – Gültigkeitsbereich (Scope) – ID, über die das Bean auf der ganzen Seite angesprochen werden kann l <jsp: use. Bean id="student" scope="session" class="mypackage 1. Student. Bean"/> l l Automatischer Aufruf der value. Bound-Methode des Beans und Herstellung der DB-Verbindung Initialisierung des Beans mit der Matrikel-Nr. durch Aufruf von set. Matrikel Student. set. Matrikel(matrikel); l l Abfrage der Studenteninformation und Belegung der privaten Variablen für Vor- und Nachname Zugriff auf diese Daten über get. Property-Tag auf die get-Methoden <title>Hallo <jsp: get. Property name="student" property="vorname"/> <jsp: get. Property name="student" property="name"/> </title>
© Prof. T. Kudraß, HTWK Leipzig Beispiel: Kurslist. Bean l l Kurslist. Bean dient der Ausgabe einer Tabelle mit allen Kursen eines Studenten enthält Methode set. Matrikel zur Initialisierung des Bean mit einer Matrikel-Nr. public void set. Matrikel(int matrikel) { [. . . ] pstmt = conn. prepare. Statement("SELECT kurs_id, kurs_name "+ "FROM kurse LEFT JOIN teilnehmer "+ "ON kurs_id = teiln_kurs_id_fk "+ "WHERE teiln_smatrikel_fk = ? "); // Matrikel an Parameter binden pstmt. set. Int(1, matrikel); rset = pstmt. execute. Query(); // Ausgabestring für Tabelle ausgabe = ""; while (rset. next()) { ausgabe += "<tr>"+ "<td class="inner">"+ "<a href=jsp_session_details. jsp? kurs_id="+ rset. get. String("Kurs_ID")+">"+ rset. get. String("Kurs_Name")+"</a></td>"+ "</tr>"; } [. . . ]
© Prof. T. Kudraß, HTWK Leipzig Beispiel: Kurslist. Bean (Forts. ) l l für Ausgabezeichenkette wird eine get-Methode erstellt, die den String zurückliefert durch Einbinden mittels jsp: get. Property Tag kann die get. Ausgabe()Methode aufgerufen werden → Ausgabe der Tabellenzeilen innerhalb JSP-Datei <tr><th class="inner" colspan="3">Sie sind eingeschrieben in: </th></tr> <jsp: get. Property 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 l l 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 l Checkboxen / Radion Buttons – – l Tabellen – – – l strukturierte Auflistung von Datensätzen für viele Sätze geeignet einige Elemente können mit Hyperlinks versehen werden Comboboxen – – – l Nur für die Darstellung weniger Daten (fehlender Scrollbalken) Checkboxen sehr gut geeignet für variable Anzahl anzuzeigender Felder (Spalten) 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 l l l 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 l Benutzgruppen in Beispiel-Anwendung – – l 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 l l l 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 – – l . 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 l l l 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, ’DDMMYYHH 24 MISS’)||matrikel; -- erzeuge Cookie mit Session. ID und ID OWA_UTIL. MIME_HEADER(’text/html’, FALSE); OWA_COOKIE. send(sid, Sysdate + 1); OWA_UTIL. HTTP_HEADER_CLOSE;
© Prof. T. Kudraß, HTWK Leipzig Umsetzung im Programm (Beispiel) l 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) <? php function authenticate() { header("WWW-Authenticate: Basic realm="Geschuetzter Bereich""); header("HTTP/1. 0 401 Unauthorized"); # Text der bei Scheitern oder Abbruch erscheint echo "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 l l 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 l l – l 2 Funktionen zur Ver- bzw. Entschlüsselung (VARCHAR- oder RAWParameter) Verschlüsselung im Server – – l DES (Data Encryption Standard) Triple DES Algorithmus 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 varchar 2) IS eingabe_string VARCHAR 2(24); -- Schlüssel zur Vereinfachung festgelegt, sollte -- aus Datenbank oder Datei gelesen werden schluessel VARCHAR(8) : = 'schluess'; encrypted_string VARCHAR 2(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 decrypt CREATE OR REPLACE PROCEDURE decrypt (matrikel IN NUMBER, decrypted_string OUT VARCHAR 2) IS -- Schlüssel zur Vereinfachung festgelegt, sollte -- aus Datenbank oder Datei gelesen werden schluessel VARCHAR(8) : = 'schluess'; encrypted_string VARCHAR 2(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 l l l 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); l l Einloggen mit Eingabe Passwort Vergleiche mit gespeichertem Passwort -- verschlüsseltes Passwort lesen decrypt(matrikel, stud_pwd);
© Prof. T. Kudraß, HTWK Leipzig Übertragungssicherheit l l l 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. 2. 3. 4. Client sendet Verbindungsanfrage an Server und übermittelt, welche kryptographischen Verfahren für die Verschlüsselung unterstützt werden Server wählt Verfahren aus und generiert öffentlichen und privaten Schlüssel Zurücksenden des öffentlichen Schlüssels mit einem Zertifikat zur Authentifizierung des Servers Client generiert Sitzungsschlüssel und verschlüsselt diesen mit öffentlichem Schlüssel Zurücksenden des verschlüsselten Sitzungsschlüssels mit verschlüsselten Testnachrichten an den Server entschlüsselt Sitzungsschlüssel mit seinem privaten Schlüssel und kann damit auch die Testnachrichten dechiffrieren Zuücksenden der entschlüsselten Testnachricht an den Client als Bestätigung für korrekte Übertragung des Schlüssels
- Slides: 46