ttkman: SICHERHEIT AUF FIRMENWEBSITE

Guten Tag,
ich habe folgendes Problem: Ich soll für meine Firma ein in Perl programmiertes Login - System absichern. Diese Login - System generiert für jeden USER einen eigenen Ordner inclusive Passwort - Datei. Mein Ansatz liegt im Moment im Bereich Session - ID's welche ich über die GET - Methode übergebe. Das funktioniert auch ohne Probleme, blos habe ich jetzt das Problem, dass wenn sich ein User erfolgreich eingeloggt hat die änderung des USER - Verzeichnis den Zugriff auf andere Daten ermöglicht.

Hier wäre mein Lösungsansatz die übermittlung des User - Names per POST - Methode welche mit dem in der URL stehenden Benutzerdirectory abgeglichen wird und bei Nichtübereinstimmen eine fehlermeldung produziert.

Leider bekomme ich das überhaupt nicht gebacken ... will sagen, das POST - gelumbe :)

Deshalb bitte ich euch mir zu helfen; entweder in dem ihr mir ne andere Lösungsmöglichkeit zur Abriegelung des Loginsystems über perl empfehlt, oder in dem ihr mir das mit dem POST in perl mal erklärt .... wär für jede Hilfe dankbar. Bitte scheut euch nicht auch per email mit mir Kontakt aufzunehmen. Anbei übersende ich euch meinen Quellcode, welcher die Sessionid aus der GET - Methode verwertet.

#c:\wampp2/perl/bin^/perl.exe
print "Content-type: text/html\n\n";
print "<HTML>";
print "<HEAD><title>Test Seite Kesh</title></HEAD>";

Lesen der mit GET übergebenen Variablen

$buffer=$ENV{'QUERY_STRING'};

Aufsplitten auf die einzelnen Variablen des Formulars

@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;}
$user=$FORM{'User'};
$pfad="C:" . "\" . "wampp2" . "\" . "htdocs" . "\" . "user" . "\" . $user . "\" . "id.dat";
$sid=$FORM{'Session'};
if ($sid=='')
{
&help;

}
print $pfad;
print $sid;
open(DATEI, $pfad);
@inhalt=<DATEI>;
close(DATEI);

$in = @inhalt[0];

print @inhalt[0];

if ($in==$sid)
{
$body="<h1>Ahloaheee 123!</h1></center><br><FORM Action="login.html" Method="get"><input type=submit value="BACK">";
&print_html;

}
else
{
$body="<h1>Irgendwas läuft hier schief!</h1></center><br><FORM Action="login.html" Method="get"><input type=submit value="BACK">";
&print_html;
}

Beenden der HTML-Ausgabe

print "</BODY>\n";
print "</HTML>\n";

sub print_html
{
#html code mit eingefügten variablen; redirect für evtl weiterleitung, html für text er htmldatei
print <<END_of_html;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
$redirect
</HEAD>
<body>
$body
</BODY>
</HTML>
END_of_html
exit;
}
sub help
{
$body="<h1>Passwort fehlt!</h1></center><br><FORM Action="login.html" Method="get"><input type=submit value="BACK">";
&print_html;
exit;
}

  1. Hi Thomas

    Die Session-ID wird ja nach einem bestimmten Algorithmus generiert. Nun könntest du beispielsweise den User- bzw. Verzeichnisnamen in die Session-ID, z.B. als Hash-Wert, miteinbeziehen. Ergibt die Berechnung auf einer Seite eine andere ID als die übergebene, dann erscheint eine Fehlermeldung. Dies nur so als Ansatz. Zu dem Thema Sessions findest du im Archiv sicher noch hilfreichere Beiträge.

    MfG

    Tom2

    PS: Mit Perl habe ich mich bis jetzt leider nur ansatzweise beschäftigen können, wesshalb ich zu deinem Code nichts konkretes sagen kann.

    --
    SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
    ss:| zu:) ls:& fo:) de:] va:) ch:] sh:( n4:& rl:° br:> js:| ie:% fl:( mo:}
  2. Hallo Thomas,

    Ersetze mal deine Zeile:

    Lesen der mit GET übergebenen Variablen

    $buffer=$ENV{'QUERY_STRING'};

    mit diesen:

    if($ENV{'REQUEST_METHOD'} eq 'GET') {
       $buffer = $ENV{'QUERY_STRING'};
    }
    else {
       read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    }

    Dann kann dein script POST und GET verarbeiten.

    Gruss
    Ace

  3. Hi,

    Leider bekomme ich das überhaupt nicht gebacken ... will sagen, das POST - gelumbe :)

    Lesen der mit GET übergebenen Variablen

    $buffer=$ENV{'QUERY_STRING'};

    Geht mit dem CGI-Modul viiel einfacher.

    perldoc CGI

    HTH

    wunderwarzenschwein

    --
    ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
  4. Hi,

    du steckst ja noch voll am Anfang...

    Besonderes praekaer und schnellstens wegzumachen ist der Code:
    $pfad="C:" . "\" . "wampp2" . "\" . "htdocs" . "\" . "user" . "\" . $user . "\" . "id.dat";
    $sid=$FORM{'Session'};

    Was passiert denn bitteschoen, wenn jemand als uservariable (egal ob ueber GET oder POST) sowas wie ';delete C:\*.*' uebergibt?

    (Da haette uebrigens das 'use CGI'-Gefummle der beiden anderen Poster
    dich nicht vor gerettet. Aber wie du Variablen aus dem Netz parst war ja auch nicht deine Hauptfrage, bzw. sollte nicht dein Problem sein.
    Also ist die Antwort 'use CGI' eigentlich nicht sehr hilfreich...)

    Ich wuerde dir zwei Alternativen empfehlen:
    1. Benutze htaccess !
       Wenn du das machst, kannst du dir das ganze Session-geschmarre
       sparen und einfach nach der ENV-Variable
            REMOTE_USER
       pruefen.
       Die .htaccess packst du in dem CGI-Verzeichnis mit dem Skript.
       Zu .htaccess gibt es hier auf Teamone / selfaktuell eine sehr gute
       Anleitung!
    2. Ich hab da mal ein Modul geschrieben ...
        Digest::UserSID
       Das macht genau das was du da willst: Es vergibt und verwaltet
       Sitzungs-Ids.
       Du findest das Modul auf CPAN.

    Ansonsten gibt es unzaehlige weitere Perlmodule, die dir helfen.
    Such mal nicht unbedingt nur nach einer Hilfe fuer deinen obigen Code, sondern nach Loesungen wie man spezielle Userlogins machen kann.

    Ciao,
     Wolfgang

  5. Ich kann dir nur mal http://www.worldmusic.de/perl/dclpc-faq.txt an's Herz legen.

    und empfehle dir die Benutzung des sehr nützlichen Moduls CGI. (auch wenn der böse Wolf das anders sieht ist dieses Modul nicht nur für die Parameterabfrage sondern auch für Tabellen, Formulare und einiges mehr ein überaus sinnvoles Werkzeug - und sein Einwand mit dem delete ist falsch, da ab ; der parameter abgetrennt wird).

    ich hab dir mal eine etwas veränderte version mit CGI und nicht der Teilweise veralteten syntax ( '&' ist nicht nötig zum Funktionsaufruf und führt lediglich dazu, das der @_ Paramter weitergereicht wird, den du aber nicht verwendest in deinen Funktionen.)

    use CGI qw/:standard -nodebug/;
    use strict;

    print header(), start_html(-title => 'Test Seite Kesh');

    my $user = param('User') || 'test';
    my $pfad = "C:/wampp2/htdocs/user/$user/id.dat";
    my $sid = param('Session');
    my $body = "";

    print "$user ($pfad)";

    if(!$sid)
    {
        $body = h1('Passwort fehlt!')
        . start_form(-action => 'login.html', -method => 'get')
        . submit(-value => 'BACK')
        . end_form()
    }
    else
    {
        print $pfad;
        print $sid;

    open(DATEI, $pfad) || die "Kann $pfad nicht öffnen weil: $!";
        my @inhalt = <DATEI>;
        close(DATEI);

    my $in = @inhalt[0];
        print @inhalt[0];

    if ( $in eq $sid)
        {
            $body= h1('Ahloaheee 123!')
            . start_form(-action => 'login.html', -method => 'get')
            . submit(-value => 'BACK')
            . end_form()
            ;
        }
        else
        {
            $body = h1('Irgendwas läuft hier schief!')
            . start_form(-action => 'login.html', -method => 'get')
            . submit(-value => 'BACK')
            . end_form()
            ;
        }
    }
    print $body . end_html();

    Struppi.

    1. Hi,

      http://www.worldmusic.de/perl/dclpc-faq.txt an's Herz legen.

      Guter Link.

      und empfehle dir die Benutzung des sehr nützlichen Moduls CGI. (auch wenn der böse Wolf das anders sieht ist dieses Modul nicht nur für die Parameterabfrage sondern auch für Tabellen, Formulare und einiges mehr ein überaus sinnvoles Werkzeug - und sein Einwand mit dem delete ist falsch, da ab ; der parameter abgetrennt wird).

      Wuff! Groar! Rawuff! GRRRR! Aehm,...

      Der Einwand ist nicht falsch.
      Ich hab nur die bereits uebersetzte Version angegeben.
      Dir ist doch auch bewusst, dass man alle Zeichen entsprechend
      maskieren kann.
      Und wenn als Methode POST genommen werden wuerde, waere es ohnehin
      keine Frage mehr.  Aber da du nicht verhindern kannst, welche Methode die Leute nutzen (ein Formular kann sich ja jeder kopieren..)...

      Ich bin ansonsten nicht grundsaetzlich gegen 'use CGI;', nur
      war dies in diesem Fall ja nicht die Kernfrage.  Deswegen fand ich die banalen vorherigen Antworten nicht hilfreich, sondern eher irrefuehrend.

      Ciao,
        Wolfgang