Autor Zpráva
JB17
Profil *
Ahoj chci se zeptat nakolik bezpečný je tento zapis:

if(strpos($_GET["page"],"http")===false){
include $_GET["page"] . ".php5";
}
BetaCam
Profil
JB17

No v get ti neprojde nic co obsahuje "http". Což sice dobrý, ale zároveň ty nesmíš mít soubor který by obsahovat http v názvu.

Navíc pokud už řešíš načítání stránej takovímto způsobem tak předpokládám, že tech stránek nebude tolik takže by mi přišlo vhodnější je definovat a pustit jen ty definované.
CZFilip
Profil *
Myslim, že lepší by bylo použít něco na způsob :

if(file_exists($_GET['page'].".php5"))
{
include $_GET['page'].".php5";
}else{
include "404.php5";
}
BetaCam
Profil
JB17

Navíc čistě teoreticky například pokud toto budeš mít v index.php

<?php

define('A', 'const A');
define('B', 'const B');

if(strpos($_GET["page"],"http")===false){
include $_GET["page"] . ".php";
}
?>


a do adresního řádku zadáš :

index.php?page=index


tak pokud budeš mít zapnuté vypisování chyb ( což na ostrém serveru pochybuji, ale stát se to může ) tak se dozvím jaké konstanty máš nadefinované což nepovažuji za zrovna ideální.

A na druhou stranu i když budeš mít vypisování chyb vyplé tak zákonitě musí přijít FATAL ERROR o vyčerpání paměti, protože to prostě zacyklíš.
BetaCam
Profil
CZFilip
Myslim, že lepší by bylo použít něco na způsob :

Trpí to stejnou vadou jako script původní. Viz můj předcházející příspěvek.
imploder
Profil
Tady je moje řešení z vlákna Přepínání stánek na webu. Myslím, že je jednoduché a bezpečné. Určení adresáře "./" na začátku cesty zajišťuje, že není možné změnou obsahu proměnné jen tak vybírat věci absolutní cestou ani z nadřazeného adresáře.

Pokud je to přesto nějak nebezpečné (dá se to obejít), tak mi o tom prosím řekněte.
CZFilip
Profil *
BetaCam

Máš pravdu.. S timhle kusem kódu jdou ošetřit chyby, které jsi napsal jedině přidánim do podmínky $_GET['page]!='index' a vypnout zobrazování chyb, každopádně bych se ale radši podíval po hezčím a lepším řešení :)
BetaCam
Profil
imploder
Pokud je to přesto nějak nebezpečné (dá se to obejít), tak mi o tom prosím řekněte.

Pokud se bude includovat PHP script tak trpí stejnou závadou jako scripty zde uvedené dříve. Závada viz tento příspěvek.

Navíc v tom jak je ten script myšlen neumožňuje posílání hlavičky 404.
imploder
Profil
BetaCam
Myslím, že vypisování chyb se dá potlačit zavináčem před voláním funkce, i když je v nastavení zapnuté.
BetaCam
Profil
imploder

Myslím, že vypisování chyb se dá potlačit zavináčem před voláním funkce, i když je v nastavení zapnuté.

Ale tady přece nejde vůbec o výpis chyb, ale o to, že zacyklíš script. Když ti na to url pustim program kterej ti tam bude neustále přistupovat myslíš, že z toho bude majitel serveru natčenej? Myslim, že ne.

Navíc co to je za řešení potlačit chybu? Chyby se vetšinou potlačují proto, protože jejich ošetření si chceme zajistit sami a nechceme, aby se nám pletly na výstupu.

Ale mít botu ve scriptu a řešit to tím, že tu chybu potlačím? No kde to žijem? To je asi to samé jako když by se mi podělala hlasitost na autorádiu, že by bylo furt na plné pecky a řešil bych to tak, že si dám špunty do uší. :)
CZFilip
Profil *
Pokud je stránek málo, dalo by se použít :

př. url : http://web.com/index.php?page=home

$pages = Array(
'home' => 'home.php',
'index' => 'home.php', // ochrana proti zacykleni
'about' => 'about.php',
);

if (isset($_GET['page']) && array_key_exists($_GET['page'],$pages)) {
include($pages[$_GET['page']]);
}
else {
include('home.php');
}

myslím, že všechny chyby, které tady uvedl BetaCam jsou zde ochráněny.
BetaCam
Profil
CZFilip

$pages = Array(
'home' => 'home.php',
'index' => 'home.php', // ochrana proti zacykleni
'about' => 'about.php',
);


tam by se dal použít i zkrácenej zápis :

$pages = Array( 'home',
				'about');

if (isset($_GET['page']) AND in_array($_GET['page'],$pages)) {
include($pages[$_GET['page']].'.php');
}else{
include('home.php');
}


a i kdyby se vzal puvodní script tak tam by stačilo do podmínky dát, že $_GET['page'] se nesmí rovnat stringu "index".

Mě na těkhlech scriptech nejvíc vadí, že před samotným includem se většinou už něco posílá na výstup což pak znemužnuje odesílat hlavičky. Sem možná konzervativní, ale prostě když není stránka nalezena tak by se to mělo zobrazit a zároveň by měla být hlavička 404.

CZFilip

Mimochodem ten tvůj polední uvedený příklad má také jednu věc která mi jde proti srsti. A to pokud jako adresu zadám

index.php?page=PanXjeNegramot


Tak se s klidem zobrazí úvodní stránka což myslím není úplně košér.
CZFilip
Profil *
Tak se s klidem zobrazí úvodní stránka což myslím není úplně košér.

Ano, měla by se zobrazit spíš 404ka, ale to už si může upravit on sám :) , nadruhou stranu lepší zobrazit úvodní stránku než "Stránku nelze zobrazit". Další možnost je nechat index.php v rootu a ostatní stránky dávat třeba do složky /pages a kontrolovat existenci jen tam.
imploder
Profil
Ale mít botu ve scriptu a řešit to tím, že tu chybu potlačím? No kde to žijem? To je asi to samé jako když by se mi podělala hlasitost na autorádiu, že by bylo furt na plné pecky a řešil bych to tak, že si dám špunty do uší. :)
Moc teda nechápu co se tady vlastně řeší. Jak nemít tu botu ve skriptu? Nějak mi uniká smysl celé té konstrukce. Když se to zacyklí, tak je to blbě napsané. No nic, radši se to nebudu snažit pochopit :/
Nox
Profil
imploder
Jde o to, že když se ti vypíše chyba, tak to znamená, že je asi něco špatně. A skrytí výpisu chyby ji neodstraní, takže máš chybný kod bez hlášení o chybě.
(ikdyž myslim že BetaCam odpověděl lépe než já)
Zrovna v této době myslím že by bylo záhodno abys ten rozdíl pochopil :)

JB17
Pokud používáš konstrukci ve webové prezentaci, abys oddělil obsah, pak souhlasím s tímto článkem http://php.vrana.cz/vzajemne-propojeni-souboru.php
a raději používám to... o bezpečnost je postaráno (a další věci)
imploder
Profil
Nox, BetaCam
Že skrýt chybu problém způsobující chybu nevyřeší, to chápu a s tím souhlasím. Skrytí chyby jsem myslel jako opatření, aby nešlo zjistit, jaké jsou nadefinované konstanty (podle BetaCama to není ideální (nejsem si jistý proč, protože by mohl útočník zjistit něco o tom, jak to funguje?), já bych to neřešil). Pokud znamená zobrazení chyby únik tajných informací, tak je pořád lepší když chyba nastane a k úniku nedojde než když se stanou obě nepříjemnosti.
BetaCam
Profil
imploder
Skrytí chyby jsem myslel jako opatření, aby nešlo zjistit, jaké jsou nadefinované konstanty

Na produkčních serverech je zobrazování chyb většinou vypnuté, ale to je vedlejší.

podle BetaCama to není ideální (nejsem si jistý proč, protože by mohl útočník zjistit něco o tom, jak to funguje?)

Uživatel ( útočník [ každý uživatel je potencionální útočník ]) by nikdy neměl dostat ani náznak toho jak je aplikace řešená uvnitř. Žádná aplikace není neprůstřelná, ale čím víc informací pustíš ven tím víc se aplikace stává průstřelnější.

já bych to neřešil

A to je tvůj hlavní problém. Neřešíš problém, ale pouze to jak ho skrýt.

Pokud znamená zobrazení chyby únik tajných informací, tak je pořád lepší když chyba nastane a k úniku nedojde než když se stanou obě nepříjemnosti.

Jistě, ale proč tu chybu radši neopravit? Pokud jí opravím tak prostě nenastane. Ty furt řešíš to jak zamaskovat svojí ( programátorovu ) chybu místo toho, aby si řešil to jak tu chybu opravit.

Opět si neodpustím přirovnání : Je to jako když dítě na pískovišti rozláme lopatičku a zahrabe jí do písku, aby se na to nepřišlo, ale co to řeší?? Dřív nebo později ji stejně někdo najde.

Skrývání chyb slouží hlavně k tomu, aby se nezobrazily chyby na které programátor nepřišel ( nepodařilo se mu je vyvolat ) při beta testování aplikace. Při beta testování chyby zobrazuješ a opravíš při ostrém nasazením chyby skryješ, logujes a pak opravíš. Skrývání chyb nemá sloužit k tomu, aby to zamaskovalo programátorovu lenost nebo neschopnost chybu odstranit.

Měl bys řešit problém a né následky.

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