Schrift
[thread]5853[/thread]

Session für OnlineGame validieren: mit RegEx :)

Tags: Ähnliche Threads

Leser: 3


<< >> 5 Einträge, 1 Seite
pktm
 2003-10-23 23:41
#67161 #67161
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Ich habe eine Session für ein OnlineGame, die ich im Query-String (CGI) übergeben
Die sieht so aus:
Code: (dl )
print $query->{sid}; # 86674281529017.9XY1066938111XY606719970703125XY0.535980224609375XY1


und wird so gebaut:
Code: (dl )
1
2
# Session erstellen
my $session = ($uid * $uniq) / 7 . 'XY' . time() . 'XY' . $uniq . 'XY' . rand(1) . 'XY' . $uid;

$uid und $uniq werden dabei aus einer Datenbank gelesen und bedeuten so viel wie User-ID und Unique-ID.
$uid besteht aus einer beliebigen Zahl (in der Datenbank als int(255) eingetragen) und $uniq ist eine 14-stellige Zufallszahl aus rand(1), wobei die 0. am Anfang weggelassen wurden.

Jetzt würde ich gerne im nächsten Schritt überprüfen, ob die Session gültig ist.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub validate_session{
# ---- usage
# if( validate_session( $sessionDataToValidate ) ){ print "Session Ok!\n"; }
# ----
# prüfen, ob gültige sid: a)muster b)haltbarkeit c)valid
# my $session = ($uid * $uniq) / 7 . 'XY' . time() . 'XY' . $uniq . 'XY' . rand(1) . 'XY' . $uid;
   my $session = @_;
   my $return = 0;
   if( $session =~ m/\[d{16}\.]XY\d{10}XY\d{15}\[d{15}\.]XY\d*/ ){ #Muster ok?
       if( (split /XY/, $session)[1] > time() - SESSION_TIME ){ #gültig? (Zeit)
           if( ((split /XY/, $session)[0] * 7) / (split /XY/, $session)[-1] == (split /XY/, $session)[-3] ){ #valid? (user)
               $return = 1;
           }
       }
   }
   return $return;
}


Was ich schon durch auskommentieren der einzelnen Zeilen herausbekommen habe ist, dass in jeder Abfrage ein Fehler steckt - *freu*
So, kann mir wer bei dieser Aufgabe helfen?
mfg pktm

PS: ich habe übrigens extra zur Entwicklung 3 if's gewählt, zusammenfügen kann man es hinterher ja immernoch.
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2003-10-24 00:31
#67162 #67162
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
die zeit lässt sich leicht manipulieren, wenn man die sessionid verändert.
mit einem mehr oder weniger geübten auge erkennt man schnell, an welcher stelle
die zeit steht...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pktm
 2003-10-24 02:04
#67163 #67163
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Gut - um die Zeit geht es mir im Moment auch nicht, sondern eher darum, dass man nicht von einem anderen Rechner aus nur mit dem Wissen um die User-ID in einen Account kann.
Mehr dazu gabs aber schon im Thread "Session für OnlineGame" ;)
Jetzt mühe ich mich gerade damit ab, diese hier zu validieren.
Wenn dann was läuft kann man immernoch auf mehr Sicherheit achten.\n\n

<!--EDIT|pktm|1066947010-->
http://www.intergastro-service.de (mein erstes CMS :) )
SirLant
 2003-10-25 00:47
#67164 #67164
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Du könntest die Session-ID die du generierst anschließend noch
verschlüsseln und beim Abrufen wieder entschlüsseln.
Aber an deinem Problem kann ich leider auch nix ändern :(
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
pktm
 2003-11-04 02:16
#67165 #67165
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Ich habe mal ein bischen rumgefriemelt und bin fast fertig.
Im Moment sieht es so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/perl -w
use strict;
use constant SESSION_TIME => 60000;
# my $session = ($uid * $uniq) * 7 . 'XY' . time() . 'XY' . $uniq . 'XY' . rand(1) . 'XY' . $uid;
my $session = "2.09799194335938e+015XY1067904570XY299713134765625XY0.469451904296875XY1";

my $time = 1067904570;
my $uniq = 2147483647;
my $rand = 0.469451904296875;
my $uid = 1;

my $rec_key = (split/XY/, $session)[0];
my $rec_time = (split/XY/, $session)[1];
my $rec_uniq = (split/XY/, $session)[2];
my $rec_rand = (split/XY/, $session)[3];
my $rec_uid = (split/XY/, $session)[4];

my $zwischen = $rec_uid * $rec_uniq * 7;

print "$session\n";
my $session_pattern = '.*XY\d{10}XY\d{15}XY\d{1}\.\d{14,15}XY.*';
if( $session =~ m/$session_pattern/ ){ #Muster ok?
print "ok1\n";
if( (split /XY/, $session)[1] > time() - SESSION_TIME ){ #gültig? (Zeit)
print "ok2\n";
if( (split/XY/, $session)[4] * (split/XY/, $session)[2] * 7 eq (split/XY/, $session)[0] ){ #valid? (user)
print "ok3\n"; #eq, da auch \D vorkommen können (+|e|.)
}
}
}


Das Problem ist nur, dass die Session bei dem Teil, wo ich eine Zufallszahl übergebe die mit rand(1) generiert wurde auch etwas anders aussehen kann.
So z.B.
Quote
3.22549438476563e+015XY1067904937XY460784912109375XY0.76336669921875XY1

Da ist die Zufallszahl um eine Stelle kürzer.
Wie überprüfe ich denn nun darauf, ob die Zufallszahl 14 oder 15 Stellen lang ist?
Ich dachte, das würde mti dem Quantifier {14,15} gehen.
Geht aber nicht.
Hilfe!
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 5 Einträge, 1 Seite



View all threads created 2003-10-23 23:41.