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 |
#2 · Zasláno: 28. 1. 2023, 10:23:33
Ano, mozne to je. Mrkni treba na pravidla v htaccessu uvedens zde mike.treba.cz/mod_rewrite-a-hezke-url
|
||
Kajman Profil |
#3 · Zasláno: 28. 1. 2023, 10:38:07
|
||
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. |
||
Časová prodleva: 2 měsíce
|
|||
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 |
#6 · Zasláno: 15. 3. 2023, 17:13:01
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.
|
||
Časová prodleva: 2 roky
|
0