Προς το περιεχόμενο

Μπορεί να αλλάξει ο χρήστης το session?


L34x88iT

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα. Θέλω να κάνω μια ερώτηση για θέμα ασφάλειας. Επειδή θέλω να είμαι σίγουρος. 

Μην βαράτε μπορεί να είναι πολύ γελοία η ερώτηση, γιατί είμαι 99% σίγουρος οτί δεν γίνεται αυτό που περιγράφω παρακάτω, απλά θέλω να είμαι 100% σίγουρος :(

'Εχω φτιάξει ένα custom site, ο χρήστης κάνει login και δημιουργείται από την php (codeigniter) ενα session με userdata. πχ. id=5, loggedin = true κλπ.

Και απο το controller μεταξύ άλλων στέλνω τα data από ένα model

πχ. 

    if($this->session->userdata('id') != 0 && $this->session->userdata('id') != NULL && $this->session->userdata('id') != "")
        { 
        $user_id = $this->session->userdata('id');
        $data["user_data"] = $this->users_model->get_user_info($user_id);
        }
    
    $this->load->view('templates/header',$data);
	$this->load->view('pages/'.$page,$data);
	$this->load->view('templates/footer',$data)

και το view το έχω έτσι

<?php if(($this->session->userdata('loggedin'))){?>
<?php foreach($user_data as $user){?>
.
.
.
.
.
.
.
.

<? } ?>
<? } ?>

Οπως το έχω φτιάξει δουλέυει μια χαρά, απλά είμαι περίεργος γιατί θέλω να είμαι ασφαλής, μπορεί κάποιος από frontend να αλλάξει κάποια τιμή που έχει αποθηκευθει στο session του? Δηλαδή να κάνει εγγραφή, το id του να είναι 45, να ανοίγει τα στοιχεία που τραβιούνται από την βάση και που ανήκουν στον χρήστη 45, αλλά με κάποιο τρόπο από frontend (javascript?, εξωτερική σελίδα?) να αλλάξει το session id του σε 43. Οπότε να βλέπει τα δεδομένα του 43.

Επεξ/σία από L34x88iT
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αναφορά σε κείμενο

Μπορεί να αλλάξει ο χρήστης το session?

Γενικά, και χωρίς να έχω κοιτάξει τον κωδικά σου: όχι. Το session υπάρχει στο server. Αν δεν στείλεις εσύ στοιχεία στον client και δεν "αφήσεις" εσύ με κάποιον τρόπο να κάνει αλλαγές ο client, δεν μπορεί δει και να αλλάξει τιμές του.

Αν όμως έχεις κάτι τέτοιο:

$_SESSION['a'] = $_GET['test'];

τότε μπορεί να αλλάξει ότι υπάρχει στο κλειδί 'a', "χτυπώντας" απλά στο site σου με ένα url argument με όνομα "test" και ότι τιμή θέλει. Με το παραπάνω παράδειγμα μπορεί να πειράξει το κλειδί "a" και τα "παιδιά" του βάζοντας ότι τιμές θέλει (πχ μπορεί δημιουργήσει και να βάλει τιμή εδώ: $_SESSION['a']['b']). Δεν μπορεί να ξεφύγει όμως από αυτό και να πειράξει πχ το $_SESSION['b'].

Μπορεί επίσης να ζητήσει νέο session id  (αν απλά δεν στείλει session id)  ή να στείλει session id άλλου χρήστη και έτσι να έχει το session του άλλου χρήστη αν το γνωρίζει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό που λες λέγεται session hijacking

Μπορεί ο χρήστης να στείλει οποιοδήποτε session_id θέλει είτε αλλάζοντας την τιμή στο coockie είτε βάζοντας το ως παράμετρο στο url πχ

"http://host/index.php?PHPSESSID=1234"

Είναι όμως δύσκολο να πετύχεις κάποιο id px εμένα σε αυτό το session μου έδωσε 0419ce12b40000fcb55d083207000001

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
9 ώρες πριν, k33theod είπε

Αυτό που λες λέγεται session hijacking

Μπορεί ο χρήστης να στείλει οποιοδήποτε session_id θέλει είτε αλλάζοντας την τιμή στο coockie είτε βάζοντας το ως παράμετρο στο url πχ

"http://host/index.php?PHPSESSID=1234"

Είναι όμως δύσκολο να πετύχεις κάποιο id px εμένα σε αυτό το session μου έδωσε 0419ce12b40000fcb55d083207000001

 

12 ώρες πριν, elvizakos είπε

Γενικά, και χωρίς να έχω κοιτάξει τον κωδικά σου: όχι. Το session υπάρχει στο server. Αν δεν στείλεις εσύ στοιχεία στον client και δεν "αφήσεις" εσύ με κάποιον τρόπο να κάνει αλλαγές ο client, δεν μπορεί δει και να αλλάξει τιμές του.

Αν όμως έχεις κάτι τέτοιο:


$_SESSION['a'] = $_GET['test'];

τότε μπορεί να αλλάξει ότι υπάρχει στο κλειδί 'a', "χτυπώντας" απλά στο site σου με ένα url argument με όνομα "test" και ότι τιμή θέλει. Με το παραπάνω παράδειγμα μπορεί να πειράξει το κλειδί "a" και τα "παιδιά" του βάζοντας ότι τιμές θέλει (πχ μπορεί δημιουργήσει και να βάλει τιμή εδώ: $_SESSION['a']['b']). Δεν μπορεί να ξεφύγει όμως από αυτό και να πειράξει πχ το $_SESSION['b'].

Μπορεί επίσης να ζητήσει νέο session id  (αν απλά δεν στείλει session id)  ή να στείλει session id άλλου χρήστη και έτσι να έχει το session του άλλου χρήστη αν το γνωρίζει.

Καλημέρα. Όλο το Session το δίνω εγώ από το backend. Δεν χρησιμοποιώ πουθενά GET. 

Δηλαδή όταν κάποιος κάνει login και συμφωνεί το email του και ο κωδικός του, τότε φτιάχνεται ένα array με το id του που είναι ο άυξων αριθμός που παίρνει από τον πίνακα users στη βάση και αντιστοιχεί σε αυτόν.

$userdata ( "id" => $row->id, "loggedin" => true)

και μπαίνει στο session του. Τώρα αν θέλει αυτός ο χρήστης να δει τα μηνύματά του, καλούνται από τον πίνακα messages στην βάση, όλα τα μηνύματα που αφορούν το συγκεκριμένο id και στέλνονται στο view του χρήστη.                

$data["messages"] = $this->users_model->get_messages($this->session->userdata('id'));

-------------------------ΓΙΑ ΠΑΡΑΔΕΙΓΜΑ----------------------------

Αν συνδεθεί ο χρήστης και πάρει στο session του το id του που είναι ο αριθμός του στην βάση, πχ 35, τότε έχουμε.

$userdata ( "id" => 35, "loggedin" => true)

και

$data["messages"] = $this->users_model->get_messages(35);

Αυτο που ρωτάω και με απασχολεί είναι το εξής:

Μπορεί ο χρήστης από τον browser του να κάνει κάτι και αλλάξει στο session του το id του? Δηλαδή να το κάνει 34 για παράδειγμα, οπότε...

$userdata ["messages"] = $this->users_model->get_messages(34); 

και να βλέπει τα μηνύματα του 34?

 

 

 

Επεξ/σία από L34x88iT
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όχι ακριβώς. Μπορεί να αλλάξει το session id του (ένα cookie είναι στο browser, όπως εξηγεί ο @k33theod) αλλά δεν είναι το ίδιο με το id που δίνεις εσύ. Επίσης επειδή είναι hashed δεν είναι εύκολο να βρει το προηγούμενο, το επόμενο κλπ. Αν όμως γνωρίζει το session id κάποιου άλλου χρήστη, τότε ναι, μπορεί να το κάνει και θα έχει συνδεθεί σαν εκείνον χωρίς να χρειάζεται να εισάγει κωδικό και όνομα χρήστη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ακριβώς το ID που λες εσύ δεν έχει καμία σχέση με το session_id. Το δεύτερο αλλάζει σε κάθε νέο session (κάθε φορά που κλείνεις τον browser) και υπάρχει για να γνωρίζει ο server σε κάθε νέο request από που έγινε αυτό.  

  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αφου εισαι σε framework, γιατι δε βαζεις κανα δοκιμασμενο module? Ειναι και πιο βολικο, πχ σε laravel με το Auth::user() εχεις ενα instance του model του συνδεδεμενου χρηστη

  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...