Autor | Zpráva | ||
---|---|---|---|
KOM Profil * |
#1 · Zasláno: 24. 2. 2016, 14:17:55
Ahoj,
pomalu opouštím od šablonových webů pomocí Adobe Dreamweaver a pokouším se stránky složit výhradně pomocí PHP. V současnosti mám stránku index. php, kde mám komplet layout (hlavička, menu, patička) a pouze měním obsah stránky, pomocí tohoto kódu: <?php if (isset($_GET['stranka'])) $stranka = $_GET['stranka']; else $stranka = 'uvod'; // pokud parametr není zadaný, zobrazí se tento obsah if (preg_match('/^[a-z0-9]+$/', $stranka)) // zabezpečení -> ověření řetězce pomocí regulárního výrazu { $vlozeno = include('obsah/' . $stranka . '.php'); if (!$vlozeno) echo('Obsah nenalezen'); } else echo('Neplatný parametr.'); ?> Jednotlivé hlavní stránky, jako je: fotogalerie.php, uvod.php atd. se správně vypisují. Nyní řeším toto. Na stránce uvod.php mam i nějaké články, ktere se nyní spravne vypisuji z DB MySQL. Nyní chci, aby se po kliknutí na nadpis, objevil detail článku ve strance pojmenovane: uvod_detail.php V předchozím kodu je osetreno, ze v nazvu stranky mohou byt jen znaky A-Z a čisla 0-9. Jak mám bezpecne nadefinovat predchozi kod, aby mi to poustelo napr. tento odkaz? index.php?stranka=uvod_detail?novinky_id=2 Zkousel jsem stranku s detailem pojmenovat bez podtrzitka, nefungovalo to, zrejme vadi i to ID novinky. Dochazi k vypisu: Neplatný parametr. Zkousel jsem i nejak predefinovat i znaky ktere jsou povoleny. Ale to mi samozrejme nejde, jsem PHP lama a i kdyby se mi to nakrasne povedlo, nevedel bych, jestli je pak pouzivani prikazu include bezpečné. Díky za vas cas a ochotu mi pomoci. |
||
Martin02 Profil |
KOM:
Máš špatně GET proměnné v URL. Na začátku je ? , který definuje, že začínají GET proměnné a ty se pak od sebe oddělují & , nikoli dalším ? . Takže výše zmíněná adresa by měla být:
index.php?stranka=uvod_detail&novinky_id=2 Pokud chceš, aby ti ten regulární výraz akceptoval i podtržítko, jednoduše ho přidej do těch hranatých závorek: /^[a-z0-9_]+$/ Bezpečnost potom řešíš jen tak, aby si do dotazu do databáze necpal celou proměnnou $_GET['novinky_id'] , ale escapoval ji. Jinak by ti někdo mohl databázi třeba smazat, viz SQL injection.
|
||
Taps Profil |
#3 · Zasláno: 24. 2. 2016, 14:33:12
KOM:
v souboru uvod_detail.php musíš zpracovat pomocí GET proměnou novinky_id a poté z databáze vytáhnout potřebný článek. |
||
KOM Profil * |
#4 · Zasláno: 24. 2. 2016, 15:13:18
Martin02:
Super, uz to maka, diky moc. Takze s pridanym podtrzitkem do definice a se znakem '&' v adrese, je vse bezpecne? |
||
visionic Profil * |
Co třeba tohle?
<?php //<-- include content $prom1 = $_GET['prom1']; $filename = $prom1.".php"; if (file_exists($filename)) { include_once($filename); } else { echo ''; } //--> ### ?> Do odkazu zadas href="home" a includne ti to home.php. a do toho else si dej treba 404.php a do souboru napis echo s hláškou stránka nenalezena. OPRAVA: (mám totiž zaplý v modrewrite krásné url, tak mě stačí bez toho ?prom1=) <a href="?prom1=home">Home</a> |
||
anonymníí Profil * |
#6 · Zasláno: 25. 2. 2016, 12:00:37
visionic:
A co třeba vstup ve tvaru "../slozka/stranka"? Určitě nechceš skrz toto pustit uživatele do celého webu. |
||
KOM Profil * |
#7 · Zasláno: 25. 2. 2016, 20:49:36
anonymníí:
tohle nestačí? $vlozeno = include('obsah/' . $stranka . '.php'); |
||
Časová prodleva: 7 dní
|
|||
KOM Profil * |
#8 · Zasláno: 3. 3. 2016, 13:01:29
Pridal jsem parametr htmlspecialchars - staci takto zabezpeceny kod pro skladani stranky?
<?php if (isset($_GET['stranka'])) $stranka = htmlspecialchars($_GET['stranka']); else $stranka = 'uvod'; // pokud parametr není zadaný, zobrazí se tento obsah if (preg_match('/^[a-z0-9_]+$/', $stranka)) // zabezpečení -> v hranaté závorce jsou povolené pismena, cislice a podtržítko, ktera se mohou objevit za: index.php?stranka= { $vlozeno = include('obsah/' . $stranka . '.php'); if (!$vlozeno) echo('Obsah nenalezen'); } else echo('Neplatný parametr.'); ?> |
||
Fisir Profil |
#9 · Zasláno: 3. 3. 2016, 14:58:19
Reaguji na KOMa:
Použití htmlspecialchars() tam vůbec nemá smysl.
|
||
KOM Profil * |
#10 · Zasláno: 3. 3. 2016, 16:28:21
takze? i bez htmlspecialchars je na tom kod z hlediska napadnutelnosti jak?
|
||
Časová prodleva: 9 dní
|
|||
Kubo2 Profil |
#11 · Zasláno: 12. 3. 2016, 11:21:12
KOM:
„takze? i bez htmlspecialchars je na tom kod z hlediska napadnutelnosti jak?“ Presne tak isto ako bez htmlspecialchars() , no použitie htmlspecialchars() je v danom kontexte kontraproduktívne. O escapovaní si prečítaj tu: phpfashion.com/escapovani-definitivni-prirucka
|
||
leorond Profil |
Já nevím ale nebylo by lepší například něco takového
<?php if(isset($_GET["pages"])) { if(file_exists("./".$_GET["pages"].".php") && (substr_count($_GET["pages"], "../") == 0) && (substr_count($_GET["pages"], "..\\") == 0)) { include_once "./$_GET[pages].php"; } else { echo 'Nenalezeno'; } } else { echo 'Nenalezeno'; } ?> Výsledná adresa by poté byla index.php?pages=pages/home za otazníkem pages => $_GET
= pages => složka s uloženými skripty / home => název skriptu bez přípony .php Pokud budeš poté chtít třeba stránkovat nebo jet další $_GET tak za odkaz přidáš ještě například &id=...Já tam přidávám & jako &
|
||
Časová prodleva: 9 let
|
0