Autor Zpráva
KOM
Profil *
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
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 *
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 *
visionic:
A co třeba vstup ve tvaru "../slozka/stranka"? Určitě nechceš skrz toto pustit uživatele do celého webu.
KOM
Profil *
anonymníí:
tohle nestačí?
$vlozeno = include('obsah/' . $stranka . '.php');
KOM
Profil *
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
Reaguji na KOMa:
Použití htmlspecialchars() tam vůbec nemá smysl.
KOM
Profil *
takze? i bez htmlspecialchars je na tom kod z hlediska napadnutelnosti jak?
Kubo2
Profil
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 &amp;

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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