[gelöst] Login - wie realisieren?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Zando
User
Beiträge: 37
Registriert: Sonntag 9. Juli 2006, 17:18

Sonntag 30. Juli 2006, 19:55

Hallo,

was wären denn sinnvolle Lösungen ein Login auf einer Internetseite zu gestalten? (Die Suche im Forum hat immer nur gebracht, wie man sich mit Python selber irgendwo einloggen kann, aber nicht wie sowas selber gemacht wird.)

Ich hätte als Idee nur ein CGI-Skript, welches ein entsprechendes Formular verarbeitet. Hierbei werden die Passwörter nur mit md5-Verschlüsselung in einer Datenbank gespeichert (wie im Buch "Objektorientierte Programmierung mit Python" beschrieben). Dabei sehe ich ein Problem, falls das Passwort vergessen wurde. Wenn es verschlüsselt ist, kann man es ja nur noch schwer/unmöglich per e-Mail dem Vergesser zukommen lassen.

Hier wäre nur noch eine Auto-Generierung eines Passwortes möglich, welches dann geschickt wird.

Was habt ihr denn dazu für Meinungen?

Ist es unbedenklich die Loginnamen und Passwörter in der gleichen Datenbank wie die normalen Daten zu speichern oder sollte man noch eine zusätzliche Datenbank nur dafür einrichten (kostet ja alles mehr Geld :) )

Schön wäre es auch, wenn soetwas bei Django schon gleich mit enthalten wäre (habe aber noch nichts derartiges gefunden).

So long
Carsten
Zuletzt geändert von Zando am Dienstag 1. August 2006, 20:25, insgesamt 1-mal geändert.
BlackJack

Sonntag 30. Juli 2006, 21:14

Logins löst man normalerweise entweder mit Cookies oder mit Session-IDs in URLs. Ich kenne Django nicht näher, aber es wird sicher (mindestens) eine der beiden Varianten unterstützen um Sessions zu ermöglichen.

Ich würde keine Passwörter im Klartext auf dem Server speichern. Es besteht immer die Gefahr, das jemand "einbricht" und viele Leute sind so phantasielos das sie die gleiche Kombination von Login und Passwort an mehreren Stellen benutzen. Wenn dann noch die E-Mail-Adresse in der DB zu finden ist, dann hat der Angreifer auch gleich Zugriff auf ein paar E-Mail-Konten.
Benutzeravatar
Damaskus
Administrator
Beiträge: 899
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Sonntag 30. Juli 2006, 21:31

Hi,
bei PHP löse ich Logins immer folgend.

Passwörter per MD5 verschlüsseln und die dann in der gleichen DB speichern.
Beim Login das PW wieder verschlüsseln und dann mit dem Schlüssel aus der DB vergleichen. Falls OK setzte ich eine Session und erzeuge darin eine Prüfvariable

Code: Alles auswählen

 $SESSION[login] = "ok" 
Jetzt musst das ganze nur noch in Python realisieren :wink:

Wenn möglich solltest du Sessions verwenden. Da viele Cookies deaktiviert haben.

Gruß
Damaskus
Zando
User
Beiträge: 37
Registriert: Sonntag 9. Juli 2006, 17:18

Sonntag 30. Juli 2006, 22:18

@BlackJack: im Klartext speichern werde ich also auf alle Fälle umgehen :)

@Damaskus: ja, das habe ich mit der md5-Verschlüsselung gemeint ;) Das mit den Cookies habe ich mir auch schon so gedacht, bin auch selber kein großer Freund davon. Also meinst du in der gleichen Datenbank wäre schon ok, kann dem jemand zustimmen? (nicht, das ich kein Vertrauen in dich hätte, aber es ist ein sensibles Thema, da möchte ich gern noch andere Meinungen hören)

Dann werde ich es wahrscheinlich wirklich so machen, dass ein Zufallspasswort generiert wird, falls das Alte versehentlich aus dem Gedächtnis gelöscht wurde :D

Für Django habe ich schonmal folgendes gefunden, aber nur überflogen:
http://www.djangoproject.com/documentat ... ntication/

So long
Carsten
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 31. Juli 2006, 07:27

Lösung für Django:

Code: Alles auswählen

from django.contrib.auth import authenticate, login
from django.template import Context, load_template

def login_view(req):
    if req.META['METHOD'] == 'POST':
        username = req.POST.get('username')
        password = req.POST.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
            login(user, req)
            # login funktioniert
        else:
            # login funktioniert nicht
    else:
        # keine daten abgesendet
Und hier die generische WSGI Lösung:

Code: Alles auswählen

from flup.middleware.session import SessionMiddleware, DiskSessionStore

def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    session = environ['com.saddi.service.session']
    # hier kann man jetzt was mit dem session dict machen

store = DiskSessionStore('/tmp')
app = SessionMiddleware(store, app)
Und hier noch eine lösung für den Colubrid WSGI Request Handler: http://wsgiarea.pocoo.org/colubrid/snippets/session/
TUFKAB – the user formerly known as blackbird
Zando
User
Beiträge: 37
Registriert: Sonntag 9. Juli 2006, 17:18

Dienstag 1. August 2006, 20:25

Danke blackbird, werde es bei Gelegenheit schnellstens ausprobieren. Habe grad leider recht wenig Zeit :(

So long
Carsten
Antworten