Starší komentáře ke článku: PHP pro pokročilé - znovu třídy a objekty

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: Jozef Drak

Datum vložení: 16.4.2004 8:47:33

Zhruba som to pochopil... Len prosim ... Napiste pre menej skusenych "programatorov", ako som napriklad ja, ako to prakticky vyuzit... diki..

Avatar

Autor komentáře: Filda

Datum vložení: 16.4.2004 11:16:32

Me by taky docela zajimalo jestli to nekdo pouziva a k cemu?

Avatar

Autor komentáře: Petr Heller

Datum vložení: 16.4.2004 11:42:13

Příklad: na první straně webu nastavíme přihlašovací údaje do databáze a na dalších stranách už spojení s databází probíhá automaticky.

Příklad 2: na mojí prvotině <a href='http://www.pehe.net' target='_blank'>http://www.pehe.net</a> je každá služba instance třídy, kterou si předávám mezi stránkami právě za použití serializace.

Avatar

Autor komentáře: Filda

Datum vložení: 16.4.2004 12:53:43

ad 1 - budiz, ale to preci nemusi bejt serializavanej objekt, na to staci prasivy include

ad 2 - je to nejak vyrazne znat na rychlosti? jak je ta trida velka, kolik ma vlastnosti, metod?

Avatar

Autor komentáře: Petr Heller

Datum vložení: 20.4.2004 9:56:04

1: jestliže do databáze se přihlašuje více lidí (s vlastními přihlašovacími údaji), bude vám jsoinclude (kde u pouze statická data) k ničemu a budete muset tak jako tak session použít.

2:rychlost jsem netestoval, ale protože se přenáší pouze jediný sessid (identifikující session s byte-řetězcem) místo několika (identifikující sessions s jednotlivými přihlašovacími údaji), možná je to dokonce rychlejší.

Avatar

Autor komentáře: Havran

Datum vložení: 16.4.2004 15:35:23

Napadlo ma taketo vyuzitie.

Zakladna konfiguracia aplikacie, vratane spojenia do databazy je ulozena v objekte. Staci sa autorizovat raz, po ulozeni objektu session a automatickom ruseni spojenia pri serializacii a otvarania spojenia pri unserializacii sa pouziju pre spojenie premenne uz ulozene vovnutri objektu.

V pripade pisania vlastnych funkcii je casto nutne predavat si viac premennych ako global (pomocou pola ci funkcie globals). Staci mat potrebne premenne ulozene v objekte a netreba do kazdej funkcie dopisovat globals $premenna; pri kazdej novej premennej ktoru potrebujeme - staci len raz globals $objekt...

Urcite je viac takych praktickych tipov a trikov ktore su uzitocne pri programovani a je dost hlupe ked na ne musi zaciatocnik (aj ked programujem v php uz od 2.0b verzie stale sa tak citim :-)) prichadzat sam. Uz bolo tolko veci vynajdenych a predsa sa stale stane ze niekto vynachadza uz vynajdene. Je to obrovska strata casu a prave Internet by mohol pomoct zabranit podobnym veciam...

Avatar

Autor komentáře: Roman Šitina

Datum vložení: 16.4.2004 15:52:03

hodně zajímavé by bylo napsat si framework pro aplikaci ovládanou událostmi (podobně, jako třeba program v Delphi nebo asp.NET), což by smazalo rozdíl mezi tím, co běží na serveru a co u klienta...

je to pak naprosto jiná filozofie programování aplikace, php by už nebyl skript (ve smyslu vstupní data -> transformace -> výsledek), ale právě tím uchováváním stavu a voláním metod např. při odeslání formuláře, stisku tlačítka atd...

Avatar

Autor komentáře: jonti

Datum vložení: 17.4.2004 21:33:46

pozri si phpMVC
sam som v tom nerobil ale malo by to byt nieco na sposob struts na java

Avatar

Autor komentáře: Havran

Datum vložení: 16.4.2004 10:16:23

Pokial som spravne pochopil hovori sa o PHP5? Co sa prikladov pouzitia tyka je to velmi dobry napad pretoze vsade sa vysvetluje, uvadzaju sa priklady ale samotne realne pouzitie napovie ovela viac...

Avatar

Autor komentáře: Masaj

Datum vložení: 16.4.2004 10:39:19

PHP 5 jeste moc neznam, ale priklady z tohoto clanku jsou bez problemu pouzitelne v PHP 4 viz. manual <a href='http://cz2.php.net/manual/en/language.oop.php' target='_blank'>http://cz2.php.net/manual/en/language.oop.php</a>

Avatar

Autor komentáře: Havran

Datum vložení: 16.4.2004 10:58:16

Aha. Lebo som nikdy do objektoveho programovania velmi neprenikol (iba par vlastnych pokusov) tak mi uniklo ze funkcie sleep a wake su dostupne aj pre starsiu verziu PHP.

Avatar

Autor komentáře: Roman Šitina

Datum vložení: 16.4.2004 10:26:38

"Pokud předáváte byte řetězec v session, data jsou zde v nezašifrované formě, takže je může případný útočník velmi jednoduše odchytit..."

můžete mi prosím objasnit, jakým způsobem se dají odchytit session data na straně klienta??

díky

Avatar

Autor komentáře: PHP guru

Datum vložení: 16.4.2004 10:34:08

Zadnym - ze serveru se ke klientovi (a zpet) posila pouze SessionID, samotna data (zde konkretne serializovana trida) jsou ulozeny na strane serveru. Autor cte moc sci-fi... :)

Avatar

Autor komentáře: Roman Šitina

Datum vložení: 16.4.2004 10:43:07

vím, jen jsem čekal mlžení ze strany autora :)

Avatar

Autor komentáře: Vilém Málek

Datum vložení: 16.4.2004 12:04:48

Neřekl bych, že autor je zas až takový scifista. Problém nastává tehdy, pokud vaše aplikace běží jinde než na vašem vlastním serveru. Pak si nemůžete být jist, že jsou data, uložená v session, také správným způsobem zabezpečena. IMHO šlo narážku na tuto situaci ;-)

Avatar

Autor komentáře: dgx

Datum vložení: 16.4.2004 14:29:01

Ba co víc - I na vlastním serveru je třeba ostražitosti :-)

Ale vážně, kradení identity bylo na Intervalu věnováno už několik velmi poučných a zároveň zajímavých (to není běžná kombinace) článku. Zkuste hledat přes google, mám pocit, že to to psal pan Pavel Růžička.

Tím, že ukradnete sessionID, jste jen drobný krůček od toho ukrást celý obsah session.

Avatar

Autor komentáře: Roman Šitina

Datum vložení: 16.4.2004 15:48:01

pokud aplikace nemá nějaký bug, přes který by se dalo dostat k jakékoliv session proměnné, tak se nic neděje - s ukradeným session id se dostanete jen k datům, ke kterým to programátor umožní - a nedokážu si představit, proč by měl zpřístupňovat objekt a jeho atributy...

HOWGH

Avatar

Autor komentáře: Roman Šitina

Datum vložení: 16.4.2004 15:45:56

a čím si můžete být na cizím serveru jist? cokoliv jakkoliv uložíte, může majitel serveru vyšťourat...
k tomu, jak to bylo myšleno, by se měl vyjádřit sám autor...

Avatar

Autor komentáře: Petr Heller

Datum vložení: 20.4.2004 9:45:50

Dobrý den,
vzhledem k tomu, že můj článek zavinil zajímavou roztržku, rozhodl jsem se reagovat a vyjasnit tak problém, který se týká zabezpečení sessions.

Pomocí protokolu http se přenáší pouze sessid, který identifikuje session na serveru a tudíž klient se samotným obsahem session nepřijde do styku. Pokud ale případný útočník tento řetězec (tedy ten sessid, ne samotný obsah session, jak možná vyznělo z článku) získá, může se k session relativně snadno dostat. Možností jak tohoto docílit je mnoho a já vás odkazuji na článek pana Růžičky "Bezpečnost především – cross-site skripting a session-stealing" (<a href='http://interval.cz/clanek.asp?article=1408)' target='_blank'>http://interval.cz/clanek.asp?article=1408)</a>.

Tento článek ale vůbec nebyl o SSL a bezpečnosti. Jeho hlavním účelem bylo popsat postup serializace a to, alespoň v to pevně doufám, zvládl.

Přeji hezký den

Petr Heller

Avatar

Autor komentáře: Masaj

Datum vložení: 16.4.2004 10:34:08

Docela pekny clanek, i kdyz jsem ho precetl jen zbezne. Mam ovsem dve vyhrady:
1. pripada mi docela zbytecne ukladat do session serializovany objekt, session samotne jsou totiz ulozeny jako serializovana data, takze tam potom probiha dvoji serializace
2. Toto povazuji za vylozenou dezinformaci, jedna se o predposledni odstavec o bezpecnosti. Pokud vim, tak soubory session se ukladaji do urceneho adresare na serveru, takze nechapu jak k jejich bezpecnosti prispeje zabezpecena (SSL) komunikace mezi klientem a serverem???
Jako doporuceni pro zabezpeceni dat v sessions bych tedy spise pouzil vlastni hadndlery pro praci se sessions a v nich pak napr. pouziti mcrypt funkci. BTW docela dobre tema pro dalsi clanek :-)

Avatar

Autor komentáře: Havran

Datum vložení: 16.4.2004 10:56:44

Otazka k 1. Ako inak ulozit object? Myslel som si ze jedina moznost je jeho serializacia. Alebo da sa do session ulozit priamo object bez serializacie?

Avatar

Autor komentáře: Jirka Bráza

Datum vložení: 16.4.2004 11:15:48

Už to tu bylo zmíněno. Veškeré session proměnné jsou v případě potřeby serializovány automaticky, tj. do session je možné vložit přímo objekt či pole, a stejně tak dojde automaticky k deserializaci před použitím.
K serializaci/deserializaci tedy nedochází dvakrát, jak tu někdo psal, neboť samotný objekt není zahrnut do session, ale zbytečně, protože to PHP umí transparentně.
Příklad se soubory je lepší, protože neserializovaný objekt do souboru zapsat nelze, serializace je nezbytná. Obdobně lze serializované objekty například ukládat do databáze.

Avatar

Autor komentáře: dgx

Datum vložení: 16.4.2004 14:38:47

K serializace bohužel skutečně dochází dvakrát. Jednou to automaticky provede PHP, a jednou (zcela zbytečně) programátor. Toto bych vážně považoval za prohřešek vůči rychlosti a efektivitě !

Avatar

Autor komentáře: Jirka Bráza

Datum vložení: 16.4.2004 14:54:00

Ok, dvakrát, ale jen jednou se serializuje objekt, podruhé se serializuje řetězec, což je mnohem rychlejší. Jinak na tom, že je ta jedna serializace zbytečná už jsme se shodli.

Avatar

Autor komentáře: Jirka W

Datum vložení: 23.4.2004 14:35:59

Serializace objetu je dulezita a rozhodne neni pravda, ze je zbytecne objekt serializovat. Obsahuje-li objekt v nektere sve promenne dalsi objekt pak takto vlozeny objekt neni serializovan spravne pri pouhem vlozeni do sessny. Jednoduse receno, nepouzijete-li funkci serialize pak se objekt rekurzivne nezeserializuje.

Avatar

Autor komentáře: Petr Zelenka

Datum vložení: 17.4.2004 14:49:35

Uz od PHP 4 tusim lze veskera pole i objekty ukladat do session aniz by se muselo cokoliv serializovat. Ten proces je automaticky. Proste staci $object=new CObject(); $_SESSION['sesObject']=$object;

Avatar

Autor komentáře: Jirka Bráza

Datum vložení: 16.4.2004 11:17:44

Jen drobná připomínka, kód z příkladů:

<I>$vlastnosti = get_object_vars($this);

foreach ($vlastnosti as $klic => $hodnota) {
$pole[] = $klic;
}

//vrácení pole vlastností třídy
return $pole;
</I>
lze poněkud stručněji zapsat:
<I>
return array_keys(get_object_vars($this));</I>

Avatar

Autor komentáře: Petr Bíža

Datum vložení: 18.4.2004 12:32:05

Jen malou vecicku, kontrukor <U>clsTridam</U> ma tam malej nedostatek.
Vas :
function clsTrida($vl1, $vl2) {
$this->vlastnost1=$vl1;
$this->vlastnost1=$vl2;
}

Spravnej :-)))
function clsTrida($vl1, $vl2) {
$this->vlastnost1=$vl1;
$this->vlastnost2=$vl2;
}

jen maInkej dodatecek -)

Avatar

Autor komentáře: Pavel

Datum vložení: 4.8.2005 19:30:32

Jj, docela sranda.. :-)) Takova chyba, ale ta se muze stat i dobremu programatorovi, stava se to i mne.. a i daleko vetsi banality - nerikam o sobe, ze jsem dobry programator :-)

Avatar

Autor komentáře: Jirka K

Datum vložení: 19.4.2004 23:21:02

Asi bych mohl experimetovat, ale s OOP začínám a bůh ví jak špatně bych si výsledky takového experimentu vysvětlil. Tak se ptám ad:
"V souboru s unserializací se již nevytváří žádná instance, protože unserializovaný objekt je schopen sám poznat svoji třídu. Ta ale ve skriptu definována být musí."
Co se dá předpokládat, že se stane, když si budu ukládat objekty a časem budu potřebovat do třídy dostat další vlastnosti - tedy rozšířím její definici. Mohu předpokládat že unserializace bude stále fungovat a u starých objektů zůstanou nové vlastnosti bez hodnoty?

Avatar

Autor komentáře: Petr Heller

Datum vložení: 20.4.2004 9:50:32

V byte řetězci je (stručně řečeno) informace o názvu vlastnosti a její hodnotě. Jestliže tedy přidáte navíc nějakou vlastnost do třídy, nic se nestane. Hodnoty původních vlastností se po unserializaci nastaví správně, nová vlastnost bude nenastavena. Jestliže ale změníte celý název třídy, unserializace neproběhne.

Avatar

Autor komentáře: BoneFlute

Datum vložení: 11.10.2004 10:55:13

Ma někdo zkušenosti s chybou: <B>__PHP_Incomplete_Class</B> ? V manualu to samozřejmě je, ale anglicky, a jaksi jsem to tak zcela nepochopil. Mam Serializovany objekt, a z nějakého důvodu mi nejde složit zpátky a vrací tuto chybu.
Děkuji za radu.

Avatar

Autor komentáře: Jméno a příjmení

Datum vložení: 11.10.2004 10:58:41

Nespamujte diskuse nesouvisejícími dotazy, použijte naše Interfórum - <a href='http://interval.cz/__redirect/redirect.asp?what=interval_discussion&url=http://interforum.interval.cz' target='_blank'>http://interforum.interval.cz</a> ;-)

Avatar

Autor komentáře: BoneFlute

Datum vložení: 11.10.2004 11:46:49

Tak jsem na to přišel. Už v manuál je psáno, že pro použití unserializovaného objektu je potřeba jeho definice.
Takže, pokud tam ta definice nebude, nahlásí vám to tuto chybu.

S přáním krásného dne.

Zpět na článek | Úvodní stránka Interval.cz