Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Logowanie
spenalzo
post
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.


--------------------

Go to the top of the page
+Quote Post
Seth
post
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.
Go to the top of the page
+Quote Post
spenalzo
post
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?


--------------------

Go to the top of the page
+Quote Post
hwao
post
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.
Go to the top of the page
+Quote Post
id4
post
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ść?
Go to the top of the page
+Quote Post
dzieciol4
post
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 smile.gif tzn. ja ze wzgledow bezpieczenstwa bede dodatkowo jeszcze stawial dwa ciacha i sprawdzal je na kazdej stronie, w pierwszym umieszcze zakodowany ID sesji, a w drugim inne potrzebne dane smile.gif tez zakodowane, no nie moge napisac jakie smile.gif
Go to the top of the page
+Quote Post
menic
post
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 smile.gif


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
halfik
post
Post #8





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 17.05.2003
Skąd: Nysa

Ostrzeżenie: (10%)
X----


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 smile.gif
Go to the top of the page
+Quote Post
id4
post
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.
Go to the top of the page
+Quote Post
Seth
post
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.
Go to the top of the page
+Quote Post
halfik
post
Post #11





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 17.05.2003
Skąd: Nysa

Ostrzeżenie: (10%)
X----


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 winksmiley.jpg

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.
Go to the top of the page
+Quote Post
scanner
post
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)


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
seaquest
post
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]
Go to the top of the page
+Quote Post
Bora
post
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]
Go to the top of the page
+Quote Post
Bora
post
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]
Go to the top of the page
+Quote Post
seaquest
post
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 :?: aaevil.gif
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 06:57