Autor Zpráva
Keeehi
Profil
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";
Ten includovaný soubor má neomezené možnosti v přístupu k proměnným. Tomu bych chtěl zabránit. Chtěl bych ho vkládat do jakéhosi pískoviště a povolit mu přístup jen k nějakým proměnným. Dokážu sice napsat funkční kód, avšak není vůbec hezký.

//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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0