PHP και Authentication Methods

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από MaZz » 08 Μάιος 2008 00:40

Ποιος κατά τη γνώμη σας είναι ο καλύτερος τρόπος - και ο πιο ασφαλής - να ελέγχουμε την αυθεντικότητα ενός χρήστη βάσει των στοιχείων που υπάρχουν στη βάση (username και password) όσον αφορά την πλευρά του client (browser). Με άλλα λόγια να χρησιμοποιούμε τα cookies για να αποθηκεύουμε το user id και τον κωδικό (md5 encrypted) ελέγχοντας και αντιπαραβάλλοντας κάθε φορά τα στοιχεία αυτά με τη βάση? Ή να χρησιμοποιηούμε τα sessions για να κρατάμε μόνο πληροφορία για το αν ο χρήστης είναι logged in και συνεπώς να λύσουμε όλα τα προβλήματα που έχουν σχέση με την ασφάλεια?

Και τι γίνεται αν ο χρήστης θέλει να είναι μόνιμα συνδεδεμένος? Τότε αναγκαστικά αποθηκεύουμε τον κωδικό του χρήστη σε cookies?

Ποια τα πλεονεκτήματα και τα μειονεκτήματα της καθεμιάς από τις παραπάνω μεθόδους. Υπάρχουν εναλλακτικές λύσεις?

Ευχαριστώ.

Άβαταρ μέλους
AAT
Δημοσιεύσεις: 379
Εγγραφή: 23 Αύγ 2007 16:31
Τοποθεσία: Lemesos, Limassol
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από AAT » 09 Μάιος 2008 21:58

xm, mporeis na xrisimopiiseis kai ta dio, mporeis na apothikeveis sthn vash prota an o user thelei na einai online. Meta me sessions ratas to name toy site|ena id gia na xaraktirizei thn session poy to kratas kai sthn vash|base64(username)|md5(pass)

kai kratas to session id se ena cookie. An user => open session, logged in with cookies, no cookie => false

An user => open session, logged in, no cookie => true

An user => logged in long term, no session, cookie => flase

k.t.l an katalavaineis ti ennoo. Fisika to megalo prob einai pos tha svistei apo thn vash to session kai to cookie id, tha to svineis molis entopizeis oti to cookie den iparxei me to id ths session.

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από MaZz » 09 Μάιος 2008 23:17

Οπότε καταλήγουμε στο συμπέρασμα ότι ο ασφαλέστερος τρόπος πιστοποίησης αυθεντικότητας του χρήστη μπορεί να γίνει μόνο με sessions. Από ότι διάβασα, το να κρατάς τον κωδικό του χρήστη σε ένα cookie είναι μια πάρα πολύ κακή λύση ακόμη και όταν αυτός είναι κρυπτογραφημένος. Ωστόσο και πάλι προκύπτουν προβλήματα αυθεντικότητας καθότι αν κάποιος μάθει το session_id μπορεί πάλι να κάνει ζημιά.

Άρα το θέμα της ασφάλειας δεν είναι ένα απλό ζήτημα, απλά συνέχεια προσπαθούμε να βρούμε τον καλύτερο και πιο ασφαλέστερο (κατά τη γνώμη μας πάντα) τρόπο.
Στις ακραίες περιπτώσεις: όταν δηλαδή πρόκειται, για παράδειγμα, να αποθηκεύσουμε τον αριθμό μιας πιστωτικής κάρτας, είναι προτιμότερο να χρησιμοποιούμε ένα δικό μας μηχανισμό κρυπτογράφησης.

Άβαταρ μέλους
AAT
Δημοσιεύσεις: 379
Εγγραφή: 23 Αύγ 2007 16:31
Τοποθεσία: Lemesos, Limassol
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από AAT » 10 Μάιος 2008 00:42

Mporeis panta na xrisimopiiseis pio advanced mesa gia asfalia, egw panta protimw sessions epidi o user dn mporei na tis diabasei kathos "kribontai" se ena cache folder h thn ram. Tora an to cookie einai aparetito mporoyme na baloyme mesa kai alles plirofories opos apo poy pire to cookie o user. An prokite gia akrees periptoseis opos credit cards etc na protimate na xrisimopiite mono sessions akoma kai an ston user tha einai dyskolo. Akoma se teties periptoseis mporeite na kanete ena diaforetiko systima encryption apo ta ipolipa kai na xrisimopiite SSL(Secure Soccet Layer).

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από cpulse » 16 Μάιος 2008 01:33

Μη βάζετε ταμπέλες... όλα σπάνε. Δεν υπάρχει σωστό και λάθος. Υπάρχει καλύτερο και χειρότερο ως προς συγκεκριμένες παραμέτρους.

Τα cookies με προσεγμένη χρήση μπορούν να γίνουν σχετικά ασφαλή. Και τα sessions με απρόσεχτη χρήση μπορούν να γίνουν εντελώς ανασφαλή. Πχ.. να βάζεις το session ID στα URL.

Ας πούμε οτι θέλεις να βάλεις το username και password στα cookies. Μπορείς, αλλά είναι πανεύκολο κάποιο spyware να στο υποκλέψει. Μπορείς όμως να κάνεις κάτι ποιο έξυπνο.. να παίξεις με hashes. MaZz από όσο σε έχω γνωρίσει από τα posts που κάνεις φαντάζομαι θα ξέρεις τι είναι αυτά οπότε θα πάω κατευθείαν στα βαθιά.

Θα μπορούσες να φτιάξεις ένα cookie με το αυτούσιο username αλλά το password σε μορφή hash. Επειδή έχω μια μπερδεμένη σκέψη στο μυαλό μου θα στην πω σε βήματα:

Η απλούστερη μορφή είναι αυτή:

Κώδικας: Επιλογή όλων

setcookie('username', $username');
setcookie('password', md5($password));
Πιστοποίηση:

Κώδικας: Επιλογή όλων

$password = @$_COOKIE['password'];
if ($db_password == md5($password)) { ..password is ok.. }
Αλλά έτσι με ένα md5 database μπορείς να κάνεις reverse το hash. Οπότε μπορείς να βάλεις λίγο salt..

Κώδικας: Επιλογή όλων

setcookie('username', $username');
$salt = mt_rand(1000000, 9999999);
setcookie('password', $salt . ':' . md5($salt . $password));
Πιστοποίηση:

Κώδικας: Επιλογή όλων

$password = explode(':', @$_COOKIE['password']);
if (count($password) == 2 && md5($password[0] . $db_password) == $password[1]) { ..password is ok.. }
Όμως ακόμα κι αυτό έχει ένα πρόβλημα. Μπορεί με τον καιρό κάποιος να υποκλέψει το salt και το hashed password και να το χρησιμοποιήσει. Άρα μια ακόμα δικλίδα ασφαλείας είναι να βάλεις και μια ημερομηνία, άρα να εξαναγκάζεις τον χρήστη να κάνει login τουλάχιστον μια φορά τον μήνα και έτσι να ανανεώνεται το cookie:

Κώδικας: Επιλογή όλων

setcookie('username', $username');
$salt = mt_rand(1000000, 9999999);
setcookie('password', $salt . ':' . md5($salt . date('Ym') . $password));
Πιστοποίηση:

Κώδικας: Επιλογή όλων

$password = explode(':', @$_COOKIE['password']);
if (count($password) == 2 && md5($password[0] . date('Ym') . $db_password) == $password[1]) { ..password is ok.. }
Τώρα από την πλευρά του session το πρόβλημα είναι οτι ο server με κάποιο τρόπο πρέπει να ενημερώνεται με το session id. Συνήθως το session id περνάει σε μορφή cookie, και όταν αυτό δεν γίνεται περνάει σαν URL variable. Αυτό μπορεί να αντιμετωπιστεί σχετικά εύκολα.. απλά σώνεις σε ένα από τα session variables την IP του χρήστη ή και κανένα hash από τα cookies του για περισσότερη ασφάλεια. Έτσι αν κάποιος πάει να χρησιμοποιήσει το session id θα εντοπιστεί επειδή θα έχει διαφορετική IP:

Κώδικας: Επιλογή όλων

if (!isset($_SESSION['user_ip']))
  $_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
else if ($_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
  die('Που πας ρε καραμήτρο;');
Και η παράνοια μπορεί να συνεχιστεί εις άπειρον :)
Το θέμα είναι.. αξίζει να πάρεις τόσα πολλά μέτρα; Γνώμη μου είναι οτι αξίζει να αγχώνεται κανείς μόνο σε περιπτώσεις καταστημάτων.. ή κάτι αντίστοιχο που παίζονται λεφτά ή πολύ ευαίσθητα προσωπικά δεδομένα στη μέση.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από cherouvim » 16 Μάιος 2008 09:30

Το "remember me" είναι δύσκολο πρόβλημα για να λυθεί σωστά.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από cpulse » 16 Μάιος 2008 10:35

Χθες βιάστηκα να βγάλω όλα τα παραδείγματα και ξέχασα το πιο σημαντικό. Σε όλα τα βήματα μπορεί να μπεί κι ένα εσωτερικό salt από πλευράς του server για να μπερδέψει εντελώς το τελικό hash. Αυτό πρέπει να είναι κάτι εντελώς τυχαίο αλλά σίγουρα μεγάλο σε μήκος.

Κώδικας: Επιλογή όλων

$srv_salt = 'snf-awiufna-wfna-0fna-31trunat6u4naq-9tunw0-4t7unq0-49tun3nnpfwea';

Βήμα 1
---
setcookie('username', $username');
setcookie('password', md5($srv_salt . $password));
---
$password = @$_COOKIE['password'];
if ($db_password == md5($srv_salt . $password)) { ..password is ok.. }


Βήμα 2
---
setcookie('username', $username');
$salt = mt_rand(1000000, 9999999);
setcookie('password', $salt . ':' . md5($srv_salt . $salt . $password));
---
$password = explode(':', @$_COOKIE['password']);
if (count($password) == 2 && md5($srv_salt . $password[0] . $db_password) == $password[1]) { ..password is ok.. }


Βήμα 3
---
setcookie('username', $username');
$salt = mt_rand(1000000, 9999999);
setcookie('password', $salt . ':' . md5($srv_salt . $salt . date('Ym') . $password));
---
$password = explode(':', @$_COOKIE['password']);
if (count($password) == 2 && md5($srv_salt . $password[0] . date('Ym') . $db_password) == $password[1]) { ..password is ok.. }
Κι όσο θες να το τραβήξεις.. δεν σου φέρνει αντίρρηση. Πχ μπορείς να έχεις ένα τέτοιο server salt ξεχωριστά για κάθε χρήστη, ή να μπλέξεις κι άλλο την κατάσταση βάζοντας κι άλλα cookies.

Άβαταρ μέλους
dik_
Δημοσιεύσεις: 476
Εγγραφή: 07 Ιουν 2007 11:28

PHP και Authentication Methods

Δημοσίευση από dik_ » 16 Μάιος 2008 13:13

cherouvim έγραψε:Το "remember me" είναι δύσκολο πρόβλημα για να λυθεί σωστά.
Δηλαδή; Αν διαβάζεις μπισκοτάκι με username / password με αλατάκι και σετάρεις το session;

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από MaZz » 16 Μάιος 2008 13:15

Ευχαριστώ cpulse για την απάντηση.
Μου άρεσε ιδιαίτερα η προσέγγισή σου για τα Sessions όσον αφορά τον έλεγχο της IP.

Όσο για το salt θα προτιμούσα να χρησιμοποιήσω την τελευταία τεχνική που επισήμανες: δηλαδή να κρατάω ένα hash στον server και να ελέγχω την είσοδο του χρήστη.

Ορίστε λοιπόν και η δική μου προσέγγιση (λαμβάνοντας υπόψη όλα τα παραπάνω που ανέφερες):

Login

Κώδικας: Επιλογή όλων

$username = @$_POST['uname'];
$password = @$_POST['pass'];
$salt = 'O_KAKOS_O_LYKOS';

$encrypted_password = md5($salt . $password . $salt);

//....
//έλεγχος αν είναι σωστό το username kai to password: SELECT FROM `users` WHERE `username` = '$username' AND `password` = '$encrypted_password'
//...

if ($login_success) {
     session_start();
     set_cookie('uname', $username);
     set_cookie('pass', $encrypted_password);
     $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
     $_SESSION['login'] = 1;
}
και μετά σε κάθε σελίδα θα κάνω τον έλεγχο αν το $_SESSION['login'] είναι 1 και αν το $_SESSION['ip'] αντιστοιχεί στο μηχάνημα του χρήστη. Αν όχι θα συνδέομαι στον πίνακα των χρηστών στη ΒΔ, θα ελέγχω αν τα cookies είναι έγκυρα και θα εφαρμόζω την ίδια διαδικασία με το login.

Άβαταρ μέλους
AAT
Δημοσιεύσεις: 379
Εγγραφή: 23 Αύγ 2007 16:31
Τοποθεσία: Lemesos, Limassol
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από AAT » 21 Μάιος 2008 19:06

akoma mporoyme na kanoyme ena mikro-hash me bash to base64. As poyme oti to kanoyme mesa se ena function cryptit($what_to_hash, $hash_password);

Κώδικας: Επιλογή όλων

$password = sha1($password);
$username = cryptit($username);
$userip = cryptit($_SERVER['REMOTE_ADDR']);
$userref = cryptit($_SERVER['HTTP_REFERRER']);
$userdate = cryptit(date(Y|m|D));
$cookie_contents = "sitename-|-" . $username . "-|-" . $password . "-|-" . $userip . "-|-" . $userref . "-|-" . $userdate;
set_cookie('wtf', $encrypted_password);
Kai meta ta kanoyme explode kai ta ellegkxoyme sthn bash.
++ Akoma mporoyme na exoyme ena field is_online kai na to tsekaroyme stis selides mas.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από cpulse » 21 Μάιος 2008 21:54

Με αυτό πέτυχες ένα ορθογραφικό λάθος της PHP.
HTTP_REFERER .. με ένα R είναι το σωστό

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από MaZz » 21 Μάιος 2008 23:52

Στα παραδείγματα δεν μετράνε τα λάθη... Εξάλλου τη λογική θέλει να δείξει :P

@AAT
μήπως εννοείς set_cookie('wtf', $cookie_contents); ?

Το cryptit() τι είναι? Δικός σου μηχανισμός κρυπτογράφησης?

Άβαταρ μέλους
AAT
Δημοσιεύσεις: 379
Εγγραφή: 23 Αύγ 2007 16:31
Τοποθεσία: Lemesos, Limassol
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από AAT » 22 Μάιος 2008 06:08

Nai opos ipa kai pano, me bash thn base64.....
LOL to script to egrapsa sta grigora :P

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

PHP και Authentication Methods

Δημοσίευση από soteres2002 » 22 Μάιος 2008 14:40

ego edo kai 1 xrono doulevo to eksis authentication scheme: local PAM authentication i Kerberos kai apothikeusi enos token se cookie. Pistevo an oxi o asfalesteros toulaxiston apo tis pio asfaleis idees. To cookie ousiastika pauei na krataei xrisimi pliroforia gia kapoion kakoboulo xristi, afou ta tokens ta opoia analoga apothikeuontai se cookies pauoun na kratoun xrisimi pliroforia gia kakoboulous xristes meta apo sintomo xroniko diastima (px einai valid gia ena session mono). Ena - omos einai gia to PHP setup to opoio xreiazetai katallilo configuration apo ton administrator, alla den einai diskolo na ginei kai apo enan aplo xristi mesw enos tutorial kata bimata. Akomi to sistima prepei na einai Linux kai na kanei local authentication meso Pluggable Authentication Modules i/kai na exei Kerberos installed. To authentication dld ginetai se system level kai oxi mesw ton requests, ara kanei to ergo diskolo gia intruders (eidika an iparxei kai SSL metaksi client kai web server).

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

PHP και Authentication Methods

Δημοσίευση από MaZz » 22 Μάιος 2008 15:31

Το θέμα όμως είναι να κάνουμε όσο το δυνατόν ανεξάρτητες τις εφαρμογές μας από extra modules. Γιατί έστω ότι γράφεις μία εφαρμογή που εξαρτάται από τον kerberos. Αν ο server που έχεις το hosting δεν υποστηρίζει το αντίστοιχο module τότε τι κάνεις? (δε μιλάω για δικό μου server αφού εκεί μπορώ να κάνω ότι θέλω)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες