Autor Zpráva
yenna
Profil
ahoj, chtela jsem se zeptat jak je to sou bezpecnosti prikazu include
Pouzila jsem jej pro vlozeni stejneho navigacniho menu na svych strankach, ale ted pri prohlizeni ruznych manualu na webu nejak zjistuju, ze je tento zpusob lehce napadnutelny.... narazila jsem spoustu protichudnych nazoru a vzhledem k tomu, ze jsem php zacatecnik, jsem z toho ponekud zmatena...
http://php.vrana.cz/vkladani-souboru.php
http://www.pcsvet.cz/forum/forum.php?art=728
http://interval.cz/clanky/bezpecnost-predevsim-include-v-php/ (clanek i diskuze na nej)

na mych strankach jsem normalne pouzila kod podle jakpsatweb.cz:
<?php include "slozka/menu.php"; ?>


funguje to v poradku, ale je to tedy nebezpecne?
nebo mam pouzit neco takoveho, co je v tom tretim odkazu?
$filename='pages/main.php'; // výchozí stránka
if (!empty($_GET['app'])) // je požadována nějaká aplikace/skript?
{
if (File_Exists ('Controls/'.$_GET['app'].'.php'))
{ // pokud existuje požadovaný skript ve složce Controls, nastavit vkládaný soubor na jméno skriptu
$filename='Controls/'.$_GET['app'].'.php';
}
}
elseif (!empty($_GET['page'])) // nebo je požadována nějaká stránka?
{
if (File_Exists('Pages/'.$_GET['page'].'.php'))
{ // pokud existuje požadovaná stránka ve složce Pages, nastavit vkládaný soubor na jméno stránky
$filename='Pages/'.$_GET['page'].'.php';
}
}
include ($filename); // vložit soubor


abych se priznala, tak tomuhle uz vubec nerozumim :(
prosim poradte....
diky
havs
Profil
ten příklad je v pořádku - <?php include "slozka/menu.php"; ?> - je to vnitřní příkaz na webu.

Nebezpečné je, když se posílá hodnota include v proměnné adresou:
<a href="index.php?stranka=neco.php">
a použije se jako: <?php include ($stranka); ?>
tam je potřeba ověřit, zda se nebude includovat cizí skript - teda, jestli se použije ten správný.
yenna
Profil
aha, takze jestli to aspon matne chapu spravne, tak ten problem plati, kdyz nacitam pomoci include OBSAH ?
o tom jsem cetla na http://polopate.jakpsatweb.cz/index.php?page=include2
tady se uz nejedna o vnitrni prikaz webu?

tohle je pomoci pomenne? index.php?page=include2
havs
Profil
No, přesně, to už chce ověřít soubor v podmínce přes file_exists ()
a určit výchozí alternativu, když je v proměnné něco nežádoucího, nebo když neexistuje, třeba:

$url="soubory/".$_GET["stranka"].".php"; // udělám si šablonu cesty
if (file_exists($url)) { include ($url); } // ověření a vložení
else { include ("soubory/uvod.php"); } // výchozí soubor

odkaz: <a href="index.php?stranka=neco">
<!-- jen název bez koncovky -->

... to je jen jedno, jednoduché řešení pro načítání z jednoho adresáře, vynalézavosti se meze nekladou. A ještě to jde switchem.
yenna
Profil
aha, diky moc odpoved a ten skript :)

jenom jsem to tedka zkousela a prepsala "neco" na "obsah", coz je soubor obsah.php ve slozce soubory, jestli jsem to tedy pochopila spravne bo jsem fakt php zacatecnik v plenkach...

<?php
$url="soubory/".$_GET["$stranka"].".php"; //cestu "soubory/" mam tedy nechat vyplnenou takhle a server si bude hledat v ni soubory, na ktere odkazuju pomoci <a href="index.php?stranka=nejaky php soubor ve slozce soubory, ve kterem uz bude cisty nebo formatovany text, clanek">... je to takhle spravne?

if (file_exists($url)) { include ($url); }
else { include ("soubory/uvod.php");
?>

<a href="index.php?stranka=obsah">odkaz</a>

protoze me to nejak nefunguje :(
vypisuje mi to: Parse error: parse error in c:\documents and settings\dlouhatanska cesta k tomu souboru\index.php on line 46
a pritom ten soubor ma jen 45 radku.....

nejak uz nevim co s tim....
havs
Profil
Asi už jsi to po ránu objevila - měl jsem tam chybu, na řádku else nebyly uzavřené složené závorky. Omlouvám se, správně je:

else { include ("soubory/uvod.php"); }
yenna
Profil
jo, super, ted to funguje skvele :)
diky diky moc

akorat kdyz najedu na uplne prvni stranku, jenom http://localhost/, tak mi to k tomu jeste pise chybu:
Notice: Undefined index: stranka in c:\documents and settings\dlouha cesta do slozky\kveten\index.php on line 37
a na radku 37 je $url="soubory/".$_GET["stranka"].".php";
nevis prosim, cim to je?

a kdyz uz jsem tak otravna, mohlo by treba fungovat include promenliveho obsahu primo jenom z jednoho php souboru, kde by treba bylo 20 ruznych obsahu (napriklad obrazky s popisky a navigaci pro fotogalerii), ktere by mely svou vlastni promennou a odkazovalo by se na ne prave pomoci promenne v tom php souboru?
jestli je tohle na databazi, tak tu neumim jeste vubec :(
diky moc
havs
Profil
A obsah stránky definované řádku else to vloži?
... aneb, adesa v řádku else je správně (vzhledem ke stránce v prohlížeči)?
yenna
Profil
jo, v radku else se ta podminka splni, je tam ten uvod.php, ale nad nim je v prohlizeci vypsana ta chyba....
u tech ostatnich odkazu, napr:
<a href="index.php?stranka=uvod">uvod
<a href="index.php?stranka=obsah">odkaz
<a href="index.php?stranka=kontakt">kontakt
je to uplne v poradku bez te hlasky....
peta
Profil
yenna
1. v prvni rade, kdyz neco delas v PHP, tak je dulezite si zapnout hlaseni chyb.
error_reporting(E_ALL); //hlaseni chyb = on, zakomentovat!
ktere po skonceni projektu zakomentujes, aby se pripadnemu utocnikovi neobjevila nejaka chybova hlaska.

2. v tom okamziku ti to zacne hlasit na radku
$url="soubory/".$_GET["$stranka"].".php";
chybu, protoze GET by mel byt osetreny na pripad, kdy nedostane zadna data
To osetreni provadim timto zpusobem:
$a = "stranka"; $x = isset($_POST[$a]) ? $_POST[$a] : (isset($_GET[$a]) ? $_GET[$a] : "");
(tady treba resim POST i GET, nejsem si ted jisty, co mi to provede, jestlize budou zapnute superglobalni promenne)

3. Jenze stale muze nastat pripad $x = ""; cili zadne GET ani POST a
include ("soubory/"."".".php");
tim padem zahlasi chybu.
V tomto pripade to osetruji tak, ze pouziji if
if ($x!=="") {include(...);}

4. ok, takze POST nebo GET bude, ale ted se utocnik pokusi podvrhnout stranka=index nebo nejakou jinou, treba neexistujici
Protoze je to dulezita cast scriptu, tak tady si nedovolim utocnikovi davat jedinou mezirku a osetrim to pres pole hodnot.
$stranky = array("stranka","index","kontakty");
if (in_array($x,$stranky)) {include(...);}
Nebo je mozne pouzit script s existenci souboru, viz havs, ale je treba pocitat s tim, ze se nekdo pokusi podvrhnout treba "index"

Cili v tvem pripade by to vypadalo:
$a = "stranka";
$x = isset($_POST[$a]) ? $_POST[$a] : (isset($_GET[$a]);
$stranky = array("stranka","index","kontakty");
if (in_array($x,$stranky)) {include("./soubory/$x.php);}

Vyhodou hlaseni chyb je, ze te upozorni na promenne, ktere v nejake situaci nemaji zadnou hodnotu. Coz ve vetsine situacich je dost neprijemne.
Ale treba v pripade superglobalnich promennych se uvazuje
$a == $_GET["a"] == $_POST["a"] == $_COOKIES["a"] == $_SESSION["a"]
mam pocit
a v tomto pripade uz je to velice vyznamne, protoze zdanlive neskodny program
echo $_SESSION[$a]
kdy treba $a naplnujes jen v nekterem pripade
se ti muze promenit na velice skodny pouzitim:

./stranka.php?a=heslo
superglobalni promenne budou mit vsechny stejnou hodnotu
$a = $_GET["a"] = $_POST["a"] = $_COOKIES["a"] = $_SESSION["a"];
echo $_SESSION[$a];

a to uz mi prijde docela vyznamne, kdyz si cizi clovek muze zobrazit heslo nekoho, kdo si prave odskocil na kafe a zapomnel se odhlasit
yenna
Profil
peta:
hm, no.....
1. error_reporting(E_ALL); se pise v tom php.ini nebo jinych konfiguracich?
protoze me to nic, kdyz to zadam v index.php nedela.....
nebo to asi jako obvykle pisu blbe?

takze mam misto:
$url="soubory/".$_GET["stranka"].".php";
if (file_exists($url)) { include ($url); }
else { include ("soubory/uvod.php"); }

pouzit:
$a = "stranka";
$x = isset($_POST[$a]) ? $_POST[$a] : (isset($_GET[$a]);
$stranky = array("stranka","index","kontakty");
if (in_array($x,$stranky)) {include("./soubory/$x.php);}

ale ono to pak nefunguje vubec a vypisuje to chybu na radku, kde je $x = isset($_POST[$a]) ? $_POST[$a] : (isset($_GET[$a]);

ja uz se v tom fakt nevyznam....
krteczek
Profil
yenna: koukni se na tento thread: http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&topic=37 923&page=1 je tam několik způsobů bezpečného includování souboru, kdyby Ti něco nebylo jasné tak se ozvi :-D
krteczek
yenna
Profil
krteczek: no...tak jsem si to cele precetla, ale o moc moudrejsi z toho nejsem. Prijde mi, ze se tam vsichni predhaneji v psani "bezpecnych" skriptu a navzajem si je pak vyvraceji.... to neminim jako vysmech, ale spis jako muj nahled totalniho zacatecnika, ktery se odvazil jen na ty nejednoduzsi skripty..... clovek pak nevi, co ma zvolit
netusila jsem, ze php je tak slozite a rozmanite a internetovi navstevnici (utocnici) tak zli..... :)

mno, asi prece jenom zatim zustanu u otrockeho vytvareni jednotlivych celych stranek v html podobe ;)
ale diky moc vsem za pomoc a rady :)
havs
Profil
Je tam zmínka o switchi, není to špatný způsob, sám to používám, protože mívám soubory rozstrkané po různých adresářích.
Zadá se pro každou stránku zvlášť jméno a adresa souboru - vzájemně spolu nesouvisí - a nakonci výchozí stránka. Includují se jen tady povolené soubory.

<?php
switch ($_GET['stranka'])
{
case "galerie": $nacti = "fota/galerie.php"; break;
case "vzkazy": $nacti = "kniha/nacti.php"; break;
default: $nacti = "soubory/uvod.php"; break;
}
include ($nacti);
?>

<a hef="index.php?stranka=galerie">
yenna
Profil
ok, vyzkousim v nejake dohledne volne dobe, diky moc za rady :)
ernesto
Profil *
hustý, jakmile se na něco zeptá začínající PROGRAMÁTORKA, tak je tu milion odpovědí. jen dodam, že muj šéf už pekelně dlouho čeká na to, až mu na pohovor na místo PHP dev příde nějaká holka )))
Toto téma je uzamčeno. Odpověď nelze zaslat.

0