Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [CodeIgniter]Pytanie o sesje i problem z cookies.
adbacz
post
Post #1





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Zrobiłem skrypt do logowania i z pomocą przyszły mi klasy Session z CI. Teraz sobie czytam o sesjach, że są robione po stronie serwera (odwrotnie niż ciastka - user-side).

Takie coś pisze w Class Session w UserGuide:
Cytat
Note: Cookies can only hold 4KB of data, so be careful not to exceed the capacity. The encryption process in particular produces a longer data string than the original so keep careful track of how much data you are storing.


Najpierw czytam, że są to ciastka po stronie usera (w UG) a teraz, że sesja jest po stronie serwera. Jak to wreszcie jest z tą sesją?

Ten post edytował adbacz 11.05.2011, 12:00:09
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
adbacz
post
Post #2





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Z tym co napisałeś, żeby w sesji zapisać czy użytkownik jest zalogowany to już tak robiłem, jesli jest wartość 1 to zalogowany - jeśli 0 lub brak, wylogowany. No ale i tak, oprócz tego musiałbym dać coś jeszcze, bo przecież takie informacje można zmienić.

Ale chwila, przecież to sesja...

PS.
Zrobiłem coś takiego. Główny kod llogowania:
  1. function loguj() {
  2. $this->load->library('logowanie_lib');
  3.  
  4. $login = $this->input->post('login');
  5. $haslo = $this->input->post('haslo');
  6.  
  7. $zapytanie = $this->db->query("SELECT * FROM user_admin WHERE login = '".$login."'");
  8. foreach($zapytanie->result() as $i) {
  9. $user_id = $i->user_id;
  10. $haslo_db = $i->haslo;
  11. }
  12.  
  13. $hash = md5(sha1($login.$this->input->ip_address().date("His")));
  14.  
  15. $this->db->query("UPDATE user_admin SET sesja = '".$hash."', last_ip = '".$this->input->ip_address()."' WHERE user_id = ".$user_id."");
  16.  
  17. $this->session->set_userdata(array('user_id' => $user_id, 'pass' => $hash));
  18.  
  19. if($this->logowanie_lib->sprawdz() == TRUE) {
  20. echo 'jesteś zalogowany';
  21. }
  22. elseif($this->logowanie_lib->sprawdz() == FALSE) {
  23. echo 'Nie jestes zalogowany';
  24. }
  25. }


I biblioteka Logowanie_lib.php:
  1. function sprawdz() {
  2. $CI =& get_instance();
  3.  
  4. $pass = $CI->session->userdata('pass');
  5. $user_id = $CI->session->userdata('user_id');
  6.  
  7. $zapytanie = mysql_query("SELECT last_ip FROM user_admin WHERE user_id = ".$user_id."");
  8. while($wiersz = @ mysql_fetch_row($zapytanie)) {
  9. $ip_address_db = $wiersz[0];
  10. }
  11.  
  12. $ip_address_cookie = $CI->input->ip_address();
  13.  
  14. if($pass == 0 || $user_id == 0 || $ip_address_db != $ip_address_cookie) {
  15. return FALSE;
  16. }
  17. if($pass != 0 && $user_id != 0 && $ip_address_db == $ip_address_cookie) {
  18. return TRUE;
  19. }
  20. }


Działa dobrze, tylko, że to i tak po wyłączeniu przeglądarki wszystko się "refresh" i już nie jestem zalogowany.

To zapisywanie userID oraz ciągu znaków pod nazwą pass wziąłem z pewnego portalu znanego. Zauważyłem, że po zmianie obojętnie którego jestem automatycznie wylogowany więc uznałem, że to dobrze rozwiązanie. Tylko tak, mimo, że wyłącze przeglądarkę - nadal jestem zalogowany.

Ten post edytował adbacz 12.05.2011, 15:20:33
Go to the top of the page
+Quote Post
szok
post
Post #3





Grupa: Zarejestrowani
Postów: 165
Pomógł: 20
Dołączył: 2.03.2006

Ostrzeżenie: (0%)
-----


OK przyj żyjmy się twojemu programowi:

Cytat(adbacz @ 12.05.2011, 14:10:00 ) *
Z tym co napisałeś, żeby w sesji zapisać czy użytkownik jest zalogowany to już tak robiłem, jesli jest wartość 1 to zalogowany - jeśli 0 lub brak, wylogowany. No ale i tak, oprócz tego musiałbym dać coś jeszcze, bo przecież takie informacje można zmienić.

Ale chwila, przecież to sesja... (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) ?

PS.
Zrobiłem coś takiego. Główny kod llogowania:
  1. function loguj() {
  2. $this->load->library('logowanie_lib');
  3.  
  4. $login = $this->input->post('login');
  5. $haslo = $this->input->post('haslo');
  6.  
  7. $zapytanie = $this->db->query("SELECT * FROM user_admin WHERE login = '".$login."'");
  8. [color="#FF0000"]Sprawdz logowanie, po samym loginie? a hasła zadnego juz nie sprawdzasz? to po co one jest? Wystarczy ze znam login i juz jestem zalogowany
  9. petla foreach, nie wiem co chcesz tutaj robić, przecież szukasz jednego jedynego rekordu z użytkownikiem, a a nie kilku?
  10. [/color]
  11. foreach($zapytanie->result() as $i) {
  12. $user_id = $i->user_id;
  13. $haslo_db = $i->haslo;
  14. }
  15.  
  16. $hash = md5(sha1($login.$this->input->ip_address().date("His"))); [color="#FF0000"]Rozumiem że to ma być identyfikator sesji? date his, bedzie troche za słabe ... ogólnie po co skoro, PHP sam zapisuje SESSID[/color]
  17.  
  18. $this->db->query("UPDATE user_admin SET sesja = '".$hash."', last_ip = '".$this->input->ip_address()."' WHERE user_id = ".$user_id."");
  19. [color="#FF0000"]Tutaj rozumiem że zapisać adres ip, cały czas nie wiem po co pole "sesja" i zapis do niej tego hashu, który i tak tutaj praktycznie Nic Ci nie daje. [/color]
  20.  
  21. $this->session->set_userdata(array('user_id' => $user_id, 'pass' => $hash));
  22. [color="#FF0000"]Nie zapisuj hasła w sesji! [/color]
  23.  
  24. if($this->logowanie_lib->sprawdz() == TRUE) {
  25. echo 'jesteś zalogowany';
  26. }
  27. [color="#FF0000"]Ok, sprawdzasz czy jest zalogowany TRUE, a zaraz potem sprawdzasz czy ma false, przecież jeżeli niema TRUE to: Może być false, może byc null, może zmiennej w ogóle nie być.
  28. wystarczy if (zalogowany) else 'ok to nie'[/color]
  29. elseif($this->logowanie_lib->sprawdz() == FALSE) {
  30. echo 'Nie jestes zalogowany';
  31. }
  32. }


I biblioteka Logowanie_lib.php:
  1. function sprawdz() {
  2. $CI =& get_instance();
  3.  
  4. $pass = $CI->session->userdata('pass');
  5. $user_id = $CI->session->userdata('user_id');
  6.  
  7. [color="#FF0000"]Co tu robi MYSQL_QUERY? , ogołnie po co to zapytanie? [/color]
  8. $zapytanie = mysql_query("SELECT last_ip FROM user_admin WHERE user_id = ".$user_id."");
  9. while($wiersz = @ mysql_fetch_row($zapytanie)) {
  10. $ip_address_db = $wiersz[0];
  11. }
  12. [color="#FF0000"](IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) ? Tutaj to ja już nic nie rozumie, dajesz zapytanie o ostatni adres IP, aby zaraz pobrać aktualny, podczas gdy przy logowaniu zapisujesz własnie ten aktualny adres IP[/color]
  13. $ip_address_cookie = $CI->input->ip_address();
  14.  
  15. if($pass == 0 || $user_id == 0 || $ip_address_db != $ip_address_cookie) {
  16. return FALSE;
  17. }
  18. if($pass != 0 && $user_id != 0 && $ip_address_db == $ip_address_cookie) {
  19. return TRUE;
  20. }
  21.  
  22. [color="#FF0000"]Przecież tu wyżej wystarczy tylko return $this->session->userdata('zalogowany');
  23. [/color] }


Działa dobrze, tylko, że to i tak po wyłączeniu przeglądarki wszystko się "refresh" i już nie jestem zalogowany.

To zapisywanie userID oraz ciągu znaków pod nazwą pass wziąłem z pewnego portalu znanego. Zauważyłem, że po zmianie obojętnie którego jestem automatycznie wylogowany więc uznałem, że to dobrze rozwiązanie. Tylko tak, mimo, że wyłącze przeglądarkę - nadal jestem zalogowany.


Jak Ci to działało to ja jestem na prawdę pod wrażeniem, i się dziwie że PHP taki kod w ogóle wykonał.

Przykład szybkiego logowania, pisany na szybko, więc mogą być błędy, no i brakujemy modeli, zapytania są w kontrolerze. I nie sprawdzałem czy ten kod działa. Jak nie działa to rozkmiń jak go uruchomić.

  1. <?php
  2. class Users extends CI_Controller {
  3.  
  4. public function index()
  5. {
  6. $data['error'] = Null;
  7. $this->load->library('form_validation');
  8.  
  9. $this->form_validation->set_rules('username', 'Username', 'required');
  10. $this->form_validation->set_rules('password', 'Password', 'required');
  11.  
  12.  
  13. if ($this->form_validation->run() == TRUE)
  14. {
  15. $this->load->helper('security'); // do_hash() helper
  16.  
  17. $this->db->select('user_id, userame, password, name');
  18. $this->db->where('username', $this->input->post('username'));
  19. $this->db->where('password', do_hash($this->input->post('password')));
  20. $user = $this->db->get('users')->result_array();
  21.  
  22. if(count($user) == '1')
  23. {
  24. $this->session->set_userdata('user_login', TRUE);
  25.  
  26. unset($user['0']['password']); // nie przechowujmy hasła w sesji
  27.  
  28. $this->session->set_userdata('user', $user);
  29. $this->db->where('user_id', $user['0']['user_id']);
  30. $this->db->update('users', Array('adres_ip', $this->input->ip_address()));
  31. // nie powninem pisac zapytan w controlerze, tylko w modelu, ale pisze to na szybko.
  32. reidrect('users/profile', 'refresh');
  33. }
  34. else
  35. {
  36. $data['error'] = 'Podales zly login lub haslo';
  37. }
  38. }
  39.  
  40. $this->load->view('tutajwidok logowania', $data);
  41.  
  42. }
  43.  
  44. public function profil()
  45. {
  46. // Sprawdzanie czy jest zalogowany to:
  47. if($this->session->userdata('user_login'))
  48. {
  49. $data['user'] = $this->session->userdata('user');
  50. $this->load->view('users/konto itp');
  51. }
  52. else
  53. {
  54. // nie zalogowany to wypad
  55. redirect('users', 'refresh');
  56. }
  57. }
  58.  
  59. public function logout()
  60. {
  61. $this->session->sess_destroy();
  62. redirect('/users', 'refresh');
  63. }
  64. }
  65.  


Jak to Ci nie pomoże to proponuje powrót do podstaw PHP i przeczytać kilka razy a potem brać się za framework.

Logowanie na sesji zawsze musi się kiedyś skończyć, w zależności od czasu jaki masz ustawiony w konfiguracji, ale zazwyczaj po restarcie przeglądarki sesja już zanika. Więc jedyne przetrzymanie tego to wrzucenie dopiero ciasteczka do klienta, i potem przy ponownym wejściu na podstawie tego ciasteczka dopiero zalogować użytkownika ponownie tworząc nową sesję.


Brakuje konstruktora w controlerze (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie
- adbacz   [CodeIgniter]Pytanie o sesje i problem z cookies.   11.05.2011, 04:37:16
- - phpion   Dane sesji trzymane są na serwerze, a identyfikato...   11.05.2011, 10:54:14
- - adbacz   Dzięki za wyjaśnienie. ------- Żeby nie pisać nowe...   11.05.2011, 12:08:35
- - qrooel   W CI ciasteczka są popsute, że tak powiem, rób naj...   11.05.2011, 22:31:04
- - adbacz   Dzieki qrooel za wyjaśnienie. Teraz przynajmniej w...   12.05.2011, 07:56:02
- - IceManSpy   Wystarczy że ustawisz żywotność ciasteczka na dłuż...   12.05.2011, 08:29:53
- - adbacz   No dobrze, ciastka może i dam rade zwiększyć żywot...   12.05.2011, 11:41:48
- - szok   Logowanie na ciastkach to się robiło z 10 lta temu...   12.05.2011, 11:52:53
- - adbacz   No dobrze, to na czym oprzeć logowanie jak nie na ...   12.05.2011, 12:37:31
- - szok   Zrób to tak Po poprawnym zalogowaniu zapisujesz w...   12.05.2011, 14:34:56
- - adbacz   Z tym co napisałeś, żeby w sesji zapisać czy użytk...   12.05.2011, 15:10:00
|- - szok   OK przyj żyjmy się twojemu programowi: Cytat(adba...   12.05.2011, 19:31:58
- - adbacz   *Tak ogólnie rzecz biorąc, to tam nawet nie napisa...   12.05.2011, 20:00:14
- - szok   Tu chodzi o to abyś zrozumiał jak to działa. Mój...   13.05.2011, 07:32:09
- - adbacz   Dziękuje za wyjaśnienie. Wiem na czym stoje. Jesz...   13.05.2011, 08:25:53
- - szok   Niema idealnych zabezpieczeń. PHP ma to do siebie...   13.05.2011, 09:15:59
- - adbacz   Ok, wziąłem to co napisałeś, zmodyfikowałem pod sw...   13.05.2011, 10:11:06
- - szok   No ok, tylko mała rada: [PHP] pobierz, plaintext h...   13.05.2011, 11:01:55
- - adbacz   Jeszcze małe pytanie bo mam wątpliwości co do bezp...   14.05.2011, 08:45:33
- - szok   Ale przecież UserID zapisywany jest w sesji, nie w...   14.05.2011, 19:44:28
- - adbacz   Dzięki, nie mam więcej pytań   15.05.2011, 22:06:05


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.10.2025 - 04:37