Autor Zpráva
Lorin
Profil *
Momentálně se snažím naprogramovat jednoduchou PHP aplikaci a narazil jsem na malý problém, který jsem dříve ledabyle odbyl bez nějaké většího přemýšlení, ale v tomto případě si chci dát obzvláště záležet na kvalitě provedení, takže na každý problém hledám více než jedno nejkratší řešení.

Dejme tomu, že mám stránku index.php, ve kterém bych chtěl načítat ostatní stránky (např. přihlášení, administraci atd.). Dříve jsem "substránky" (například jako již zmíněné přihlášení) uložil do nového souboru a po zavolání index.php?p=jmenostranky jsem načetl stránku, která byla uvedena v proměnné $_GET['p']. Samozřejmě jsem testoval, zda jméno souboru neobsahuje .. (přechod o adresář výše), lomítko, nebo jiné nepovolené znaky a zda soubor existuje ve mnou zadaném adresáři.

Lze tohle nazvat bezpečným a správným řešením nebo se spíše používá nějaký jiný postup?

Děkuji. L.
Str4wberry
Profil
Ještě je vhodné ošetřit případné samostatné spuštění souboru, který se někam vkládá.
Lorin
Profil *
A, zapomněl jsem zmínit kontrolu u každého načítaného souboru. Hned na začátku se testovalo, zda se soubor nenačítá přímo, v případě že ano, byl uživatel automaticky přesunut na index.php.
Lorin
Profil *
Takže tento způsob můžu bez obav použít?
Samozřejmě za předpokladu, že v kontrolách nebudou mnou zanesené chyby.
nethor
Profil
Tohle řeším zcela opačně:
v samostatném souboru "pfx_requires.php" na začátku scriptu jmenovitě definuji, co se bude při kterém $_GET načítat.
if($_GET[p] == "shop") {
	require_once	"pfx_shop.php";		// načte se hned
	$load_body[] = 	"pfx_shop_form.php";	// připraví se pro načtení v těle
	}


Jedna z výhod je, že případnému útočníkovi 'neukazuju karty' formou jména souboru.
Lorin
Profil *
To mě taky napadlo, ale nakonec jsem se rozhodl, že do $_GET['p'] se umístí jen část jména souboru, třeba právě "shop". Pak při zpracování načítané stránky doplním její název o nějakou předponu (zkratka jména projektu atd.) a příponu (buď jen .php nebo třeba .inc.php popř. něco podobného).
L.

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