![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 2 064 Pomógł: 1 Dołączył: 22.01.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Tak zastanawiam się czy takie coś jest wystarczającym zabezpieczeniem:
login.php - pobieranie danych z bazy, sprawdzanie czy zgadzają sie z formularzem, i jeżeli tak to zapisujemy sesje z nazwą usera i jego ID. konto.php - sprawdzanie czy istnieje rekord z takimi danymi, i jeżeli tak to pozwalamy oglądać stronę oraz sprawdzanie czy sesja nie jest starsza niż 7200 sekund. Wymyśliłem sobie zapisywanie w sesji IP uzytkownika i jeżeli sie zmieni to wywalamy go. Czy takie coś jest wystarczająco bezpieczne? Jakie są Wasze propozycje? Bo to wszystko zależy od bezpieczeństwa sesji. -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Musisz pamietac o tym aby "przefiltrowac" dokladnie to co dostajemy od usera. Nie mozesz tworzyc zapytania bezposrednio odwolujac sie do tablicy. ( SELECT ... WHERE login='$_POST[... ) W takim przypadku mozna zastosowac SQL injection.
Dobrze bylo by pomyslec o wlasnym systemie sesji. Wraz z tworzeniem jej min z IP (zamaksowanego) usera. Co do reszty to w konto.php wystarczylo by sprawdzanie czy istnieje jakas zmienna sesyjna i czy IP z ID sesji (w przypadku tworzenia naszego mechaznimu sesji) zgadza sie z IP usera. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 064 Pomógł: 1 Dołączył: 22.01.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
A jak wygląda sprawa z bezpieczeństwem sesji w php?
Co do własnej obslugi sesji, to myślałeś o tej opartej na handlerach z sesji php tak? -------------------- |
|
|
![]()
Post
#4
|
|
![]() Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
Ja bym proponował jeszcze:
przed wyslaniem do servera danych z przegladarki zahasowanie ich w javie, rg= off bo inaczje wiadomo co sie robi. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 223 Pomógł: 1 Dołączył: -- Skąd: Rogożnik /K-ce/ Ostrzeżenie: (0%) ![]() ![]() |
A co się dzieje Panowie, jak 2 kompy mają takie samo IP wyjściowe (np. sieć osiedlowa)? Jestem ciekawy czy jest to w jakiś sposób rozwiązane jeśli np. wyjściowe IP userów jest identyczne, używają tych samych systemów operacujnych i przeglądarek - w ogóle mają te same kompy - różnią się jedynie sesją przeglądarki (co jest oczywiste). Czy da się to obejść?
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 42 Pomógł: 0 Dołączył: 5.11.2003 Ostrzeżenie: (0%) ![]() ![]() |
ja sie teraz zabralem za wlasny mechanizm sesji ale nie bazujacy na sesjach
![]() ![]() ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 493 Pomógł: 0 Dołączył: 14.06.2003 Skąd: Tomaszów Lubelski/Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Ja nie jestem gorszy i tez sie o takie cus pokusilem jak wlasny system implementacji sesji. Wprawdzie z prawdziwymisesjami nie ma to nic wspolnego, ale chyba trudniej to inaczej okreslic :]
A co do tych samych Ip to równiez jestem ciekaw jak to wyglada ![]() -------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%) ![]() ![]() |
Cytat A co się dzieje Panowie, jak 2 kompy mają takie samo IP wyjściowe (np. sieć osiedlowa)? Jestem ciekawy czy jest to w jakiś sposób rozwiązane jeśli np. wyjściowe IP userów jest identyczne, używają tych samych systemów operacujnych i przeglądarek - w ogóle mają te same kompy - różnią się jedynie sesją przeglądarki (co jest oczywiste). Czy da się to obejść?
hmm... ale co chcesz obejsc, bo ja niekumaty jestem ? moze jak wyjasnisz to tak, abym zalapal, to Ci powiem, bo tak sie sklada ze pisalem stronke bazujaca na sesjach dla studentow z mojej uczelnii, gdzie swego czasu wszystko stalo z tym samym ip wyjsciowym, na tych samym systemach z ta sama przegladarka i generealnie z takim samym hard w srodku - reasumujac ludzie wchodzili na site zazwyczaj z uczelni, daltego jak uda Ci sie wyjasnic mojej zakutaj pale, co chcesz obejsc, to moze uda mi sie jakos pomoc ![]() |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 223 Pomógł: 1 Dołączył: -- Skąd: Rogożnik /K-ce/ Ostrzeżenie: (0%) ![]() ![]() |
Głównie chodzi mi o to, że piszecie o własnym systemie sesjii, które nie mają nic wspólnego z sesjami z przeglądarki. A jeśli nie mają, to muszą się odnosić do czegoś innego, jak np. IP. Jestem po prostu ciekawy, jak wykonać własne "sesje" które są niezależne od elementów wspólnych dla wielu userów. Rozumiem że można do budowy wykorzystać istniejące sesje przeglądarki i cookies, ale w którymś poście przeczytałem, że można to zrobić bez tego. Moje pytanie brzmiało: Jak można obejść problem rozróżniania userów przy niewykorzystywaniu sesji i cookies.
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Głównie chodzi mi o to, że piszecie o własnym systemie sesjii, które nie mają nic wspólnego z sesjami z przeglądarki
Hmm chyba co zle zrozumiales. Chodzi o system sesji wlasny - nie ten, ktory jest zaimplementowany w php. Ale w obu przypadkach przeglaarka sluzy do przekazywania id sesji. Cytat Moje pytanie brzmiało: Jak można obejść problem rozróżniania userów przy niewykorzystywaniu sesji i cookies.
Nie ma 100% sposobu na to. W systemach windows z wykorzystaniem IISa i autoryzacji na poziomie windowsa mozna to zrobic ale to juz inna bajka. Tak czy inaczej mozna pokusic sie o zapisywanie w bazie np hasha z IP usera, ktory wszedl na nasza strone + user-agenta.Ale i tak moze sie zdarzyc, ze np uzytkownik korzysta z proxy dostepnego dla wielu osob a ktorys z userow wykorzystujacych te proxy ma takze takiego samego user-agenta. Dlatego wlasnie sesje sa duzo bardziej pewne niz taki sposb odrozniania uzytkownikow. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%) ![]() ![]() |
Cytat Moje pytanie brzmiało: Jak można obejść problem rozróżniania userów przy niewykorzystywaniu sesji i cookies.
wg, mnie sprawa wyglada tak: generujemy sobie jakis SID - mozemy wymyslec dowolnie bzdurny wzor ![]() nastepnie dane zapisujemy w pliku na serwie - nazwa pliku taka, jak nasz wygenerowany SID. SID'a przekazujemy do kolejnych skryptow metoda GET. nie uzywamy ani standardowych sesji ani cookie. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Klient zaproponował poniższą metodę uwierzytelniania użytkownika:
Cytat Uzytkownik pewnej intranetowej aplikacji aby się zalogowac do systemu, musi oprócz hasła podac ścieżkę do pliku, w którym znajduje się wygerenowany podczas zakładania konta i przekazany na dyskietce za potwierdzeniem unikalny klucz. Coś jak jest chyba w Płatniku i MultiCash'u. Chodzi o to, aby utrudnić przejęcie loginu i zarazem utrudnienie jego odgadnięcia- jeśli przyygotuję np. 1024bajtowy klucz, który będzie identyfikatorem użytkownika... Co o tym, myślicie? Ja oczywiscie zaproponowałem klientowi takie funkcjionalności jak:Cytat - logowwanie adresu IP, z którego próbowano się zalogować dla każdego loginu, wraz z datą i godziną próby
- zliczanie błędnych prób logowań i blokada konta z informacją do administratora po przekroczeniu wartości progowej - dla klientów posiadającyych stałe IP możliwość logowania tylko z podanych IP - wymagana zmiana hasła co okrełśony przedział czasu - zabezpieczenie przed robotami wymuszającymi metody słownikowe logowania: losowo generowany obrazek zawierający jakiś tekst (a'la sms.idea.pl lub era.omnix) -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Przyjaciele php.pl Postów: 790 Pomógł: 7 Dołączył: 6.02.2003 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
a to jest mój kod sesji ;-)
w bazie: [sql:1:1af65327e7] CREATE TABLE `session` ( `session_id` varchar(50) NOT NULL default '', `endtime` int(11) NOT NULL default '0', `vars` longtext, PRIMARY KEY (`session_id`) ) TYPE=MyISAM;[/sql:1:1af65327e7] [php:1:1af65327e7]<?php class Session { function Session() { global $db; $db->Execute("DELETE FROM `session` WHERE `endtime`<'".time()."'"); $this->sid; } function Start() { global $db; if(!isset($_COOKIE['CMS'])) { $sid = md5(getenv("REMOTE_ADDR").time()); $this->sid = $sid; $time = time() + 3600; $sql = "INSERT INTO `session` VALUES('{$this->sid}','{$time}',NULL,NULL)"; $db->Execute($sql); setcookie("CMS",$this->sid,time()+3600); } else { $this->$sid = $_COOKIE['CMS']; } } function Destroy() { global $db, $_COOKIE; $sid = $_COOKIE['CMS']; setcookie("CMS",1,time()-3600); $db->Execute("DELETE FROM `session` WHERE `session_id`='{$sid}'"); } function SaveVar($varname,$varvalue) { global $db; $result = $db->Execute("SELECT `vars` FROM `session` WHERE `session_id`='{$this->sid}'"); while(!$result->EOF) { $vars = unserialize($result->fields['vars']); } $vars[$varname] = $varvalue; $save = serialize($vars); $db->Execute("UPDATE `session` SET `vars`='{$save}' WHERE `session_id`='{$this->sid}'"); } function GetVar($varname) { global $db; $result = $db->Execute("SELECT `vars` FROM `session` WHERE `session_id`='{$this->sid}'"); while(!$result->EOF) { $vars = unserialize($result->fields['vars']); } return $vars[$varname]; } } ?>[/php:1:1af65327e7] Nie ma mechanizmu usuwania zmiennych, ale stwierdziłem, że jest on niepotrzebny. Kod prosty, uniwersalny (oparty o AdoDB). Inicjalizacja. [php:1:1af65327e7]<?php include("./session.class.php"); $Session = new Session; $Session->Start(); ?>[/php:1:1af65327e7] |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Kiesyś pisałem własną klase obsługująca sesje wykorzystującą klucz.
http://php.pl/viewtopic.php?t=8234&start=15 Po kazdym klknięciu jest generowany nowy klucz który jest przekazywany wraz z numerem sesji w session_id(). Więc raz kliknięty już nie ozwala na ponowne wykorzystanie i przejęcie sesji. Może teraz ktoś to zauważy. Co o tym sądzicie?? [php:1:05ec639f13]<?php <?php class session { var $sesid; var $klucz; var $new_klucz; function read( $id ) { $key=$this->decode($id); if($key==false){ //echo"newkey"; $id=$this->new_sid(); $this->sesid=$id; $new_id=$this->code($id,$this->gen_klucz()); session_id($new_id); $key=$this->decode(session_id()); }else{ $this->sesid=$key['0']; } $this->klucz=$key['1']; $this->new_klucz=$this->gen_klucz(); $new_id=$this->code($this->sesid,$this->new_klucz); session_id($new_id); $query="SELECT * FROM " . $this->db['ss_table'] . " WHERE " . $this->db['id_field'] . " = '" . $this->sesid . "' AND " . $this->db['ex_field'] . " > '" . time() . "' AND ".$this->db['token_table']."='".$this->klucz."'"; $query = mysql_query($query); if ( mysql_num_rows( $query ) > 0 ) { $info = mysql_fetch_assoc( $query ); return( $info['DATA'] ); } else { $query="SELECT * FROM " . $this->db['ss_table'] . " WHERE " . $this->db['id_field'] . " = '" . $this->sesid . "'"; $query = mysql_query($query); if ( mysql_num_rows( $query ) > 0 ) { $id=$this->new_sid(); $key=$this->gen_klucz(); $new_id=$this->code($id,$key); session_id($new_id); $this->sesid=$id; $this->new_klucz=$key; } return( false ); } } function new_sid() { $_sid = substr(md5(uniqid(rand(), true)), 0, 32); return( $_sid ); } function decode($kod) { if (ereg('/^([a-zA-Z0-9]*)$/i', $kod)){ return false; } $odk = base64_decode($kod); $odkodowany=explode("|",$odk); if(count($odkodowany)!=2){ return false; } return $odkodowany; } function code($sesid,$klucz) { $key[0]=$sesid; $key[1]=$klucz; if(!isset($key[0]) && !isset($key[1])){ return false; } $zakod=implode("|",$key); $zakodowany=base64_encode($zakod); return $zakodowany; } function gen_klucz() { $klucz = substr(md5(uniqid(rand(), true)), 5, 5); return $klucz; } } ?> ?>[/php:1:05ec639f13] |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
Kiesyś pisałem własną klase obsługująca sesje wykorzystującą klucz.
http://php.pl/viewtopic.php?t=8234&start=15 Po kazdym klknięciu jest generowany nowy klucz który jest przekazywany wraz z numerem sesji w session_id(). Więc raz kliknięty już nie ozwala na ponowne wykorzystanie i przejęcie sesji. Może teraz ktoś to zauważy. Co o tym sądzicie?? [php:1:a121b6cab7] <?php class session { var $sesid; var $klucz; var $new_klucz; function read( $id ) { $key=$this->decode($id); if($key==false){ //echo"newkey"; $id=$this->new_sid(); $this->sesid=$id; $new_id=$this->code($id,$this->gen_klucz()); session_id($new_id); $key=$this->decode(session_id()); }else{ $this->sesid=$key['0']; } $this->klucz=$key['1']; $this->new_klucz=$this->gen_klucz(); $new_id=$this->code($this->sesid,$this->new_klucz); session_id($new_id); $query="SELECT * FROM " . $this->db['ss_table'] . " WHERE " . $this->db['id_field'] . " = '" . $this->sesid . "' AND " . $this->db['ex_field'] . " > '" . time() . "' AND ".$this->db['token_table']."='".$this->klucz."'"; $query = mysql_query($query); if ( mysql_num_rows( $query ) > 0 ) { $info = mysql_fetch_assoc( $query ); return( $info['DATA'] ); } else { $query="SELECT * FROM " . $this->db['ss_table'] . " WHERE " . $this->db['id_field'] . " = '" . $this->sesid . "'"; $query = mysql_query($query); if ( mysql_num_rows( $query ) > 0 ) { $id=$this->new_sid(); $key=$this->gen_klucz(); $new_id=$this->code($id,$key); session_id($new_id); $this->sesid=$id; $this->new_klucz=$key; } return( false ); } } function new_sid() { $_sid = substr(md5(uniqid(rand(), true)), 0, 32); return( $_sid ); } function decode($kod) { if (ereg('/^([a-zA-Z0-9]*)$/i', $kod)){ return false; } $odk = base64_decode($kod); $odkodowany=explode("|",$odk); if(count($odkodowany)!=2){ return false; } return $odkodowany; } function code($sesid,$klucz) { $key[0]=$sesid; $key[1]=$klucz; if(!isset($key[0]) && !isset($key[1])){ return false; } $zakod=implode("|",$key); $zakodowany=base64_encode($zakod); return $zakodowany; } function gen_klucz() { $klucz = substr(md5(uniqid(rand(), true)), 5, 5); return $klucz; } } ?> [/php:1:a121b6cab7] |
|
|
![]()
Post
#16
|
|
![]() Grupa: Przyjaciele php.pl Postów: 790 Pomógł: 7 Dołączył: 6.02.2003 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
ok, ale gdzie tu mozzna pobrac zmienna z sesji :?:
![]() |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 06:57 |