geht es ganz ohne cookies ?

von Michael Roth » Dienstag, 7. Oktober 2003



Hallo NG,

Weiss Jemand ob es eine Möglichkeit gibt den ISS zu verarschen und ihm eine
gefakte IP Adresse zu liefern? Und zwar so eine die man sich selber ausdenkt
z.B 217.100.1.1 ?

so das man über asp beim ausführen von

Request.ServerVariables("REMOTE_ADDR")
oder
Request.ServerVariables("REMOTE_HOST")

genau die 217.100.1.1 adresse bekommt ?

Ich frage deswegen weil ich mir ein cookieless session handling system
aufbauen möchte..

Oder hat Jemand bessere Idee wie man das (ohne .NET und ohne zusätzliche COM
und ISAPI's) machen könnte?

vielen dank

Michael Roth





Re: geht es ganz ohne cookies ?

von Olaf Lüder [MVP] » Dienstag, 7. Oktober 2003



Hallo Michael,




Nein, nicht ohne externe Hilfsmittel.


Wie soll das funktionieren?


Mit ISAPI(-Filter):

http://nogetec.de/asp/filter/sessionid

Mit reinem ASP müßtest Du eine eigene Sessionverwaltung verwenden und
die jeweilige SitzungsID als Parameter oder verstecktes Formularfeld
übergeben.

--
Gruß, Olaf
MS MVP ASP / ASP.NET



Re: geht es ganz ohne cookies ?

von Karsten Samaschke [MVP] » Dienstag, 7. Oktober 2003







Ein Beispiel dafür findet sich übrigens im "ASP Codebook" (Link siehe
Signatur) :-)

--
Karsten Samaschke
MS MVP ASP.NET, Germany
http://asp.net-codebook.de - Besser kochen mit ASP.NET!
http://codebook.aspextra.de - Das ASP Codebook




Re: geht es ganz ohne cookies ?

von Michael Roth » Dienstag, 7. Oktober 2003



Hallo Olaf,

hier der code von mir für session handling zum speichern ne datenbank
(cookies werden zwar gesetzt, und wenn nicht vorhanden nicht benützt)

so habe ich mir das halt vorgestellt, ich werde es optimieren und ausbauen
wenn es sinn macht..
was meinst du dazu? und was meinen die anderen?

is bisschen viel code für so wenig was es macht aber daran ist microsoft
schuld :)


' Session
Managment-------------------------------------------------------------------
----------
if Request("SessionID")="" then
'Erstlogin auf die Seite, es wird noch keine SessionID via Querystring
übergeben.

SessionEncrypted = Encrypt(Session.SessionID)

SQL = "SELECT FLD_SESSION_ID FROM TBL_SESSIONS WHERE FLD_SESSION_ID = '"
& SessionEncrypted & "'"
Set RS_SESSIONS_1 = Conn.Execute (SQL)

if RS_SESSIONS_1.EOF or RS_SESSIONS_1.BOF then
'Wenn die Server SessionID nicht in der Datenbank existiert wird eine
neue eingetragen.

cSTR_USER_ID="0"

if not Request.Cookies("" & cookie_id & "")("COOKIE_USER_ID")="" then
'User eingeloggt mit Cookies


SQL = "SELECT FLD_USER_ID,FLD_PASSWORD FROM TBL_MEMBERS WHERE
FLD_USER_ID=" & Request.Cookies("" & cookie_id & "")("COOKIE_USER_ID")
Set RS_SESSIONS_2 = Conn.Execute(SQL)
if RS_SESSIONS_2.EOF or RS_SESSIONS_2.BOF then

'Es wurde kein User in der Datenbank mit der ID die in den Cookies
steht gefunden.
cSTR_USER_ID="0"

else

if RS_SESSIONS_2("FLD_PASSWORD") = Trim(Request.Cookies("" &
cookie_id & "")("COOKIE_PASSWORD")) then
cSTR_USER_ID=RS_SESSIONS_2("FLD_USER_ID")
'Die User ID wird von der Datenbank geholt
else
'Es wurde zwar ein user in der db gefunden, das password in den
cookies stimmt aber nicht
'ueberein mit dem in der db, womoeglich vom admin geaendert oder
manipulation vom user.
cSTR_USER_ID="0"
end if

end if

end if

if not cSTR_USER_ID="0" then
'Wenn der User eingeloggt ist mit cookies und eine userid besitzt.

'Das Lastdatum wird aus der Member Datenbank geholt und in die Variable
cSTR_LASTLOGINDATE geschrieben

SQL = "SELECT FLD_LASTLOGINSTAMP FROM TBL_MEMBERS WHERE FLD_USER_ID="
& cSTR_USER_ID
Set RS_SESSIONS_3 = Conn.Execute(SQL)
cSTR_LASTLOGINDATE=RS_SESSIONS_3("FLD_LASTLOGINSTAMP")
RS_SESSIONS_3.Close
Set RS_SESSIONS_3 = nothing

'Anschliessend wird das Lastdatum auf das aktuelle datum gesetzt.
SQL = "UPDATE TBL_MEMBERS SET "
SQL = SQL & "FLD_LASTLOGINSTAMP='" & convertdatefordb() & "'"
SQL = SQL & " WHERE FLD_USER_ID =" & cSTR_USER_ID
Conn.Execute (SQL)

end if

if cSTR_LASTLOGINDATE="" then
'Da wird noch keine SessionID haben muss eine Session in der DB
erstellt werden

'Hier haben wir kein LASTVISIT Datum, was heisst das der Cookied-User
keine UserID hat, sprich nicht eingeloggt ist.
'Wir machen ne Session rein ohne den Lastvisit feld zu berühren da
nicht überall ein leeres feld zugelassen ist.

SQL="INSERT into TBL_SESSIONS
(FLD_SESSION_ID,FLD_USER_ID,FLD_USER_IP,FLD_NOW_STAMP)"
SQL= SQL & " Values ('" & SessionEncrypted & "','" & cSTR_USER_ID &"
','" & GetUserIP() & "','" & convertdatefordb() & "')"

else

'hier packen wir das lastvisit datum aus der datenbank von
eingeloggtem user in die sessions tabelle

SQL="INSERT into TBL_SESSIONS
(FLD_LASTLOGINSTAMP,FLD_SESSION_ID,FLD_USER_ID,FLD_USER_IP,FLD_NOW_STAMP)"
SQL= SQL & " Values ('" & cSTR_LASTLOGINDATE & "','" &
SessionEncrypted & "','" & cSTR_USER_ID &" ','" & GetUserIP() & "','" &
convertdatefordb() & "')"


end if
'Jetzt exec von einem der obigen statments, eines kommt auf jedem fall
vor
Conn.execute(SQL)

end if

RS_SESSIONS_1.Close

SessionID=SessionEncrypted

else

'Jetzt wird eine SessionID via Querystring übergeben
SessionID=Request("SessionID")

if IsAlphaNumeric(SessionID) = false then
'Ich schaue ob die Querystring SessionID eine Zahl ist

Response.Clear
Response.redirect "default.asp?internalerror=SessionExpired&cord=1"
Response.End

else
'Wenn die Querystring SessionID korrekt ist schaue ich ob diese in der
Datenbank vorhanden ist

SQL = "SELECT FLD_SESSION_ID FROM TBL_SESSIONS WHERE FLD_SESSION_ID = '"
& SessionID & "'"
Set RS_SESSIONS_4 = Conn.Execute (SQL)

if RS_SESSIONS_4.EOF or RS_SESSIONS_4.BOF then
'Wenn die Querystring SessionID nicht in der Datenbank ist wird auf die
SessionExpired weitergeleitet
RS_SESSIONS_4.Close
Set RS_SESSIONS_4 = nothing

Response.Clear
Response.redirect "default.asp?internalerror=SessionExpired&cord=2"
Response.End

else
RS_SESSIONS_4.Close
Set RS_SESSIONS_4 = nothing
'Wenn die Querystring SessionID in der Datenbank vorhanden ist, machen
wir ein Update von dem Date/Time Stamp und Location
'Dies passiert bei jedem Aufruf der Seite

'Jetzt schaue ich ob die User_IP zu der Querystring SessionID
dazugehört.
SQL = "SELECT FLD_SESSION_ID FROM TBL_SESSIONS WHERE FLD_SESSION_ID =
'" & SessionID & "' and FLD_USER_IP = '" & GetUserIP() & "'"
Set RS_SESSIONS_7 = Conn.Execute (SQL)

if RS_SESSIONS_7.EOF or RS_SESSIONS_7.BOF then

RS_SESSIONS_7.Close
Set RS_SESSIONS_7 = nothing

Response.Clear
Response.redirect "default.asp?internalerror=SessionExpired&cord=3"
Response.End

end if

if not Request.Cookies("" & cookie_id & "")("COOKIE_USER_ID")="" then

SQL = "SELECT FLD_USER_ID,FLD_PASSWORD FROM TBL_MEMBERS WHERE
FLD_USER_ID=" & Request.Cookies("" & cookie_id & "")("COOKIE_USER_ID")
Set RS_SESSIONS_5 = Conn.Execute(SQL)
if RS_SESSIONS_5.EOF or RS_SESSIONS_5.BOF then

'Es wurde kein User in der Datenbank mit der ID die in den Cookies
steht gefunden.
uSTR_USER_ID="0"

else

if RS_SESSIONS_5("FLD_PASSWORD") = Trim(Request.Cookies("" &
cookie_id & "")("COOKIE_PASSWORD")) then
uSTR_USER_ID=RS_SESSIONS_5("FLD_USER_ID")
else
'Es wurde zwar ein user in der db gefunden, das password in den
cookies stimmt aber nicht
'ueberein mit dem in der db, womoeglich vom admin geaendert oder
manipulation vom user.
uSTR_USER_ID="0"
end if

end if

end if

SQL = "UPDATE TBL_SESSIONS SET "
SQL = SQL & "FLD_LOCATION='" & GetmyFileName() & "', "

if not Request.Cookies("" & cookie_id & "")("COOKIE_USER_ID")="" then

SQL = SQL & "FLD_USER_ID='" & uSTR_USER_ID & "', "

end if

SQL = SQL & "FLD_NOW_STAMP='" & convertdatefordb() & "'"
SQL = SQL & "WHERE FLD_SESSION_ID = '" & SessionID & "'"
Conn.Execute (SQL)

end if

end if

end if

'CLEAN UP


'Jetzt wird in der Datenbank nach Sessions gesucht die Älter als die
Definierte TimeoutZeit sind, diese werden gelöscht.
SQL = "SELECT FLD_SESSION_ID,FLD_NOW_STAMP FROM TBL_SESSIONS"
Set RS_SESSIONS_6 = Conn.Execute (SQL)
Do While NOT RS_SESSIONS_6.EOF or RS_SESSIONS_6.BOF

if
Datediff("n",convertdatefordisplay(RS_SESSIONS_6("FLD_NOW_STAMP"),"MM/DD/YYY
Y HH:MI:SS"),convertdatefordisplay(convertdatefordb(),"MM/DD/YYYY
HH:MI:SS")) >= Int(theSessionTimeout) then
'Alte Sessions werden hier gelöscht..
SQL = "DELETE FROM TBL_SESSIONS where FLD_SESSION_ID = '" &
RS_SESSIONS_6("FLD_SESSION_ID") & "'"
Conn.execute(SQL)

end if

RS_SESSIONS_6.MoveNext
loop
RS_SESSIONS_6.Close
Set RS_SESSIONS_6 = nothing
' --------------------------------------------------------------------------
--------------------






eine
ausdenkt
COM





Re: geht es ganz ohne cookies ?

von Olaf Lüder [MVP] » Dienstag, 7. Oktober 2003



Hallo Michael,




Ein bißchen viel (zu dieser Zeit), um mir das im Detail anzuschauen,
daher ...


... nur 2 Anmerkungen.

Wenn Du auf die eingebaute Sitzungsverwaltung von ASP verzichtest,
solltest Du auch Session.SessionID nicht verwenden (nimm einen eigenen
Zähler), da Du so den Sitzungszustand komplett abschalten kannst, was
der Performance zu gute kommt.

Auf den ersten Blick sieht das nach ziemlich vielen Datenbankzugriffen
aus; bei vielen parallelen Requests könnte die Performance stark
darunter leiden - ein Zugriff zum Auslesen und einer zum Schreiben der
Daten sollte reichen.
Du kannst Dir ja auch mal anschauen, wie das z.B. bei ASP.NET gelöst
wurde.


Ja, ja, wer denn sonst...? ;-)

--
Gruß, Olaf
MS MVP ASP / ASP.NET



Re: geht es ganz ohne cookies ?

von Michael Roth » Dienstag, 7. Oktober 2003



Hi Olaf,


das habe ich mir auch überlegt, so kann man dann die Nachfolgende Session
nicht erraten weil die Sessions auf dem ISS ja wie ein Autowert Feld
generiert werden, unverschlüsselt. Ein Paradise für Hacker...

und SessionState ausschalten entlastet den Server sicherlich ein wenig, nur
wie soll ich die Unique SessionID generieren ?

würde das so gehen?

1. schauen ob die generierte session in der application(x) ist
2. wenn nicht generieren(timestamp basiert?) und in application(x) ablegen
3. wenn ja andere session id generieren und wieder gucken obs die in der
application(x) gibt

hmm verlangsamt das nicht den prozess sehr wenn er immer auf den
Application.Unlock warten muss ?
Und gleichzeitig sehr viele User Online sind ?

oder hast du vielleicht einen besseren vorschlag wie man die session id
generieren könnte ?

grüsse
Michael Roth






Re: geht es ganz ohne cookies ?

von Olaf Lüder [MVP] » Dienstag, 7. Oktober 2003



Hallo Michael,




Warum? Nach außen ist diese ja nicht zugänglich und wenn, würde Dir das
auch nichts nutzen, da Du eine Sitzung nicht unter dieser (internen) ID
ansprechen kannst.


Z.B. mittels

Server.CreateObject('Scriptlet.TypeLib')).GUID

Ich würde aber eher einen einfachen Zähler verwenden.


Nimm einen Counter und hänge, wenn Dir dieser 'zu berechenbar' ist,
einfach einen zufälligen Wert an.


Lock/Unlock kosten wie alle Synchronisierungen nur (merklich) Zeit, wenn
etwas synchronisiert werden muß, also tatsächlich ein Konflikt auftritt.
Bei Deinen zahlreichen DB-Zugriffen wird die dafür benötigte Zeit
wesentlich höher sein, so daß die Gefahr von Konflikten beim Erzeugen
der ID wohl eher gering ist.


Ich denke, dass dies in Deinem Fall eine eher untergeordnete Rolle
spielen würde, man sollte aber schon immer versuchen, sowas abzuschätzen
oder zu testen.


Irgendwas in der Art:

SID = (1000000 + Int(1000000 * Rnd)) & SessionID

oder GUID (s.o.) erzeugen.

--
Gruß, Olaf
MS MVP ASP / ASP.NET



Re: geht es ganz ohne cookies ?

von Michael Roth » Dienstag, 7. Oktober 2003



mit der funktion

Server.CreateObject('Scriptlet.TypeLib')).GUID

schmiert mein server komplett ab :)

ich machs mit

Randomize
SID = (1000000 + Int(1000000 * Rnd)) & SessionID

und Application

die IP könnte man ja noch ohne punkt mit anhängen aber das wär wieder so ein
sicherheitsloch

vielen dank
Michael Roth






Session
nur
ablegen





Re: geht es ganz ohne cookies ?

von Olaf Lüder [MVP] » Dienstag, 7. Oktober 2003



Hallo Michael,




SID = Mid(Server.CreateObject("Scriptlet.TypeLib").GUID, 2, 36)

funktioniert nicht?

Dann wird wohl die Erzeugung des Objektes schon fehlschlagen
(Berechtigungsproblem?)...

--
Gruß, Olaf
MS MVP ASP / ASP.NET



If you have any questions, you can contact us: admin#mofeel.net     Spam Report