31.10.2013 Aufrufe

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Grundlagen Web<br />

Zustandsverwaltung über Anfrage h<strong>in</strong>aus<br />

Grundlagen Web<br />

Zustandsverwaltung über Anfrage h<strong>in</strong>aus<br />

Cookies – Übertragung<br />

Cookies setzen und lesen<br />

setcookie.cgi<br />

Übertragung – HTTP, RFC 2109/6265<br />

Manuell – CGI<br />

1 #!/usr/b<strong>in</strong>/python<br />

• Teil des HTTP-Headers<br />

• Set-Cookie: =,<br />

Cookie: =<br />

• PATH=<br />

• Header Set-Cookie<br />

• Auslesen aus Umgebungsvariable<br />

HTTP_COOKIE<br />

• Inhalt s<strong>in</strong>d Schlüssel=Wert Paare<br />

2 from datetime import datetime<br />

3 pr<strong>in</strong>t "Set-Cookie: jetzt="+ str(datetime.now())<br />

4 pr<strong>in</strong>t "Content-Type: text/html\n"<br />

5 import cgi, cgitb<br />

6 cgitb.enable()<br />

7 import os<br />

8 pr<strong>in</strong>t "Cookie is: "+str(os.environ["HTTP_COOKIE"])<br />

• SECURE (optional)<br />

Mit Standardbibliothek<br />

• URL-encodiert (cgi.escape), %FF<br />

• Cookies auf dem Server mit Cookie<br />

Ablauf – Beispiel<br />

• Server schickt Set-Cookie-Header als<br />

Teil der Antwort auf e<strong>in</strong>e Anfrage<br />

• Ab da schickt der Browser immer<br />

wieder das Cookie <strong>in</strong> der Anfrage mit<br />

Cookie-Header<br />

• Mehrere Cookies <strong>in</strong> dem e<strong>in</strong>en<br />

Header-Feld<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 61 / 91<br />

• Cookie.SimpleCookie als e<strong>in</strong>fache<br />

Abstraktion<br />

• Schreiben und Lesen<br />

• Mehrere Schlüsselwert-Paare im<br />

Beispiel<br />

Set-Cookie: jetzt="2013-03-11<br />

19:52:47.505760"; Path=/<br />

• Löschen: Leerer Inhalt und<br />

überschrittenes Verfallsdatum<br />

1 #!/usr/b<strong>in</strong>/python<br />

2 from datetime import datetime<br />

3 import os, cgi, Cookie<br />

4 cookie = Cookie.SimpleCookie()<br />

5 cookie["jetzt"] = str(datetime.now())<br />

6 cookie["jetzt"]["path"] = "/"<br />

7 pr<strong>in</strong>t cookie.output()<br />

8 pr<strong>in</strong>t "Content-Type: text/html\n"<br />

9 rc = Cookie.SimpleCookie(os.environ["HTTP_COOKIE"])<br />

10 pr<strong>in</strong>t "Cookie is: "+rc["jetzt"].value<br />

11 pr<strong>in</strong>t cookie.output()<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 62 / 91<br />

Grundlagen Web<br />

Zustandsverwaltung über Anfrage h<strong>in</strong>aus<br />

Grundlagen Web<br />

Zustandsverwaltung über Anfrage h<strong>in</strong>aus<br />

Kontext im Client – Cookies<br />

Kontext im Client – Sichere Cookies<br />

Cookie als Träger des<br />

Anwendungskontextes<br />

• Schlüssel/Wert-Paare <strong>in</strong> Cookies<br />

• Alternativ zusammenpacken als<br />

Query-Str<strong>in</strong>g <strong>in</strong> e<strong>in</strong>em Cookie möglich<br />

Weitergabe zum Browser<br />

• set_cookie<br />

• Automatisch, über Header<br />

Auswertung/Wiederherstellung<br />

• Mit request.cookies<br />

1 from werkzeug.wrappers import Request, Response<br />

2 import cgi, Cookie<br />

3<br />

4 def render_context(content, context):<br />

5 response = Response(content,<br />

6 content_type="text/html")<br />

7 for k,v <strong>in</strong> context.iteritems():<br />

8 v = cgi.escape(unicode(v), True)<br />

9 response.set_cookie(k, v)<br />

10 return response<br />

11<br />

12 @Request.application<br />

13 def application(request):<br />

14 ctx, args = {}, request.args<br />

15 ctx[’a’] = args[’a’] if ’a’ <strong>in</strong> args else ’A’<br />

16 ctx[’b’] = args[’b’] if ’b’ <strong>in</strong> args else ’B’<br />

17 ctx[’z’] = <strong>in</strong>t(args[’z’]) if ’z’ <strong>in</strong> args else 0<br />

18 ctx[’z’] += 17<br />

19 c = []<br />

20 response = render_context(c, ctx)<br />

21 c.append(’’)<br />

23 c.append(’’)<br />

24 for k,v <strong>in</strong> request.cookies.iteritems():<br />

25 c.append("%s: %s\n" % (k, v))<br />

26 return response<br />

Verschlüsseln der Daten auf dem Client<br />

• Schwierig zu lesen, schwierig zu<br />

manipulieren<br />

• E<strong>in</strong>fache Sicherung von Manipulation:<br />

F<strong>in</strong>gerabdruck<br />

Verh<strong>in</strong>dern von Manipulationen<br />

• Wenn Daten verändert wurden, dann<br />

stimmt der “F<strong>in</strong>gerabdruck” der Daten<br />

nicht mehr<br />

• Standardalgorithmus SHA1<br />

• E<strong>in</strong>gabe ist beliebiger Str<strong>in</strong>g (Zahl)<br />

• Ergebnis ist e<strong>in</strong> 160-Bit<br />

Message-Digest (meist als Hex-Str<strong>in</strong>g<br />

dargestellt)<br />

Python und SHA1<br />

• hashlib.sha1(message).hexdigest()<br />

RFC 3174 “ The SHA-1 is called secure<br />

because it is computationally <strong>in</strong>feasible to<br />

f<strong>in</strong>d a message which corresponds to a<br />

given message digest, or to f<strong>in</strong>d two<br />

different messages which produce the<br />

same message digest. Any change to a<br />

message <strong>in</strong> transit will, with very high<br />

probability, result <strong>in</strong> a different message<br />

digest, and the signature will fail to verify.”<br />

Geheimes Salz<br />

• Nachricht muss (teilweise) geheim<br />

se<strong>in</strong>, sonst kann Digest berechnet<br />

werden<br />

• Lösung: H<strong>in</strong>zufügen e<strong>in</strong>es geheimen<br />

“Salzes” (Salt), e<strong>in</strong> beliebiger Str<strong>in</strong>g<br />

a99219f952208c68c30cb4a99cf9d7902e395702<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 63 / 91<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 64 / 91

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!