ugrás a tartalomhoz

Admin oldal és normál felület session elválasztása

carstephun · 2005. Szep. 8. (Cs), 11.25
Üdv Mindenkinek,

olyan kérdésem lenne, hogy van egy Backend rész egy weboldalhoz, amihez be kell jelentkezni. Minden böngészőpéldány indításakor elméletileg új session fog indulni, ha php-t használunk egy adott weboldal frontendjében és backendjében is.

Kicsit máshogy, ez azt jelenti, hogy indítok két böngészőt egyikben a frontendet (vagy mást) nézek a másikban a backendet használom. Amennyiben a backend részbe bejelentkeztem, elvégzek néhány műveletet, amit kell és bezárom az ablakot, ugyan van kijelentkezés modul, de nem feltétlen fogja a felhasználó úgy kezelni a böngészőt és a backendet.

Miután bezártam az ablakot, átmegyek a másik böngészőablakra - ahol a frontend vagy bármilyen oldal van - és beírom egy admin oldal elérési útját és violá máris bennt vagyok a backend részben! Ez egy elég rizikós biztonsági rés. A kérdésem ezt hogyan lehet elkerülni?

Üdv
Sanyi
 
1

referer

zsepi · 2005. Szep. 8. (Cs), 11.52
Minden admin jogosultság ellenőrzésnél nézd meg, hogy honnan jött a kedves látogató
$_SERVER["HTTP_REFERER"]
Ha nem admin oldalról, akkor öld meg az aktív session-t, majd küld át a bejelentkező képernyőre.
4

<Nincs cím>

carstephun · 2005. Szep. 8. (Cs), 12.34
Sajna nincs bennt ez a tulajdonság a $_SERVER-ben

Üdv
Sanyi
5

Van, hogy jogosan nincs benne

zsepi · 2005. Szep. 8. (Cs), 13.10
referer vagy akkor nincs, ha le van tiltva ez az opció a böngészőben, vagy pedig ha az címsorba kézzel lett beírva az oldal címe

utóbbit az alábbi kódrészlettel tesztelheted:
<a href="/<?=$_SERVER['PHP_SELF']?>">xyz</a>
<p>Az előző oldal: <?=(
  (isset($_SERVER['HTTP_REFERER'])) 
  ? $_SERVER['HTTP_REFERER'] 
  : 'nem volt'
)?></p>
Az első esetet könnyen tudod kezelni: az admin a használat idejére engedélyezze ezt a funkciót. Kész, ennyi.

A második esetben meg persze, hogy a login oldalra akarod küldeni.
8

<Nincs cím>

carstephun · 2005. Szep. 8. (Cs), 14.30
Szia Zsepi, egy kérdésem van csak, ha két (ugyanolyan) böngészőben indítok egy programot, akkor nem lehet ugyanaz a két sessionid nem?

Namármost a fennti esetet megcsinálva egyszerűen ez történik. A böngésző egyik példányában belépek az admin oldalra, akkor a másik böngészőben már visz oda a belépés oldalra, hanem egyből megmutatja az (adminhoz, backendhez tartozó) oldalt, ráadásul a két böngészőben ugyanaz a session, magyarán mondva a remote host-hoz rendeli a session-t nem pedig a böngészőpéldányokhoz! Vagy rosszul látom a dolgot?

Tehát, ha két böngészőablakot nyitok, akkor csak az egyikben szeretném, ha az admin oldal futna, a másikat automatikusan kitiltaná! Ez hogy lehet megcsinálni?

ÜDv
Sanyi
9

nem böngészőablakhoz kötődik

Hojtsy Gábor · 2005. Szep. 8. (Cs), 14.37
A munkamenet nem böngészőablakhoz kötődik, hanem böngésző termékhez. Tehát ha Firefox segítségével nézed az admint, és Operában a normál felületet, akkor nem osztják meg a munkamenetet, de ha ugyanazt a böngésző példányt (akár külön ablakban, akár külön fülön) használod, akkor a sütiket megosztja egymás között. Gondolj csak arra, hogy a "megnyitás új ablakban", "megnyitás új fülön" funkciókra újra mindig be kellene lépned, ha nem így lenne. Elég ciki lenne.
10

<Nincs cím>

carstephun · 2005. Szep. 8. (Cs), 15.29
Szia Gábor, igen én is erre gondoltam. A kérdésem továbbra is az, hogy ezt le lehetne valahogy tiltani, vagy kikerülni? én arra gondoltam, csak idő hiányában most nem tudok vele foglalkozni,hogy javascripttel a böngészőablak bezárásakor (onunload) átírányítok a kijelentkezés oldalra, ahol megszűnteti a session változókat, amelyekkel ellenőrzöm, hogy belépett e. Lehet ez megoldás?

Üdv
Sanyi
21

onunload

attlad · 2005. Szep. 9. (P), 15.08
JavaScript onunload-ra küldj egy XMLHTTPRequest kérést, amiből tudod, hogy kilépett.

Attila
2

<Nincs cím>

Anonymous · 2005. Szep. 8. (Cs), 12.06
Ez miért biztonsági rés? Feltételezem ugyanaz a személy ül ott akkor is, amikor a másik (frontend) ablakot böngészi, nem?
3

<Nincs cím>

carstephun · 2005. Szep. 8. (Cs), 12.25
Nem feltétlen,lehet,hogy otthagyja a gépet, míg a 'takarító' bütyköl rajta valamit!
6

<Nincs cím>

Anonymous · 2005. Szep. 8. (Cs), 13.24
Akkor az is biztonsági rés, hogy a takarító az admin válla fölött átnézve meglesi a begépelt kódot.
vagy hogy a felhasználók x%-a a monitorra írja a user/pass párost.,

etc, etc...
7

<Nincs cím>

carstephun · 2005. Szep. 8. (Cs), 14.14
Pontosan
11

Megoldási lehetőségek

Hojtsy Gábor · 2005. Szep. 8. (Cs), 15.36
  • A kedves felhasználó elfogadja, hogy belépve marad, végülis nem lépett ki, bár mondjuk most éppen ezt akarjuk megoldani...
  • Rövid idő után kilépteted automatikusan (ezt jól kell megválasztani, mert különben egy szövegszerkesztés vagy valami más admin művelet közben is kiléptetheti).
  • Esetleg az előbbit tényleg rövid időre állítod, és JS-sel visszaszólsz időnkét a szervernek az admin oldal kliens oldaláról, hogy még ott van a user. Ez ciki hatású, ha nincs JS, de ezt admin oldalon meg lehet követelni.

Bár az is lehet, hogy magát az admin oldalt hagyja ott nyitva (meg fog történni úgyis :), az ellen semmi nem véd.
12

A referer miért nem jó?

zsepi · 2005. Szep. 8. (Cs), 16.01
Goba/Sanyi,

A HTTP_REFERER-es megoldás miért nem jó?
13

<Nincs cím>

carstephun · 2005. Szep. 8. (Cs), 17.02
Mert ha csak úgy kézzel begépelsz(pl valaki fel akarja törni) egy admin oldal elrési útját az új böngészőbe, akkor azonnal bejutsz! és itt még referrer nincs a változók között, ezt arra értsd, ha mondjuk about:blank-kal nyitsz meg egy oldalt

Üdv
Sanyi
16

pont az, hogy nem jutsz be

zsepi · 2005. Szep. 9. (P), 09.50
Sanyi,

amit javasoltam az az volt, hogy a normál autentikáció mellett még megvizsgálod a REFERER értékét. Ha ennek az értéke nem egy előző admin oldal, akkor az aktuális sessiont érvényteleníted, és kirakod a login oldalra. Ha nem létezik ez a változó még, akkor biztos, hogy nem lesz az értéke egy előző admin oldal, tehát login szükséges. Azt hittem, ez már az első hozzászólásomból tiszta lesz.

ps: ha írnál témamegjelölést is a hozzászólásaidhoz, az nem lenne rossz!
19

Lásd. korábbi hozzászólások

carstephun · 2005. Szep. 9. (P), 14.30
Szia Zsepi,

"referer vagy akkor nincs, ha le van tiltva ez az opció a böngészőben, vagy pedig ha az címsorba kézzel lett beírva az oldal címe"

Természetesen, ha le van tiltva ez az opció, akkor nincs meg a REFERER érték, ami azt vonná maga után az ilyen fajta ellenőrzéskor, hogy a bejelentekzés oldalra tobbna állandóan!

Üdv
Sanyi

UI: a téma indításánál volt témamegjelölés, az nem elég, vagy tényleg valami másra gondoltál, ritkán kérdezek itt, ezért nevezném magam kicsit tudatlannak
20

böngészőben letiltás - használat idejére engedélyezze

zsepi · 2005. Szep. 9. (P), 14.54
Természetesen, ha le van tiltva ez az opció, akkor nincs meg a REFERER érték, ami azt vonná maga után az ilyen fajta ellenőrzéskor, hogy a bejelentekzés oldalra tobbna állandóan!
Erre mondtam azt, hogy az admin a használat idejére engedélyezze ezt a funkciót. Ennyit el lehet várni tőle szerintem.

A témamegjelölés meg azért hasznos, ha teszem azt valaki a követőben nézi, hogy mi hol tart, pl. http://weblabor.hu/koveto/1708 , akkor elég zavaró az a sok "Nincs cím"
14

nem túl szép megoldás, de...

sotetbarna · 2005. Szep. 8. (Cs), 17.07
azt is megpróbálhatod, hogy a session-nek nevet adsz belépéskor.

get-tel folyton át kell adnod a session nevet (minden link-be, form-ba beírni), de így ugyanabból a böngészőből több felhasználó nevében is be tudsz lépni.
15

magyarán :)

Hojtsy Gábor · 2005. Szep. 8. (Cs), 18.15
Magyarán legyen süti helyett webcímben átadva a munkamenet azonosító, és sütiből ne fogadd el, ha jól értem az ajánlatot :) Ez sokmindent megold, de a vissza gombos admin belépés ellen nem véd. Bár ez nem volt része a problémának, csak a külön ablak, amit bezár, úgyhogy ez is jó ötlet :)
17

vissza gomb

sotetbarna · 2005. Szep. 9. (P), 10.20
a vissza gombra is van egy javaslatom :D

minden formba, linkbe bele kell építeni egy mezőt, ami egy egyedi id-t tartalmaz (minden egyes lapletöltésnél képződik egy id, mondjuk idő (microtime-os) + userid + nagy random szám).

az adatbázisba kell egy tábla, ami alkalmas a fenti id tárolására.

amikor elküldesz egy formot vagy klikkel egy linkre, ellenőrzöd, hogy az az id már valaha küldésre került-e (ránézel a táblára). ha igen, dobsz egy képernyőt, hogy nem kell a refresht/back gombot piszkálni, különben meg elfogadod és feldolgozod a lapot, plusz eltárod az egyedi id-jét a táblába

macerás ez is, de nem megoldhatatlan. ráadásul ha még valahogy eltárolod, hogy milyen adatokat küldött, akkor rendelkezésedre áll egy full log a felhasználói aktivitásról
18

<Nincs cím>

-zsolti- · 2005. Szep. 9. (P), 14.25
Nem lenne egyszerűbb, ha a belépésnél letárolnád a felhasználó státuszát, pl: $_SESSION['is_admin'] = true;
és ezt egyaránt ellenőriznéd a frontend és backend oldalakon? A backend ablak onunload eseményére pedig meghívsz egy scriptet (popup-ban, mint a freemail-nél), ami false-ra állítja a $_SESSION['is_admin']-t, pl:
<body onUNLoad="window.open('closeadmin.php','close','width=200,height=300')">
closeadmin.php:
<?php
session_start();
if($_SESSION['is_admin']) {
$_SESSION['is_admin'] = false;
echo 'Admin kiléptetés megtörtént.';
}
?>