QuoteDie Seite localhost funktioniert nicht
localhost hat Sie zu oft weitergeleitet.
Löschen Sie Ihre Cookies.
ERR_TOO_MANY_REDIRECTS
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
######################
# SESSION MANAGEMENT
# create the session or if avaible load the session
#######################
my $q = CGI->new();
my $session = CGI::Session->new("driver:File", $q, {Directory => "$tmp_dir"});
$session->expire('15m');
if ($session->is_new ) {
my $cookie = $q->cookie(CGISESSID => $session->id);
print $q->redirect( -url => 'admin.cgi', -cookie => $cookie);
}
#########################
# DISPATCH PART - GET THE ACTIONS
# if action is login, do the login
#########################
my $action = '';
$action = $q->url_param('action') if ($q->url_param('action'));
if ($action eq 'login') {
login($q, $session);
}
# Check the Login Status and if the user is logged in, start the chosen action
my $login = $session->param("login");
###############
# secret pages (only visible if logged in)
###############
if ($login) {
[...]
#hier sind die verschiedenen möglichen Aktionen, die nur nach Login zugänglich sein sollen. Wichtig ist wohl nur:
elsif ($action eq 'logout') {
logout($q, $session);
}
[...]
# Die Login Funktion
sub login {
my ($q, $session) = @_;
my $username = $q->param('user');
my $password = $q->param('password');
open my $fh, "<:encoding(utf-8)", $conffile or die "Could not open $conffile: $!";
my $yaml ='';
while (my $line = <$fh>) {$yaml .= $line}
close $fh;
my $config = Load($yaml);
$password = sha256_hex($password, $config->{'secret'});
if ($username eq $config->{'user'} and $password eq $config->{'password'}) {
$session->param("login", "can_access");
print $q->redirect(-url => 'admin.cgi?action=show_pages');
}
}
[...]
# Und schließlich die Logout Funktion
sub logout {
my ($q, $session) = @_;
# Delete the current session
$session->delete();
$session->flush();
# Delete all expired Sessions
CGI::Session->find( undef, \&purge , {Directory=> "$tmp_dir"} );
sub purge {
my ($session) = @_;
if ( $session->is_expired ) {
$session->delete();
$session->flush(); # Recommended practice says use flush() after delete().
}
}
print_template('logout.tmpl');
}
2016-10-21T18:34:18 Max_PerlbeginnerDann mach halt sauber in deinem Programm! ;)Komischerweise funktioniert der Logout problemlos, wenn ich das Tainting deaktiviert habe. Wenn in der Shebang Zeile jedoch wie empfohlen #! /usr/bin/perl -wT steht, klappt ein erneuter Login erst wieder nach Löschen der Cookies.
(...)
Hat jemand eine Idee, wo der Fehler liegen könnte?
1
2
3
4
5
[Sat Oct 22 16:58:08.838566 2016] [cgi:error] [pid 3206] [client ::1:45256] AH01215: [Sat Oct 22 16:58:08 2016] admin.cgi: Variable "@filenames" will not stay shared at /home/maximilian/public_html/cgi-bin/admin.cgi line 199., referer: http://localhost/~maximilian/cgi-bin/admin.cgi?action=logout
[Sat Oct 22 16:58:08.839919 2016] [cgi:error] [pid 3206] [client ::1:45256] AH01215: [Sat Oct 22 16:58:08 2016] admin.cgi: "my" variable $pagefile masks earlier declaration in same scope at /home/maximilian/public_html/cgi-bin/admin.cgi line 273., referer: http://localhost/~maximilian/cgi-bin/admin.cgi?action=logout
[Sat Oct 22 16:58:08.916863 2016] [cgi:error] [pid 3206] [client ::1:45256] AH01215: [Sat Oct 22 16:58:08 2016] admin.cgi: Insecure dependency in require while running with -T switch at lib/lib/perl5/HTML/Template.pm line 1821., referer: http://localhost/~maximilian/cgi-bin/admin.cgi?action=logout
[Sat Oct 22 16:58:08.916948 2016] [cgi:error] [pid 3206] [client ::1:45256] AH01215: [Sat Oct 22 16:58:08 2016] admin.cgi: BEGIN failed--compilation aborted., referer: http://localhost/~maximilian/cgi-bin/admin.cgi?action=logout
[Sat Oct 22 16:58:08.917728 2016] [cgi:error] [pid 3206] [client ::1:45256] AH01215: [Sat Oct 22 16:58:08 2016] Template.pm: \t(in cleanup) Insecure dependency in sysopen while running with -T switch at lib/lib/perl5/CGI/Session/Driver/file.pm line 107., referer: http://localhost/~maximilian/cgi-bin/admin.cgi?action=logout
1 2 3 4 5 6 7 8 9 10 11 12 13 14
*{CGI::Session::driver::file::_file} = sub { my ($self,$sid) = @_; my $id = $sid; $id =~ s|\\|/|g; if ($id =~ m|/|) { return $self->set_error( "_file(): Session ids cannot contain \\ or / chars: $sid" ); } $sid =~ /^(.*)$/; $sid = $1; return File::Spec->catfile($self->{Directory}, sprintf( $FileName, $sid )); };
2016-10-22T18:25:54 Max_PerlbeginnerAu weh!(...) und quasi in der Produktion (wie ja auch von Dir vorgeschlagen) das Tainting auszuschalten. Der Sinn dieser Option ist ja - wenn ich es richtig verstehe - eine Hilfestellung, um die Skripte sicherer zu schreiben, d.h. in erster Linie für die Entwicklung...
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package File::Session;
use 5.006000;
use strict;
use warnings;
use Cache::FileCache;
use CGI;
use Digest::SHA ('sha256_hex');
our @ISA = qw(Cache::FileCache CGI);
our $VERSION = '0.04';
sub new {
my $class = shift;
$class->SUPER::new(@_);
}
sub retrieve_session {
my ($self) = @_;
my $session_id = $self->cookie('session_id');
if ($session_id) {
# Cookie vorhanden
# Set the ID
$self->id($session_id);
return $session_id;
}
else {
# kein Cookie vorhanden? Dann mach eines!
my $cookie = $self->cookie(-name => 'session_id',
-value => $self->generate_id() );
print $self->redirect(-cookie => $cookie, -uri => $self->self_url());
}
}
sub generate_id {
my ($self) = @_;
my $len = 24;
my @session_chars = ('A' .. 'Z', 'a' .. 'z', 0 .. 9, '.', '-');
my $id;
eval {
open(RANDOM, "/dev/urandom") or die $!;
read(RANDOM, $id, $len) == $len;
close RANDOM;
$id =~ s/(.)/$session_chars[ord($1) & 63]/esg;
$id .= time() . $$;
$id = sha256_hex($id);
return $id;
};
if ($@) {
# if random is not avaible, create the SID as in CGI::Session
# thanks for the inspiration ;-)
my $sha = Digest::SHA->new(256);
$sha->add($$ , time() , rand(time) );
$id = $sha->hexdigest();
}
return $id;
}
sub id {
my ($self, $new_id) = @_;
my $old_id = $self->{'id'};
$self->{'id'} = $new_id if ($new_id);
return $old_id;
}
sub get_data {
my ($self) = @_;
my $session_id = $self->id();
my $data = $self->get($session_id);
$self->set($session_id,$data);
return $data;
}
1;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Create File::Session Object
my $session = File::Session->new({'namespace'=>'sessions',
'cache_root'=>"$DATADIR/cache",
'default_expires_in' => '900s',
'cache_depth' => '0'});
# Retrieve the session_id if there is still a session_cookie
# or if not create a cookie and redirect
my $session_id = $session->retrieve_session;
[...]
sub login {
# Wie gehabt. Nur muss der Login Status wie folgt gespeichert werden
# hier muss ich die set Funktion in jedem Fall noch überschreiben
$session->set($session_id, {"login" => "can_access"});
}
[...]
# Der Login Status wird wie folgt ausgelesen (zugleich wird die Zeit
# bis zum automatischen Logout durch die get_data Funktion hochgesetzt)
my $session_data = $session->get_data;
my $login = $session_data->{'login'} || undef;