Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logowanie
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
spenalzo
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.
Seth
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.
spenalzo
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?
hwao
Ja bym proponował jeszcze:
przed wyslaniem do servera danych z przegladarki zahasowanie ich w javie,
rg= off bo inaczje wiadomo co sie robi.
id4
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ść?
dzieciol4
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
menic
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
halfik
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
id4
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.
Seth
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.
halfik
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.
scanner
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)
seaquest
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]
Bora
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]
Bora
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]
seaquest
ok, ale gdzie tu mozzna pobrac zmienna z sesji :?: aaevil.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.