Schrift
[thread]107[/thread]

Script setzt keine Cookies mehr: nach Server Update



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Gast Gast
 2003-12-09 18:16
#469 #469
Heyoh

Ich habe für eine Website ein Perlscript von jemandem übernommen. Bisher hat das einwandfrei funktioniert. Vor einer Woche hat mein Webspaceanbieter einige Proggies (u.a. Perl von 5.6.0 auf 5.6.1) aktualisiert. Seitdem funktioniert meine Seite nicht mehr.

Auf der Seite ist ein Admincenter, welches über Sessionids den Zugang kontrolliert, welche in Cookies gespeichert werden. Ein erstes mal kann man sich zwar einloggen, wenn man aber auf eine nächste Seite wechselt, welche die ID abfragen sollte, verhält sich die Seite, wie wenn kein Cookie gesetzt worden wäre.

Ich bin echt ratlos, wie ich den Fehler beheben kann, v.a. da ich a) erst Perl Anfänger bin und b) das Script nicht selber geschrieben hab und so auch nicht so grosse Ahnung habe, wo in dem Chaos der Fehler liegen könnte. An sich ist es mir aber schleierhaft, weshalb ein vorher funktionierendes Script plötzlich den Geist aufgibt.

Ich wäre echt froh um Tipps, auch schon wenn sie nur wage sind.

Grüsse
Zork
jan10001
 2003-12-09 19:07
#470 #470
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Es wäre schön, wenn du mal den betreffenden Codeabschnitt postet. Ein Hellseher fehlt uns nämlich noch im Forum. ;)
Zork
 2003-12-09 19:26
#471 #471
User since
2003-12-09
6 Artikel
BenutzerIn
[default_avatar]
ich kann mal versuchen die richtigen schnipsel raus zu suchen.. leider ist das ganze eben etwas unübersichtlich:

aalso: aufgerufen wird in der login subroutine:
Code: (dl )
&setcookie('sessionid',$user{'sessionid'},0,'.global-market.ch','/'); 
 

folgende Subroutine:

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
sub setcookie { 
   my($ky,$vl,$expires,$domain,$path) = @_;
   my @days = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
   my @months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");

   $expires=1800000000 if (! defined $expires); #15.1.2027
   $expires=1800000000 if ($expires<0);
   $domain = $ENV{'SERVER_NAME'} if (! defined $domain);
   $path = "/" if (! defined $path);

   if ($expires==0) {
       $expires='';
   } else {
       my($seconds,$min,$hour,$mday,$mon,$year,$wday) = gmtime($expires);
       $seconds = "0" . $seconds if ($seconds < 10);
       $min = "0" . $min if ($min < 10);
       $hour = "0" . $hour if ($hour < 10);
       $year += 1900;
       $expires = "expires=$days[$wday], $mday-$months[$mon]-$year $hour:$min:$seconds GMT; ";
   }

   $vl =~ s/ /+/g;
   print "Set-Cookie: $ky=$vl; $expires path=$path; domain=$domain;\n";
}


Folgende Sub sollte (wenn ich mich nicht irre) wieder irgendwelche Cookies rauslesen:

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
31
sub checksession { 
   my %cookie=();
   foreach (split(/; /, $ENV{'HTTP_COOKIE'})) {
       $_=~s/\+/ /g;
       my ($chip, $val) = split(/=/,$_,2);
       $chip =~ s/%([A-Fa-f0-9]{2})/pack('c',hex($1))/ge;
       $val =~ s/%([A-Fa-f0-9]{2})/pack('c',hex($1))/ge;
       $cookie{$chip} = $val;
   }

   my $sessionid='';
   $sessionid=$cookie{'sessionid'} if (exists $cookie{'sessionid'});
   if ($sessionid ne '') {
       $sth=$db->prepare("SELECT * FROM user,access WHERE sessionid=\"$sessionid\" AND user.rubrik=access.rubrik AND stat=1");
       $sth->execute;
       if ($rw=$sth->fetchrow_hashref) {
           %user=%$rw;
           $sth->finish;
           return;
       }
       $sth->finish;
   }
   $sth=$db->prepare("SELECT * FROM user,access WHERE username=\"\" AND user.rubrik=access.rubrik AND stat=1");
   $sth->execute;
   if ($rw=$sth->fetchrow_hashref) {
       %user=%$rw;
   } else {
       %user=('username'=>'');
   }
   $sth->finish;
}


schon mal vielen dank für die hilfe
zork
Strat
 2003-12-10 12:09
#472 #472
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
1. das script hat potentielle sicherheitsluecken. was passiert z.B., wenn $sessionId folgendermaszen aussieht:
Code: (dl )
1
2
$sessionId = '"'; # fehler
$sessionId = 'irgendwas" or irgendwas LIKE "%'; # eventuell sicherheit


2. ich sehe da auf den ersten Blick keinen Grund, wieso es nicht funktionieren sollte. versuche als erstes mal herauszufinden, ob der cookie erfolgreich gesetzt wird oder nicht. das kann man z.B. mit einem browser machen, indem man irgendwo in den einstellungen "nachfragen, wenn cookie kommt" oder so aehnlich auswaehlt, alle cookies loescht und dann das script startest. dann siehst du entweder, dass da ein cookie kommt, oder nicht (und siehst auch normalerweise den namen). Opera kann z.B. auch die gespeicherten cookies inkl. domain anzeigen

3. wieso verwendest du nicht das Modul CGI? damit geht das ganze viel einfacher:
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
use CGI;
my $cgi = CGI->new();

....
my $cookie = setcookie($cgi, derganzerest)
print $cgi->header(
-cookie => $cookie,
-type => 'text/html', # ersetzt print "Content-type: text/html\n\n"
);


sub setcookie {
my ($cgi, $ky, $vl, $expires, $domain, $path) = @_;

my $cookie = $cgi->cookie(
-name => $ky,
-value => $vl,
-expires => $expires || '-1h',
-domain => $domain,
-path => $path
);
return $cookie;
}
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2003-12-10 12:16
#473 #473
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
4. auslesen kannst du den cookie folgendermaszen:
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
use CGI;
use DBI;
my $cgi = CGI->new();
my $db = DBI->connect(....) or die $DBI::errstr;
....

&checksession($cgi, $db);

sub checksession {
 my ($cgi, $db) = @_;
 my $sessionId = $cgi->cookie('sessionid');
 if ($sessionId) {
   my $sessionIdSecure = $db->quote($sessionId);
   my $statement = qq~SELECT * FROM user, access WHERE sesionId = $sessionIdSecure AND ....~;
   my $sth = $db->prepare($statement);
   unless ($sth) { # fehlerabfrage
     die "Error in preparing statement: ", $db->errstr;
   }
   unless ($sth->execute) {
     die "Error in executing statement: ", $db->errstr;
   }
# ..... usw.


} # checksesssion
\n\n

<!--EDIT|Strat|1071051421-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Zork
 2003-12-10 21:08
#474 #474
User since
2003-12-09
6 Artikel
BenutzerIn
[default_avatar]
heyoh

habt schon mal vielen dank für die tipps. ich werde mal schauen, was ich verwenden kann. leider ist das script eben nicht von mir und ich habe meine mühe, da was neues rein zu basteln... aber wer weiss, vielleicht funzt es tatsächlich.
ich melde mich wieder...

zork
Zork
 2003-12-10 21:33
#475 #475
User since
2003-12-09
6 Artikel
BenutzerIn
[default_avatar]
heyoh

ich habe mit dem browser-test (vorgeschlagen von strat) folgendes herausgefunden: es setzt war ein cookie, aber die sessionid ist leer, d.h. ich kriege folgende meldung:
Quote
Diese Seite möchte folgendes Cookie setzen
  sessionid=""

Dieser Wert wird an Seiten aller Server der Domäne global-market.ch geschickt, und Pfade, die mit / beginnen.

Das Cookie wird gelöscht, wenn Opera beendet wird.
----------------------
Vollständige Cookie-Anfrage:

sessionid=;  path=/; domain=.global-market.ch;


auf einer clone-site auf einem andere server die noch funktioniert folgende meldung:

Quote
Diese Seite möchte folgendes Cookie setzen
  sessionid="P9dxwFHJyRIAAHzGNTQ"

Dieser Wert wird an Seiten aller Server der Domäne global-trade.ch geschickt, und Pfade, die mit / beginnen.

Das Cookie wird gelöscht, wenn Opera beendet wird.
----------------------
Vollständige Cookie-Anfrage:

sessionid=P9dxwFHJyRIAAHzGNTQ;  path=/; domain=.global-trade.ch;


im script wird die sesseion id mit $ENV{'UNIQUE_ID'}; erzeugt (wenn ich das richtig begriffen habe)... ich hab darauf getestet, ob $ENV{'UNIQUE_ID'}; generell einen wert erzeugt, was aber nicht der fall war und zwar mit folgendem code schnipsel:

Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";

my $unique = $ENV{'UNIQUE_ID'};

print "Unique: $unique";


kann es sein, dass da das problem liegt, oder habe ich wieder was falsch überlegt?

grüsse
zrok
Zork
 2003-12-10 22:16
#476 #476
User since
2003-12-09
6 Artikel
BenutzerIn
[default_avatar]
das Problem lag tatsächlich daran... das Modul war nach dem Update nicht mehr installiert.
Aber vielen Dank für die Tipps, die haben mich erst auf die Idee gebracht.

Liebe Grüsse
Zork
Strat
 2003-12-10 23:19
#477 #477
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
$ENV{'UNIQUE_ID'} ist kein Modul, sondern eine Umgebungsvariable, die auf einem Apache-Servermodul beruht. Dieses Modul scheint beim Update floeten gegangen zu sein...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Zork
 2003-12-11 08:48
#478 #478
User since
2003-12-09
6 Artikel
BenutzerIn
[default_avatar]
okee... ich hatte es auch als umgebungsvariable bezeichnet, denn in perlinfo ist es es dort aufgelistet, aber die vom webservice haben es als modul bezeichnet und ich als perl-neuling habs mal als erstes geglaubt :) aber danke für die bestätigung.
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2003-12-09 18:16.