Autor Zpráva
Bazim
Profil
Dobrý den,

bude to hloupá a hodně začátečnická otázka, ale prolétávám internet a stále jsem nedokázal docílit toho co bych chtěl.

Měl jsem web udělaný tak, že index.php byla nějaká hlavní stránka a poté všechny ostatní stránky měly include('menu.php'); hlavicka.php, footer.php atp.., ale přišlo mi to hodně takové komplikované, takže jsem si všechny stránky upravil, že obsahují opravdu jen ten samotný obsah a index.php obsahuje:

if (!isset($_GET['stranka']))
{
    include('home.php');
}
else
{
    $stranka = $_GET['stranka'];
    include("$stranka.php");
}

Odkaz vypadá nyní následovně: web.cz/index.php?stranka=kontakt

Chtěl bych docílit, abych mohl používat odkazy vypadající jako web.cz/kontakt uživateli by se stále dávala adresa index.php?stranka=kontakt, ale byla by zamaskovaná v hezké URL web.cz/kontakt

Je to možné?
Taps
Profil
Ano, mozne to je. Mrkni treba na pravidla v htaccessu uvedens zde mike.treba.cz/mod_rewrite-a-hezke-url
Kajman
Profil
Nebo obecně dle
Řešení některých častějších problémů (FAQ) » Univerzální obecné pravidlo
Bazim
Profil
Kajman:
Děkuji mnohokrát, zkoušel jsem, ale všechno mě hází zpátky na index.php


Taps:
Děkuji mnohokrát, jako druhý pokus jsem zkusil dle tohoto návodu a vypadá, že funguje i když jsem to nedávno zkoušel také, asi jsem někde měl chybu.
dakur
Profil
Offtopic, ale myslím, že podstatný.

Pozor, že pokud to necháš jen takto, může si kdokoliv zobrazit přes tvůj web jakýkoliv soubor, který na serveru je. Např.: web.cz/index.php?stranka=../../../../../etc/passwd

Je třeba ošetřit nějak tu proměnnou $stranka, aby neobsahovala, co obsahovat nemá. Taková základní kontrola je na přítomnost znaků ..:

if (str_contains($stranka, "..")) include("e404.php");
else include("$stranka.php");

Nicméně stále lze zobrazovat soubory, které jsou v aktuálním či nižším adresáři.

Pokud máš omezený počet stránek, asi je nejlepší mít ty stránky prostě vypsané, např.:

if ($stranka === "o-nas") include("o-nas.php");
elseif ($stranka === "kontakt") include("kontakt.php");
// ...
else include("e404.php");

Je to trochu psaní, ale je to bezpečné a řeší se to tak naprosto běžně.
Kajman
Profil
dakur:
Pozor, že pokud to necháš jen takto, může si kdokoliv zobrazit přes tvůj web jakýkoliv soubor, který na serveru je. Např.: web.cz/index.php?stranka=../../../../../etc/passwd

Viděl jste někdy server, kde by byl apache tak hrůzostraně špatně nastavený, aby to šlo?

preg_match("..", $stranka)

To není vůbec dobře. První znak určuje oddělovač. Tedy i druhá tečka bude brána jako oddělovač, proto tomu vyhoví cokoliv, protože mezi nimi nic není. A i když použijete okolo dvou teček jiný oddělovač, tak tečka znamená jakýkoliv znak, proto by to vyhověly všechny stringy delší než jeden znak.

S čím naopak souhlasím, tak mít whitelist se jmény souborů, které je možné includovat. Také se může použít include_once, aby se zamezilo cyklení, když někdo zákeřný zadá example.com/index
Keeehi
Profil
dakur:
Než kontrolovat co je v jaké proměnné a podle toho includovat nebo ne, bude lepší použít nástroje, co jsou pro to určeny.
1) Správně nastavená práva. Uživatel pod kterým běží PHP proces by předně vůbec neměl mít práva na přístup k souboru passwd.
2) Na omezení kam PHP může existuje v konfiguraci direktiva open_basedir
dakur
Profil
Kajman:

To není vůbec dobře.

Pravda, díky za upozornění. Měl jsem na mysli str_contains(), opravil jsem to.

Kajman:
Keeehi:
Viděl jste někdy server, kde by byl apache tak hrůzostraně špatně nastavený, aby to šlo?
Než kontrolovat co je v jaké proměnné a podle toho includovat nebo ne, bude lepší použít nástroje, co jsou pro to určeny.

Jednak jsme v sekci začátečníci, autor pravděpodobně nic o nastavení serverů netuší a je lepší, aby to měl bezpečné aspoň nějak. Je to poměrně zásadní chyba a přitom úplně zbytečná. Nejde přitom o soubor passwd, útočník může stejně tak sáhnout do /var/log, ../config/config.yml či kamkoliv jinam. Druhak s tím určitě nesouhlasím, protože stejně jako např. databázová vrstva nemůže spoléhat na to, že jí budou data chodit správně, proto má všelijaké constrainty, tak stejně tak aplikační vrstva by neměla spoléhat na to, že to server správně ošéfuje, nýbrž by měla mít vlastně ověření, že se tam někdo nesnaží poslat blbost. Server by měl být samozřejmě správně nastaven taky, ale bez ošetření v aplikaci stále bude moci útočník v pohodě traverzovat adresáři webu.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0