Diskuze: includování obsahu stránky
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 21 zpráv z 21.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, špatně to určitě není, je to jedna z možností. Další možností tedy je, že budeš mít index.php a potom např. složku stranky. Pomocí proměnné GET, která bude vlastně vstupovat do adresy můžeš zjistit název souboru, uloženého ve složce stranky. Tím pádem to můžeš udělat tak, že si v indexu tedy nejdeš místo, kam chceš obsah includovat. Tam to můžeš udělat nějak takhle:
include($_GET["stranka"].".php");
To vlastně includuje soubor, který uživatel zadal do adresy. Ta bude vypadat nějak takhle: http://tvojedomena.cz/index.php?…
Script se potom změní na:
include("./stranky/clanky.php");
Doufám, že jsi to pochopil
Ten první include je hodně nebezpečný. Varuji před jeho používáním.
To je docela blbost, když se bude někdo nudit a napíše
tvojedomena.cz/index.php?brazzers.com tak to asi nebude úplně ideální,
co myslíš
Ne ale vyšel by si z toho tak to může být:
tvojedomena.cz/index.php?mojeStrankaNaDomene
příponu k tomu doplníš na serveru
FunebrakCZ, z toho se stane:
include("./stranky/brazzers.com.php");
Což si dotyčný moc nepomůže. No ale tak nějak jsem předpokládal, že
se to zabezpečí funkcí file_exists()
Principem ale je, že se do URL napíše pouze název souboru a příponu .php
si server doplní sám.
IMHO to stejně půjde nějak napadnout, např. v Linuxu jdou vložit znaky co mažou atd., měl bys jsi to ošetřit. Je jedno, jeslti soubor existuje, může ti takhle zobrazit třeba soubor s hesly atd.
Já si nemyslím, jelikož všechny includy směřují do šložky /stranky.
Tato složka je pevně stanovená, a pokud budeš mít config třeba ve složce
includes (prostě jinde, než stránky ), tak to uživatel nebude mít
jak includnout (Pokud teda neumíš přepisovat pevně stanovený PHP
)
Je vidět že jsi si někde něco přečet a o praxi nemáš vůbec žádný
a nebo hodně malý potuchy
S PHP programuji již dlouho. Chtěl bych tě tedy požádat o vysvětlení.
Já to vždy dělám tak,
že pomocí .htaccess nastavím při pokusu o vnější příchod na soubor
config.php chybovou hlášku 403 (resp. stránka se dá includovat, ale nedá se
klasicky zobrazit přes tvojedomena.cz/config.php). Dám config např. do
složky /nastaveni a klasické stránky, které se includují do indexu pomocí
$_GET dávám např. do složky pages. V PHP nastavím !NATVRDO!, že všechny
stránky se mají brát POUZE ZE SLOŽKY PAGES. Pokud neumíš přepisovat
samotný zdrojový dokument, nenapadá mě žádný způsob, jak to obejít.
Používá to spousta lidí po celém světě. Kdyby to bylo nebezpečný, nikdo
by to nedělal. Nebo jsi snad jiného názoru?
Ahoj, šlo by to vyřešit i způsobem, že by se z URL, pomocí GET, zjistila hodnota parametru, porovnala se s databází a následně by proběhl include požadovaného obsahu? V případě neexistující hodnoty by vyskočila chybová hláška.
Máš-li na mysli, že by v databázi byl uložen seznam stránek a při pokusu o příchod na stránku by se zkontrolovalo, jestli tam ta stránka opravdu je, tak by to samozřejmě šlo nějak takhle:
$query = mysql_query("SELECT id FROM pages WHERE name='".mysql_real_escape_string(htmlspecialchars($_GET["page"]))."';"); //MySQL Dotaz
if(mysql_num_rows($query) > 0){ //Je-li počet stránek v databázi větší než 0 (existuje-li daná stránka)
include("./pages/".$_GET["page"].".php"); //Includuj
}
...nebo aspoň tak nějak
hele kluci ten komentář beru zpátky, mělo to být někam úplně jinam
jsem mimo, moulapavovi se
omlouvám
Ne, celý obsah by byl uložen v databázi a web by tím byl více dynamický.
Tak podle proměnné GET zvolíš název stránky, a pak pomocí názvu vybereš z databáze příslušný text. Což by mohlo vypadat takhle:
$query = mysql_query("SELECT text FROM pages WHERE name='".mysql_real_escape_string(htmlspecialchars($_GET["page"]))."';"); //Výběr obsahu stránky
$vypis = mysql_fetch_array($query); //Převedení do pole
echo $vypis["text"]; //Vypsání obsahu
Šlo by to teoreticky udělat i kratším zápisem, ale setkal jsem se s
tím, že jsem psal web v EasyPHP, kde vše šlo, a jak jsem to dal na hosting,
tak to psalo chyby. Tohle je zápis, který ti bude většinou fungovat.
Když do URL natvrdo strčím "..", tak ti to tvoje "natvrdo" může i změknout.
Ono se to dá ošetřit i jednoduše. Stačí jen přidat funkci basename().
include("stranky/".basename($_GET["stranka"]).".php");
Jenom to už nepoužívám, protože jsem si zvykl na funkci
__autoload()
, která řeší veškeré includování za mne.
S tím ".." jsem trošku experimentoval na svém webu a nic to neudělalo (kromě chyby 404). Jak jsi to přesně myslel?
Ano, omlouvám se. Již se mi tam ten config opravdu podařilo includovat.
Mnohokrát ti děkuji za upozornění před touto chybou a i za návod na
ošetření.
Zobrazeno 21 zpráv z 21.