| 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: 10 let
|
|||
0