Autor | Zpráva | ||
---|---|---|---|
Keeehi Profil |
#1 · Zasláno: 19. 10. 2010, 19:42:40
Potřeboval bych poradit nějaký pěkný způsob jak vytvořit jakýsi uzavřený prostor, do kterého by se uzavřel includovaný script. Nejlépe je to uvést na příkladu:
//sandbox.php $x="může se měnit"; $y="nesmí se měnit"; include "inc.php"; var_dump($x); //změna var_dump($y); //změna //inc.php echo "Nějaký script, třeba toto echo"; $x="změna"; $y="změna"; //sandbox.php $x="může se měnit"; $y="nesmí se měnit"; function foo(&$menitelna_promenna){ include "inc.php"; } foo($x); var_dump($x); var_dump($y); //inc.php echo "Nějaký script, třeba toto echo"; $menitelna_promenna.=" přidán text"; $x="změna"; //může se měnit přidán text $y="změna"; //nesmí se měnit" Jde o to, že se budou dynamicky vkládat různé moduly. Kdybych si napsal všechny moduly sám, tak bych si ohlídal, aby ten modul náhodou neměnil nějakou proměnnou řídícího scriptu, jenže pokud je budou vytvářet jiní lidé, nechci se spoléhat na to, že si to ohlídají a kontrolovat (popř. přepisovat) všechny scripty jestli se náhodou mezi sebou nehádají, se mi opravdu nechce. Děkuji za každý nápad. Keeehi |
||
Majkl578 Profil |
#2 · Zasláno: 19. 10. 2010, 19:53:04
Funkce vypadá jako rozumná volba jak zamezit přístupu ke globálním proměnným. Problém ale nastává ve chvíli kdy by includovaný script přistupoval k superglobálním proměnným příp. k objektům (singletony, servicelocatory).
Nebylo by jednodušší spouštět onen script interpreterem odděleně? |
||
Mastodont Profil |
#3 · Zasláno: 19. 10. 2010, 19:53:34
http://php.net/manual/en/runkit.sandbox.php
aby ten modul náhodou neměnil nějakou proměnnou řídícího scriptu Nepoužívej globální proměnné. |
||
Keeehi Profil |
#4 · Zasláno: 19. 10. 2010, 20:18:27 · Upravil/a: Keeehi
Majkl578:
„superglobálním proměnným“ K těm mít přístup může (většinou i musí) „k objektům“ K těm by přístup právě mít neměl. Jediné co tomu modulu chci povolit je přístup k jedné proměnné. Může už v ní něco být, a může ji bez omezení měnit. Dále by měl mít přístup k superglobálním proměnným POST a GET bez možnosti je měnit (to asi není možné zajistit, ale nemělo by být těžké to zkontrolovat). U cookies a sessions by však si problém nastat mohl. Možná bylo řešením napsat třídu obsluhující tyto superglobální proměnné a ten modul by s nimi mohl pracovat jen skrz tuto třídu, která by hlídala, aby si vzájemně nelezli do zelí. Pak by stačilo soubor překontrolovat regulárním výrazem. Mastodont: To vypadá zajímavě. Nevíš, jaká je u toho všeobecná dostupnost u webhostingů? Jestli je to často podporované, nebo spíše jen ve vyjímečných případech? „Nepoužívej globální proměnné.“ Myslíš tím $GLOBALS? Kdyby jste měl ještě někdo nějaký nápad tak hned sem s ním. To řešení s includováním do funkce je takové zvláštní a nevěřím moc v podporu runkit_sandbox ze stran hostingu. Napadlo mě, zda by se nedaly nějak použít Jmenné prostory. Ještě jsem s nimi nepracoval, takže nevím, zda by se s nimi tento problém dal vyřešit. |
||
Keeehi Profil |
#5 · Zasláno: 19. 10. 2010, 22:08:59
Další nápad:
V includovaném souboru by mohla být jedna třída, která by byla načtena a následně by byl automaticky vytvořena její instance. Konstruktoru by byla předaná ukazatel na proměnnou, kterou by mohl měnit. Příklad: sandbox.php $a="ke změně"; include "inc.php"; $obj = new trida($a); //toto by bylo potom nějak automaticky tvořeno. echo $a; //inc.php class trida { private $ukazatel; function __construct(&$ukazatel) { $this->ukazatel=&$ukazatel; $this->zmen(); } function zmen() { $this->ukazatel="xyz"; } } S tím, že by bylo zakázáno používat superglobální proměnné, ale musela by se k tomu používat mnou vytvořená třída. S objekty nedělám moc dlouho, takže mi tam možná něco uniklo. Mohli byste se prosím k této konstrukci vyjádřit? Děkuji. |
||
Časová prodleva: 14 let
|
0