Ja nevim, ale ja to resim uz nekolik let takhle:
$page = $_GET['page'];
require('./inc/header.php');
if (file_exists('./pages/'.$page.'.pripona')) {
require('./pages/'.$page.'.pripona');
}else {
echo 'Nenalezeno!';
}
require('./inc/footer.php');
Je to asi nejbezpecnejsi co znam. Kdyby se nahodou ty includovane stranky tahaly uplne s jine cesty, tak pouzit nejlepe absolutni cestu.
Pokud de o ty SQL-Injections, tak tak prohat to pres Str_Replace a nahradit klasicky apostrof za dva apostrofy.
K zasmani je to nahrazovani pripony php napr. priponou html. Stejne se clovek, ktery nam to chce nabourat, podiva do hlavicek co se vraceji od serveru. Tam identfikuje, ze tam bezi phpka (hned i verzi). Hlavne nejnapadnejsi je to u cest typu /cesta/stranky.html?parametr1=hodnota¶metr2=hodnota...
Arcao
a co kdyz $_GET['page'] obsahuje neco jako '../../../inc/cfg' ? trochu se chranite tou priponou ale stejne :)
nejbezpecnejsi je IMHO:
switch($_GET['page']){
case 'kkk': include 'kkk.php'; break;
case 'bbb': include 'bbb.php'; break;
}
a v pripade vetsiho mnozstvi to nacpat do db a neicludovat :)
Toto je spravne riesenie, enem neni pro lenivych! Este lepsie by to vsak bolo cez cisla, napr:
switch($_GET['page_id']) {
case 1:
include './abc.php';
break;
case 2:
include './xyz.php';
break;
// ATD, ale hlavne nezabudnut na:
default:
include './main-or-error.php';
break;
}
Pri rozsiahlejsich weboch, samozrejme riesit cez databazu, ale zasada je, ze by mala byt minimalna suvislost medzi menom inkludovaneho suboru a parametrom, pomocou ktoreho sa dostaneme k inkludovaniu daneho suboru (najma ak nechceme, aby niektore subory mohol bezny clovek vidiet, ze ano -- amateur-like admin modules a podobne).
"mala byt minimalna suvislost medzi menom inkludovaneho suboru a parametrom"
stastny to clovek, na ktereho netlaci zadni SEO specialisti :)
leda ze by to bylo:
switch ($_GET['par']) {
case "klicove_slovo": include "1.php"; break;
case "klicove_slovo2": include "nazev.php"; break;
}
:)
> Toto je spravne riesenie, enem neni pro lenivych!
A sakra, tak teď mě to dostalo - nikdy jsem nic jiného nepoužíval (metoda v článku mi přišla poněkud prapodivná, proč dělat ereg a jiné psí kusy, když mohu přímo porovnat, zda to má požadovanou hodnotu?), ale měl jsem za to, že lenivej jsem teda pořádně :-)
Skryvani pripony svuj smysl v nekterych pripadech urcite ma. Pokud se mi nekdo bude chtit nabourat do serveru a jako spravce jsem jiz natolik "schopen", ze umim schovat priponu, tak si taky jiste budu schopen odstranit hlavicky z HTTP response. Pak me nebude trapit ani to, zda server ma cesty ve formatu /cesta/stranky.html?parametr1=hodnota¶metr2=hodnota,
protoze web-aplikace, to neni jen PHP. Z takoveto cesty nezjisti nic - maximalne to, ze to je script, ale v jakem jazyce, to nepozna (pozor ale na chybove vypisy, protoze z tech pozna daleko vic)
Co tohle:
___________________
if (isset($_GET["zobraz"]))
{$soubor="adresar/".$_GET["zobraz"].".php";
if (File_Exists ($soubor)) {include ($soubor);}
else include ('adresar/chyba.php');}
else {include ("adresar/uvodni_strana.php");}
___________________
Čili co nebude v tom "adresar" se nevloží a šmitec. Ať mu dáte do URL cokoliv, bude pořád opakovat svou. Dá se to nějak obejít?
A k těm dvojitým uvozovkám: skutečně je to natoli zpomalující?
Rád uznám, že se mýlím, ale přecejen bych raději viděl nějaký konkrétní důkaz, nikoli jen prohlášení. Navíc jestli jde jen o odstranění znaků "../", tak se to dá celkem lehce zařídit a nemusí se to kontrolovat proti nějakému poli, kam bych ty povolené stringy musel při každé nové stránce vkládat.
A co takhle zatocit s relativnimi cestami jednoduse ...:
if (isset($_GET["zobraz"]))
{
$soubor=$_GET["zobraz"];
if($soubor_temp=strrchr($soubor,"/")) $soubor=$soubor_temp;
$soubor="adresar/".$soubor.".php";
if (File_Exists ($soubor)) {include ($soubor);}
else include ('adresar/chyba.php');}
else {include ("adresar/uvodni_strana.php");}
Ja pouzivam toto, myslim ze to je bezpecnejsi:
switch($_REQUEST['go']) {
case 'ukaz' :
include 'modules/ukaz.php';
break;
case 'diskuze' :
include 'modules/diskuze.php';
break;
...
default :
include 'modules/404.php';
};
samozrejme se to neda pouzit tam kde by tech case bylo mnoho. Ja mam svuj system postaveny tak ze napriklad jednim modulem ukaz.php zobrazim jakykoliv zobrazitelny objekt v db (obrazek, clanek, kategorii, ...)
Co se tyka SQL injection pouziti
query('SELECT '.odstran_nebezpecne_znaky($_GET['neco']).' FROM ...
je spatne. takto naprimo se daji vkladat mozna hodnoty (texty, cisla) escapovane a v uvozovkach. Pokud ma uzivatel zadat "kus SQL kodu" tak bych pouzil spis tohle
$order_by_codes = array(
'datum' => 'datum DESC',
'jmeno' => 'jmeno ASC',
);
if (isset($order_by_codes[$_GET['tridit']])) {
$order_by_code = $order_by_codes[$_GET['tridit']];
} else { // vychozi trideni
$order_by_code = $order_by_codes['datum'];
};
query('SELECT id, jmeno, datum FROM tabulka ORDER BY '.$order_by_code);
Takto mam zaruceno ze se na konec dotazu muze dostat jedine 'datum DESC' nebo 'jmeno ASC' a nic jineho. Bezpecnejsi je to hlavne z toho duvodu ze se do dotazu NEDOSTANE TO CO UZIVATEL ZADAL, treba i "odzbrojene", ale jen to CO JE V KODU.
Já jsem začal používat pomoci regulerních výrazů, takže to dělám takto:
$subj=$_GET['subj'];
if(ereg('^(news|products|contacts)$',$subj))
require_once $subj.'.php';
else
require_once 'firspage.php';
Ale pravdou je že tento přístup už je minulostí a subject si nepředávám jako parametr url, ale se odkazuju na stránky. Díky autorovi tohoto článku jsem byl naveden na Smarty, které mi hoooodně práce ušetří.
Haluz haluz a este raz haluz! Ludia, regexpy su na to aby ste z textu vyparsovali emailove adresy, URLs a podobne a nie na to, aby sa nimi testovali kdejake hodnoty! Preco? Pomale a neprehladne! Navyse ked existuju vstavane funkcie na pracu s textom (napr.: http://sk2.php.net/manual/en/function.strstr.php), ktore su na tento pripad ovela vhodnejsie.
Mne to pride, ze niekto sa naucil pouzivat regexpy a zacal ich pouzivat vsade kde sa da! :-\
PAMATAJTE: regexpy su mocny nastroj, tak ho treba pouzit tam kde treba mocny nastroj! Na pokosenie zahradky pred domom tiez nepouzijete kombajn!