Autor | Zpráva | ||
---|---|---|---|
yenna Profil |
#1 · Zasláno: 2. 12. 2006, 16:24:03
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 |
#2 · Zasláno: 2. 12. 2006, 17:19:46 · Upravil/a: havs
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 |
#3 · Zasláno: 2. 12. 2006, 18:37:02
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 |
#4 · Zasláno: 2. 12. 2006, 19:28:31 · Upravil/a: havs
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 |
#5 · Zasláno: 2. 12. 2006, 22:01:26
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 |
#6 · Zasláno: 3. 12. 2006, 09:40:24
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 |
#7 · Zasláno: 3. 12. 2006, 11:05:07
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 |
#8 · Zasláno: 3. 12. 2006, 11:46:13
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 |
#9 · Zasláno: 3. 12. 2006, 12:17:57
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 |
#10 · Zasláno: 3. 12. 2006, 12:26:27 · Upravil/a: peta
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 |
#11 · Zasláno: 3. 12. 2006, 14:20:54
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 |
#12 · Zasláno: 3. 12. 2006, 19:44:15
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 |
#13 · Zasláno: 3. 12. 2006, 23:39:35 · Upravil/a: yenna
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 |
#14 · Zasláno: 4. 12. 2006, 10:07:14 · Upravil/a: havs
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 |
#15 · Zasláno: 5. 12. 2006, 16:46:03
ok, vyzkousim v nejake dohledne volne dobe, diky moc za rady :)
|
||
ernesto Profil * |
#16 · Zasláno: 7. 12. 2006, 01:03:52
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 )))
|
||
Časová prodleva: 17 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0