[PHP] beveiligde login met sessions in de db

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 22-09 13:35
Op het moment ben ik bezig met een veilige niet af te luisteren login, waarmee je net als op GoT een overzicht kan krijgen van je sessies, en deze ook kan terminaten vanaf 1 locatie.

Het idee is als volgt:

Bij login checken of de cookies 'sessionid' en 'hash' bestaan.
Zo ja, validaten in de sessions tabel, waarbij hash een md5 is van je remote_addr en password achter elkaar geplakt. --> bij succes ben je bent ingelogd.

Zo nee, uiteraard de cookies killen.

Zo komt die check er ongeveer uit te zien:
PHP:
1
2
3
4
5
6
7
8
9
10
11
    function check() {
        if (isset($_COOKIE['sessionid']) AND isset($_COOKIE['hash']) {
            if ($row =$db->query_first("SELECT password, remoteaddr 
                                                FROM sessions
                                                WHERE sessionid = '$sessionid'")) {
                $hash = md5($row['password'] . $row['remoteaddr']               
                if ($hash == $_COOKIE['hash'] {
                        return true;
                }
            }
        }


Nu weet ik alleen niet goed, als ik een remote_addr in de sessions tabel heb, er zit een remote_addr verweven in de hash, en ik heb in php een remote_addr, welke ik met elkaar moet vergelijken :X

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Het toevoegen van die hash heeft weinig nut. Sowieso zou ik die niet baseren op bestaande gegevens. Als je graag die hash toe wilt voegen, baseer deze dan op een random nummer en sla deze in de db op.

Het remote adres zou ik gewoon alleen in de session tabel zetten. Eventueel kun je deze null laten voor het geval de gebruiker zijn sessie niet aan IP wil verbinden (een laptop die op verschillende plaatsen aan het netwerk gaat bijvoorbeeld)

[ Voor 25% gewijzigd door Janoz op 29-08-2007 15:24 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

(jarig!)
Dat laatste snap ik niet helemaal... je hebt een hash van ip+password in de tabel staan. Als je user weer opnieuw op de site inloged, check je toch die hash wat in de tabel staat met de nieuwe hash van je cookie (van ingevoerde pass en ip)?
Daarnaast wat gebeurt er met users die een dynamisch ip hebben?

euh...ja


Acties:
  • 0 Henk 'm!

  • silentsnake
  • Registratie: September 2003
  • Laatst online: 21-09 05:27
Wel eens waar Perl en geen PHP, maar voor een voorbeeldje lijkt me dit toch ook wel prima. :P

Zoals je hieronder ziet genereer ik een md5 hash van een random gegenereerde combinatie van hoofdletters, kleine letters en cijfers. Dat gebruik ik as session id in de cookie, en vervolgens sla ik dat ook nog op in de database (wat hier niet staat). Nummber valt niet te reproduceren aangezien het niet gebaseerd is op bestaande gegevens.

En ja, ik zet altijd commentaar in het Engels in me code :P

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl 

use String::Random;
use Digest::MD5;
use CGI;
use strict;

my $cgi = new CGI;

# Random pattern is being generated here for the MD5 session id.
# C = capital letter, c = normal letter, n = number.
my $random = new String::Random;
my $new_sid = md5_hex($random->randpattern("CCcnCcCnn"));

my $cookie = $cgi->cookie( 
                    -name  => "sid",
                    -expires => "+60m",
                    -path     => "/usr/local/www",
                    -value   => "$new_sid" 
);

print $cgi->header ( -cookie => $cookie );


offtopic:
Waarom heeft Perl geen color highlighting? :(

[ Voor 11% gewijzigd door silentsnake op 29-08-2007 16:13 . Reden: CGI handler vergeten toe te voegen e.d. ]


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 22-09 13:35
Op het moment heb ik het zo opgelost:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
    function check() {
        $loggedin = false;
        if (isset($_COOKIE['sessionid']) {
            if ($row =$db->query_first("SELECT link_addr, remote_addr  
                                                FROM sessions
                                                WHERE sessionid = '$sessionid'")) {
                if ($row['link_addr'] == 0 || $row['remote_addr'] == $_SERVER['remote_addr'] {
                        $loggedin = true;
                }
            }
        return $loggedin;
        }


Als mensen link_addr op 0 hebben staan negert het script het adres dus :)

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Hou er rekening mee dat een remote ip niet een unieke bezoeker hoeft aan te duiden. Bedrijven gebruiken gateways alle alle werknemers gaan via hetzelfde IP naar buiten. Aan de andere kant is een IP adres ook niet statisch. Via een DHCP recycle is het mogelijk dat je 'ineens' een ander IP adres gebruikt.

Het beste kun je random generated hash gebruiken. Een andere betere mogelijkheiden om gebruikers te herkennen is het gebruik van server/client ssl certificaten.

If it isn't broken, fix it until it is..

Pagina: 1