» »

oop+php+sessions

oop+php+sessions

cahahopie ::

Torej rad bi na OOP način nardil logiranje na pejđ in s tem tudi security kdo ima dostop do določene strani in kdo ne.

To logiranje na pejđ sem imel že poprej zastvaljeno, toda se bojim morebitnih "vpadov" zaradi lukenj v kodi (tisto v zvezi z ...neki.php?userid=hehe.... Zato mi je xbite v enem od starejših tem predlagal, da bi zato uporabil objekte. Sicer je tudi možnost, da uporabim neko dolgo ime za spremenjlivko, toda tisto se mi zdi preveč lame..

In sedaj jaz razmišljam na papirju in v glavi in v UltraEditu, objekt, ki bi preveril vnešeno geslo in password in ter dobil iz baze status tega userja. Ta status odloča kaj bo kateremu userju dostopno in vidno (recimo če je status 1 izpiši to, če ni pa to..). V oop sem še malo nov. Sicer pa sem opazil, da je to res ena kul stvarca... Zanima me torej če je kdo na netu zasledil kakšen članek v zvezi s tem? Z securtiyem in oop.
Neki sem isku po PHPBuiderju, DevShedu, Webmasterbaseu in po Manualu.. toda kaj točnega v zvezi s tem ni.
Težava je bila namreč v tem, ker ne vem in se ne znam predstavljat kam na potem vtaknem session_register("uid"? Sem mislu, da bom kr pod return session_register... sam iz tega ni blo muzke (headers allready send..).:D
  • premaknil: Primoz ()

darh ::

cahahopie: tud o "bolezni" headers allready send sem govoru in kaj nardit da se pozdravi... poglej.. naprimer jest lahko headerje (npr cookije) pošiljam tudi na koncu strani... sploh ni pene.. trik je pa v tem, da vklopiš Output Buffer funkcije... (v nanualu si poglej poglavje Output Control Functions
).

začneš s temle, čisto na začetku skripte:


ob_start();
ob_implicit_flush(0);


in kočaš takole


ob_end_flush();



Kaj to pomeni.. med prvim in drugim delom se noben output ( s tem mislum vsak echo, print in ostale zadeve, !!razen!! headerjev seveda) ne pošlje browserju, ampak se shranjujejo v buffer, ki ga natko z ob_end_flush() pošlješ browserju...

kar se tiče Object Oriented Programiranja... imaš pa na PHPBuilder kar nekaj člankov...
Excuses are useless! Results are priceless!

Zgodovina sprememb…

  • spremenil: darh ()

cahahopie ::

Thanks bom prežveču vse tole...

cahahopie ::

No.. nism šel delat nove teme in sem kr tole izbrsko iz med starih.
Jaz bi neki vpraša glede teh objektcev (vedno raje vprašam koga bolj pametnega kot pa da sam kaj čudnega eksperimentiram). Te serialize funk. lahko shrani neko vrednost na računalnik, torej to pomeni, da lahko potem ta podatek uporabljaš kot session_register? In še nekaj ... kaj v bistvu so konstruktorji?
class A
{
var $nekiVar;
function A($nekiDrugiVar) {
$this->nekiVar = $nekiDrugiVar;
}
function izpisA() {
return $this->nekiVar;
}
}
ta prva funkcija je v bistvu konstruktor? In kakšna je njena prednost pred takšnim klasom:
class A
{
var $nekiVar;
function setA($nekiDrugiVar) {
$this->nekiVar = $nekiDrugiVar
}
function izpisA() {
return $this->nekiVar;
}
}
Je razlika mogoč v tem, da v prvem primeru lahko napišeš samo...
$neki = new A($podatek);
$neki2 = $neki->izpisA();
in da morš v drugega...
$neki = new A;
$neki->setA($podatek);
$neki2 = $neki->izpisA();
Ker v Manuali nisem zasledil pointa o uporabi tega.:D
Pa še nekaj....
A lahko v objektu uporabljaš funkcije, ki so izven njega in tudi niso del katerega drugega objekta? (rad bi includo ene par funkcij in jih uporabu znotraj teh v classu).

Zgodovina sprememb…

  • spremenilo: cahahopie ()

darh ::

Konstruktor je funkcija v razredu k ima enako ime kot razred sam. Izvrši se pa takoj ko kreiramo razred.

Isto kot pri normalnih funkcijal lahko tudi iz nekega razreda kličeš, includaš requiraš bilo kaj....
Excuses are useless! Results are priceless!

cahahopie ::

A lahko uporabm session_register() znotraj razreda (no sja vem, da lahko uporabim vse funkcje kot si poprej omenil), hočem namrečt rečt, če je efektivno?
In če je to efektivno me zanima tudi to, če npr. jaz registriram status člana v classu in če nato ga pri neki določeni funkciji, ki je v tem classu vnešem kot potreben parameter iz računalnika (vemo, da je status nekje shranjen), ta funkcija nato ta podatek (torej status) obdela in prever, če je dovolj visok in nato vrne nek text (npr. če je status =>3 ...lahko vrne form za pošiljanje novic drugače pa vrne "Nimate dovoljenja!".)

Hudika... vso stvar sem imel že prej dodobra naret.. zdaj morm pa kot kaka kura na gnoju premetat celo kodo zarad ojbektov (tisto kar sem zgoraj v prvem postu napisal je bil vzrok .. admin=hacked... pa tudi če dam dolga imena spremenjlivkam, ko bo koda potem morala biti skrita drugim... torej ni možnosti, da nardim kako ful kul zadevco in jo nato dam na hotscripts..... :D čeprav je to zazdaj malo verjetno, a človek mora razmišljat na prihodnost).

Zgodovina sprememb…

  • spremenilo: cahahopie ()

darh ::

ma kaj komliciraš.. ve kar si prej lahko delou lahko delaš tudi z objekti, le rokovanje s podatki in funkcijami je malo drugačno.... vse ampak res vse ti piše v manualu in na phpbuilder.com
Excuses are useless! Results are priceless!

cahahopie ::

Ehh.... tist kar sem ustvaru mi je javljal da so headerji že poslani.... torej sem si narobe zastavo ....

Jaz bi rabu en fajn tutotrial o oop v php in logiranju.
Glej poprej sem imel jaz tako narejen, da je v glavi pisal session_start na začetku kode. Nato pa je če je bil (isset) username in password in če je bil takšen in takšen status za določenega člana je izpisal npr. pozdrav "Ti si član!" al pa "Ti si administrator!". Če pa ni blo nič od tega pa je ven vrglu form v katerega si vpisal username in password, ki sta se na drugi strani session_registrirala in nato preverl če je član s temi podatki v bazi in registriru status, če pa ga ni pa javu da je prijava narobe. Nato pa na takšni strani, ki je bila zavarovana (recimo oddajanje novic, postov, threadov, komentarjev) pa sem če je username in če je password in če je tak pa tak status izpiš form za pošiljanje novic, če pa ne pa jav napako.

Sedaj pa bi jaz to mineštro spravu v en objekt.
Torej morm enako v glavi napisat session_start(); In kva pa potem? Edn je enkrat napisu da s preverjanjem $PHPSESSID neki...
v bistvu tole...

session_start();
if (!$PHPSESSID)
{
session_register('prvi');
$prvi = new PRVI;
}
else if (!$prvi)
{
session_register('prvi');
$prvi = new PRVI;
}

...toda nikakor ne znam to spravt za moje potrebe... pa tud oblikovanje objekta mi ne gre prevč od roke. Če bi mi kdo hotu pomagat, ker tole je kar trd oreh. Vsaj zame...
Pa ne me spet... klet..:D

cahahopie ::

Ma no sej v bistvu... ni treba več... sem neki zgrunto:
In to je to:
if($subOdjava) { //če je kliknu na gumb za Odjavit
session_destroy();
$form = "..form za prijavo na stran..."
}

elseif($uid AND $pwd) {
session_register("uid");
session_register("pwd");
$neki = new Prijava($uid,$pwd);
$form = "vi ste $neki->Dovoljenje();" in gumb za odjavit.
}
else {
$form = "..form za prijavo na stran...";
}

v classu pa se vse skup previ in se še registrira status... tak da na koncu ni več tise admin=hacked fore..ž
Juhu! Kako bi se pa ti xbite tega lotu?

cahahopie ::

JAO!!! Pomagajte! Če stvari ne premislim do zadnjega kančka natančno... mi se potem zalomi.
Problem je takšen:
Pri mojem forumu (alfa verzija:D ) je zravn vsakega naslova threada (na thread pejđu) še za admine zravn mičken form za zaklenitev/brisanje/premik threada... toda tukaj se pa zakomplicira... poprej v ne administrativnem delu strani je bilo dovolj če sem samo z pogojnim stavkom napisal da mora bit (isset) $uid in $pwd ter noden ne sme bit prazn (!=""). Če kak porednež napiše recimo pejđ.php?uid=neki&pwd=neki2 ... javi, da se je narobe prijavo... kar je dobr. Toda... sedaj se pojav sranje zarad statusa..torej še enga podatka... EHHH.... pozab... že težim....

V bistvu me mau zanima kak se te stvari lotijo poznavalci? Recimo ti xbite. Tell me you secret!

darh ::

maš spet samogovore a ?


hm... kako se jest tega lotim... ehm... tako.. da dela pol ane 8-)


evo.. tukej je en majhen delček moje authorization skripte... majhen pa zato, ker pod nobenim pogojem ne mislm svoje kode zastonj talat... mogoče če dobim za ki$to pira >:D


class auth
{
var $userID = null;
var $username = null;
var $sessionID = null;
var $error = null;

function auth()
{
/*
* bool auth()
*
* auth class constructor
*
*/

global $REQUEST_METHOD, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_COOKIE_VARS;

if ( $REQUEST_METHOD == 'GET' && $HTTP_GET_VARS['logout'] )
{
if ( $this->logout() )
{
if ( defined('LOGIN_GOTO_AFTER_LOGOUT') )
header( 'Location: '.LOGIN_GOTO_AFTER_LOGOUT );

return true;
}
}
else
{
if ( $REQUEST_METHOD == 'POST' && $HTTP_POST_VARS['formID'] == 'login' )
{
if ( $this->verify_form_login() )
{
if ( defined('LOGIN_GOTO_AFTER_LOGIN') )
header( 'Location: '.LOGIN_GOTO_AFTER_LOGIN );

return true;
}
}
elseif ( $HTTP_COOKIE_VARS['sessionID'] )
return $this->verify_cookie_login();
}
}
}




zdj pa še obrazložitev...

tole je en majhen class, ki ga pokličeš tako kot vsakega drugega, torej:
$auth = new auth();
kaj se zgodi ?
najprej se vse vrednosti nastavijo na null, da nebi prišlo do kakšne pomote ;) potem pa zbudimo funkcijo auth(), ki je ob enem tudi konstrutor razreda, to pomeni da se zažene ko zbudimo razred.

z global, pogledam predefinirane spremenjivke, kot so request_method, http_post_vars, http_get_vars in http_cookie_vars.

Zdej pa glavni hec...najprej pogledam če se uporabnik hoče odlogirat... to lahko doseže z urljem stran.php?logoff=whatsoever. Če je temu tako, potem pokličem funkcijo tega razreda, ki se kliče logout() (d0h)... za tem maš še nekaj manjših bombončkov s katerimi redirectaš userja ne neko drugo stran po vspešnem logofu ipd...

Torej.. če se ni odlogiral, se verjetno hoče logirat oziroma so podatki o prijavi že shranjeni pri njemu...

tooooorej:
1. če je request method enak "POST", kar pomeni da so podatki na stran bli poslani s forme z metodo POST in če ima forma vrednost formID enako "login", potem uporabnika prijavimo... s tem mislim sledeče: preverjanje vnešenih podatkov, generiranje sessionID ključa če ga še ni, nastavljanje cookijev in shranjevanje podatkov o prijavi. Tukaj lahko pride na vrsto še zapis napačne prijave in preprečevanje prijave uporabniku za določen čas če je število nepravilnih prijav preveliko ipd ipd... ampak pustimo to za drugič... če funkcija izvede vse lepo in prav, če so podatki pravilni in cookiji poslani, se nastavijo vrednosti kot so $userID, $sessionID, $username... Torej vrednosti ki jih potrebuješ v nadalnjem izvajanju skripte in do njih dostopaš takole: $auth->userID ali $auth->username...

2. če ni podatkov o prijavi skozi obrazec, obstajajo pa cookiji. Cookie pri meni sestavlja 255 znakov dolg kluč - sessionID, od tega je zadnjih nekaj znakov namenjenih datumu prijave. Torej je ta ključ skoraj nemogoče ugotoviti.. mogoče kak brute force checking ipd (security ni še popoln, ampak delam na tem). Pokličemo funkcijo verify_cookie_login(), ki preveri verodostojnost podatkov in nastavi vrednosti opisane že v prvi točki.

tole bo tud vse... poglej cahahopie... mislm da bi tudi dete tole pravlico razumelo, ker sm se res potrudu in razložu vse... mislm da bi mi lahko dal edn nobelovo za takole lepo razlaganje...torej... bolj da kapiraš... >:D
Excuses are useless! Results are priceless!

Zgodovina sprememb…

  • spremenil: darh ()

cahahopie ::

Hvala, hvala!
Tole je zame in za vse moje zanamce zlo koristno.
Zdaj pa morm še vse fajn preštudirat....:D

cahahopie ::

Žal... mi ful brejka v glavi....:D
Povej mi mau zadevc še...
Glej v ti podatki so morali torej bi od nekod poslani, a ne?
Torej tam rabim en pogojni stavek (if) ki bo enkrat izpisal formo z post metodo in enkrat z get metodo. Ker sam raje ne bom ekspirimentiral (bo računalnik naredu harikiri) mi ti mau pomagi s tem.

Potem me še zanima kaj si mislil ravno s tem...
>>se nastavijo vrednosti kot so $userID, $sessionID, $username...
Kam se nastavijo? Reku si da so cookiji poslani.. zato, zakaj to?
in tole še razlož:
>>Torej te vrednosti, ki jih potrebuješ v nadaljnem izvajanju skripte in do njih dostopaš takole: $auth->userID ali $auth->username...

To je vse kar me zanima. Prosim te lepo, daj še nato odgovor, ker pač nisem tok pameten (mam bolj razvito levo polovico možganov). In res sem cel dan prebedel ob tej tvoji kodi... in tuhtal, gruntal, premetval, ehh... ni za govorit. Res te prosm...

darh ::

ehm.. bom v easy uzel vse kupej in te enlrat za spremembo ne bom nahrulil ;)
anyway...

vidm da mormo najprej osnove predelat....
večina zahtevkov po straneh (REQUEST METHOD) so tipa GET, torej, če ti vtipkaš nek URL, pol si dal GET zahtevek za neko stran. Če napišeš na koncu filenejma v URLju vprašaj (?) in nato tekst v stilu: ime=vrednost&ime2=vrednost2, je to še kar zahtevek tipa GET.

Zdej pa da obdelamo še form - obrazce... iz obrazcov lahko ti pošlješ podatke na neko stran s tisto metodo kot hočeš... torej GET ali POST, nastaviš pa to v atributu HTML TAGa <FORM>.. in, če nastaviš method="get", bo nov URL izgledal takole:


// FORM:
<FORM action="ime_fajla.php" method="get">
&ltinput type="text" name="nekej" value="nekej2">
&ltFORM>

// REZULTAT
ime_falja.php?nekej=nekej2


bo šlo ?

kakor hitro pa ti nastaviš method=post", potem je zahtevek strani enak tipu POST (doooh...), in so podatki poslani, tako da jih uporabnik ne vidi... in so v primeru PHPja shranjeni v predefiniran array vrednosti, ki se imenuje HTTP_POST_VARS (v prejšnjem primeru pa v HTTP_GET_VARS)...

v PHPju lahko preveriš kakšen oblike je zahtevek strani. Le-ta je shranjen v predefinirani spremenjlivki z imenom REQUEST_METHOD.

Glej v ti podatki so morali torej bi od nekod poslani, a ne?
Torej tam rabim en pogojni stavek (if) ki bo enkrat izpisal formo z post metodo in enkrat z get metodo. Ker sam raje ne bom ekspirimentiral (bo računalnik naredu harikiri) mi ti mau pomagi s tem.


no to je bila razlaga tega vprašanja... recimo... torej še zaključek:
Podatki so poslani iz obrazca s prijavo, ta opbraze vsebuje polja uporabniško ime in geslo.

ne rabiš nobega stavka ki bo izpisal form enkat z post metodo, enkrat z get metodo, rabiš le preverit če je uporabnik prijavljen (preveri, če obstaja vrednost $auth->userID ). V primeru da obstaja, izpišeš podatke o prijavljenem uporabniku (in link za odjavo, naprimer takole: &lta href="?logout=true">odjavi se&lt/a>, ki ti ne glede na to na kateri strani si, na koncu samo pripne podatek, da se hoče user odjavit.). Če pa uporabnik ni projavljen pa izpišeš obrazec ki je opisan v zgornjem odtavku...

In ne, ob takem experimentiranju ti računalnik ne bo izvedel harakirija... žal... >:D




Potem me še zanima kaj si mislil ravno s tem...
>>se nastavijo vrednosti kot so $userID, $sessionID, $username...
Kam se nastavijo?

jah.. da se nastavijo vrednosti v spremenjivke $auth->userID, $auth->sessionID. Vrednosti so prebrane iz baze in se nastavijo samo v primeru da je prijava pravilna (pravo geslo)




Reku si da so cookiji poslani.. zato, zakaj to?
Jah.. cookiji se pošlejo... cookie pa upam da veš kaj je ? v cookiju naprimer sessionID, ki ga seveda pokličeš z $HTTP_COOKIE_VAR['sessionID'] je shranjen sessionID... (doh...)


in tole še razlož:
>>Torej te vrednosti, ki jih potrebuješ v nadaljnem izvajanju skripte in do njih dostopaš takole: $auth->userID ali $auth->username...


nimam kaj za razložit.. mislm da se ne da bolj preprosto povedat kot je že napisan...





sedaj pa ostala raja...

a vi res mislte da jest tolk v BADu razlagam zadeve da cahahopie ne razume nič, ampak čisto nič... ne vem no... zdej sta dve možnosti...

da moje razlage problemov tolk sux, da jih noben ne razume, al pa da je razlika med cahahopie-jam in žeblom ki drži sliko edino v tem, da žeblj ni čisto do konca zabit... ma ne vem no.. jest se resno trudim in ne pišem več samo RTFM in obsežno in kvalitetno ( vsaj upam ) razložim zadevo...

pa mislm da bo treba še kak manual napisat inu ga dati kot obvezno domače branje pred nadalnjim bruhanjem v tem delu foruma....


Excuses are useless! Results are priceless!

Zgodovina sprememb…

  • spremenil: darh ()

cahahopie ::

Ne sj ni bistvo v tem... sam glej, teb so nekatere stvari v zvezi s tem tako samoumevne, da ko jaz kaj tako, teb samumevnega, vprašam, misliš da sem res tako zateleban..
Ee.. pa še nekaj, v Manualu tudi marsikatere stvar ne piše ali pa zelo površno tako, da morš še na ducat drugih pejđih iskat odgovore..
V bistvu morš na php štartat, ko imaš popolno znanje o html. Jaz pa priznam, da vse nisem mel pošlihtan (v te forme se nikol prej nism spuščo, ko še nism delu tega kar zdaj delam).
No...hvala...za pomoč...

cahahopie ::

Stari.. a žal... mi je preprosto zmanjkal volje do tuhtanja vsega tega (pa čeprav mi fali le neki segmentov in bi bila sestavljanka popolna), sem raje zadevšno z objekti vrgel v koš. No... ne bit jezn.:D

Point vsega tega je le, da sem si gor pršo, da bi mogu met še eno tabelo v bazi z imenovano session. Poprej sploh nism vedo, da se tok dela. Le ko si mi ti povedu in, ko sem zadevšno opazu v phpBB. Zdaj sem vse skupa tak organiziro, da za vsako stvar, ki potrebuje nek določen status uporabnika pošlje v bazo poizvedbo (torej selekta iz session kjer je username enak $uid, ki je bil shranjen kot session_register, potem kjer je password enak $pwd in status npr. manjši od 3 (pr men so statusi od 1-5, 1..navadn član, 2..Newsman, 3..moderator, 4..admin, 5.. jaz veliki boss, 0..za zaklenjenega userja). Hmm.. no mogoče pretiravam.:D

Jooo... kak je fajn enmu težit.:D :\ :|


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

unset cookie

Oddelek: Izdelava spletišč
221770 (1577) tomitza
»

Podvojeni session ID-ji v PHP?

Oddelek: Izdelava spletišč
61401 (1300) poweroff
»

Tracking v PHPju

Oddelek: Programiranje
61614 (1499) darh

php problem!!!

Oddelek: Programiranje
321609 (1189) darh
»

PHP logiranje na stran

Oddelek: Programiranje
141375 (1101) ahac

Več podobnih tem