Session-handling Python / PHP

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Transmitter
User
Beiträge: 24
Registriert: Mittwoch 24. November 2004, 02:23

Montag 30. Januar 2006, 01:28

Hi,

ich schreibe gerade ein simples Weiterempfehlen-Formular in PHP.
Darin prüfe ich auf der Benutzer mit der Session innerhalb eines Zeitraumes mehr als x Nachrichten versandt hat. (Um Spam zu vermeiden).

Wie ist denn das bei Python, könnte man meine Prüfung jetzt irgendwie umgehen?
Kann man sich explizit immer eine neue Session vom Server erzeugen lassen?
Und sollte ich lieber auf die IP prüfen?
Keiner wird sich die Mühe machen und den Browser ständig schließen und neu öffnen oder so, aber ich bin mir jetzt nicht sicher, ob man das mit einem Programm umgehen kann.

Wisst ihr da näheres?
Entspricht 1 Prozess evtl. 1 Browser und könnte man einfach 1000 Prozesse forken für 1000 neue Sessions und das dann in ner Schleife laufen lassen?

Danke schon mal
Bye, Transmitter
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 30. Januar 2006, 06:28

Für WSGI gibts da eine Middleware in flup.

Hier eine kleine Beispielanwendung unter der Verwendung von colubrid:

Code: Alles auswählen

from colubrid import BaseApplication
from flup.middleware.session import ShelveSessionStore, SessionMiddleware
from xml.sax.saxutils import escape

class Application(BaseApplication):

    def __init__(self, environ, start_response):
        super(Application, self).__init__(environ, start_response)
        self.request.session = environ['com.saddi.service.session'].session

    def process_request(self):
        name = self.request.session.get('name')
        if 'name' in self.request.GET:
            name = self.request.GET['name']
        
        if not name is None:
            self.request.write('Hallo, dein Name ist %s' % escape(name))
        else:
            self.request.write(
                '<h1>Wie ist dein Name?</h1>'
                '<form action="" method="post">'
                '<input type="text" name="name" value="Gib deinen Namen ein">'
                '<input type="submit" value="Das ist mein Name">'
                '</form>'
            )


app = Application
app = SessionMiddleware(app, ShelveSessionStore("/var/sessions"))
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 30. Januar 2006, 11:02

Transmitter hat geschrieben:Darin prüfe ich auf der Benutzer mit der Session innerhalb eines Zeitraumes mehr als x Nachrichten versandt hat.
[...]
Wie ist denn das bei Python, könnte man meine Prüfung jetzt irgendwie umgehen?
Hi Transmitter!

So ziemlich jedes Web-Framework hat eine Sessionverwaltung. Sogar mit reinem CGI kannst du mit Cookies arbeiten und damit indirekt eine Sessionverwaltung aufbauen.

Die Prüfung umgehen -- nicht unbedingt. Meistens erstellt man eine Session und setzt ein Flag oder einen Zähler. Wenn die nächste Anfrage vom Browser kommt, wird in der Session dieses Browsers geprüft ob das Flag schon gesetzt ist oder nicht.

Die Idee mit der IP-Adresse ist nicht haltbar. Was ist wenn eine ganze Firma über einen NAT-Router ins Netz geht? Dann habe alle die gleiche IP-Adresse und du würdest den Rest der Firma aussperren.

Du wirst um eine Cookie-basierte Sessionverwaltung nicht herumkommen. Du müsstest aber, um Spam abzuwehren, vorher das Cookie in einer anderen Seite setzen und zur Seite, die nicht von Spam-Versendern benutzt werden soll, weiterleiten. Wie genau du vorgehen musst, kommt auf deine Anforderungen an. Aber auch die Spam-Versender gehen mit der Zeit und wissen wie man Cookies auf der Clientseite verwendet.

Zope (Zope.de) hat eine ziemlich gut ausgeklügelte Session-Verwaltung. Die Session-ID kann damit über Cookies, über die URL oder über Formulare weitergegeben werden.

http://www.zope.de/Members/ralf/session ... rm=session

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 30. Januar 2006, 11:15

ZOPE vs Django ^^

ZOPE:

Code: Alles auswählen

##Script (Python) "getMsgBox"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=Prueft auf Text in der MessageBox
##

# Dieser Script liefert den Messagetext aus der laufenden Session
# und löscht ihn danach wieder

request = context.REQUEST
session = request.SESSION


result = ''

if session.has_key('MSG'):
  result = session['MSG']
  session.set('MSG','')

return result
Django:

Code: Alles auswählen

def fromsession(request):
    result = request.SESSION.get('msg', '')
    request.SESSION['msg'] = ''
    return result
//Edit: Turbogears

Code: Alles auswählen

import cherrypy

def fromsession(request):
    result = cherrypy.session.get('msg', '')
    cherrypy.session['msg'] = ''
    return result
SNCR
TUFKAB – the user formerly known as blackbird
Transmitter
User
Beiträge: 24
Registriert: Mittwoch 24. November 2004, 02:23

Montag 30. Januar 2006, 11:19

Nagut .. dann schreibe ich nochwas in Cookies bzw. muss mir das insgesamt nochmal überlegen.

Danke schon mal.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 30. Januar 2006, 12:27

blackbird hat geschrieben:ZOPE vs Django ^^
Hi blackbird!

ZOPE:

Code: Alles auswählen

context.REQUEST.SESSION["Vorname"] = "Gerold" # Set
return context.REQUEST.SESSION["Vorname"] # Get
Oder so:

Code: Alles auswählen

return context.REQUEST.SESSION.get("Vorname", "Alternativtext") # Get
Oder in TAL:

Code: Alles auswählen

<p tal:content="request/SESSION/Vorname" />
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 30. Januar 2006, 15:59

gerold hat geschrieben:...
War nicht ganz ernst gemeint ;-)
TUFKAB – the user formerly known as blackbird
Antworten