Autor Zpráva
JimmyHD
Profil *
Ahoj,

vsude ctu jak je include nebezpence kvuli napadeni stranek.

Tak bych se chtel zeptat

1.) jestli je nebezpecne i v pripade ze budu na strankach mit jednoduche (pevne) include ve stylu

<?php iclude(soubor.inc); >

tzn. zadne promenne - include($soubor);


2.) je nebezpecne i pri includovani timto zpusobem?

if $includuj = stranka1
include stranka1.inc
elseif $includuj = stranka2
include stranka2.inc
elseif $includuj = stranka3
include stranka3.inc
else
include 404.inc

(taky zadne promenne v include)
(pisu v rychlosti tak se nesmejte jak je to napsane diky :) )


Diky za odpovedi.
AM_
Profil
kdyz si to trochu osetris, staci: $soubor = preg_replace('/[^a-z0-9]/i', '', $soubor); include "inc/$soubor.php"; tak je to bezpecne i s promennou. Bez tohohle osetreni by ti nekdo do include mohl propasovat svuj skript (napr. by tam zadal http://hackeruv-web.cz/hack.php), razem na tvem webu bezi cizi skript, muze ti cist, menit a mazat soubory atd) nebo i dalsi problemy.
JimmyHD
Profil *
k cemu potrebuji toto osetrenikdyz ve skriptu budu mit include "vzdyurcitysoubor.inc" a ne promennou (include $soubor) ??


A muzu te poprosit o vysvetleni (jak pro *******) co presne provadi tenhle zapis? $soubor = preg_replace('/[^a-z0-9]/i', '', $soubor);


Dekuji
JimmyHD
Profil *
proc se to deb*l vyhvezdickovalo? to jsem nadaval sam sobe :-D
JimmyHD
Profil *
A co rikate na tahle reseni:

<?php include $_SERVER['DOCUMENT_ROOT']."/lib/sample.lib.php"; ?> ???? Tohle je bezpecne? To se mi hodne zamouva :)

Jinak jsem narazil jeste na tohle: include($folder.DIRECTORY_SEPARATOR.$file;)
AM_
Profil
ten zapis odstrani vsechny nealfanumericke (ne-cisla-a-pismenka) znaky z promenne $soubor, cimz zamezis vkladani nezadoucich souboru.
if $includuj = stranka1
include stranka1.inc
elseif $includuj = stranka2
include stranka2.inc
elseif $includuj = stranka3
include stranka3.inc
je hroznost, pouzij radeji tu promennou. Kdybys to uz mermomoci chtel udelat takhle, tak skutecne ochranu nepotrebujes, ale je to reseni jak za krale klacka.
Tomasds
Profil
Nemůžu si pomoct, ale když tady zase čtu debatu o includu a zase tady lítají reguláry, elseify a bezpečnost, dovolím si připomenout své řešení, které mi pořád připadá jaksi nejpřehlednější a nejbezpečnější.

$inc="404.inc";
if ($includuj == "neco")  {$inc="nejakastranka.inc";};
if ($includuj == "neco2") {$inc="nejakastranka2.inc";};
if ($includuj == "neco3") {$inc="nejakastranka3.inc";};
if ($includuj == "neco4") {$inc="nejakastranka4.inc";};

include $inc;
JimmyHD
Profil *
Myslis ze tohle je pouzitelne a dobre zabezpecene proti utoku?


// vezmu poslanou promennou
get promenna

// pokud neni poslana promenna nastavim hlavni stranku
if(!isset($promenna))
$promenna = "hlavnistranka";
endif

// odstranim nepovolene znaky z promenne
$promenna = preg_replace('/[^a-z0-9]/i', '', $promenna);

// pred promennou vlozim slozka/ a pridam tecku a priponu a ulozim to do promenne soubor
$soubor = "slozka/"."$promenna".".pripona";

// pokud existuje soubor includuj ho
if (file_exists($soubor)) {
include $soubor;

// pokud ne includuj soubor 404.inc ze slozky errors
} else {
include "errors/404.inc";
}
tiso
Profil
Tomasds - spoliehaš sa na nastavenie servera (že príponu inc bude interpretovať ako PHP), a keď už, tak lepšie je riešenie s in_array ako if if if...
Tomasds
Profil
tiso
Abych se přiznal, na inc nespoléhám, includuju soubory php, tady jsem napsal inc jen proto, abych se přiblížil tomu, jak to bylo napsáno nade mnou.

in_array nedosahuje přehlednosti if if if :)
tiso
Profil
Tomasdsin_array nedosahuje přehlednosti if if if :)
A to máš odkiaľ? Nikdy si nevidel viacriadkový zápis poľa?
AM_
Profil
Tomasds
Hodně štěstí při psaní stránky, která bude mít padesát sekcí. Nebo třeba dvě stě. A když po tobě ten kód přebere jiný programátor, s největší pravděpodobností tě zastřelí. Ukaž mi způsob, jak prostřelit preg_replace('/[^a-z0-9]/i', '', $promenna).
JimmyHD
Přesně jak jsi to napsal, neznám způsob, jak takovou ochranu prostřelit (ono to ani není ochrana, jen čistě napsaný kód, ve kterém není žádná bezpečnostní chyba). Leda snad že by byla chyba v samotném PHP
Tomasds
Profil
tiso
ok, stačilo. Nemám potřebu se dohadovat o nesmyslech, svou verzi použití include jsem napsal.
Tomasds
Profil
AM_
Programátor jsem já. Padesát podstránek by bylo docela dost, ale neviděl bych to jako problém. 200 stránek.. takový web neznám.
JimmyHD
Profil *
tak jsem udelal 2 varianty, muzete mi prosim okomentovat jejich chyby nebo ktera je/neni bezpecnejsi a proc?

predem diky!

1)
<?php
if (!isset($_GET['gohere'])) {
	$gohere = "hlavni-stranka";
} else {
	$gohere = preg_replace('/[^a-z0-9]/i', '', $gohere);
}
if (file_exists("./".$gohere.".php")) {
	include ("./".$gohere.".php");
} else {
	include "./error-404.php";
}
?>


2)
<?php
if (!isset($_GET['gohere'])) {
	$gohere = "hlavni-stranka";
} else {
	$gohere = preg_replace('/[^a-z0-9]/i', '', $gohere);
}
if (file_exists($_SERVER['DOCUMENT_ROOT'].$gohere.".php")) {
	include ($_SERVER['DOCUMENT_ROOT'].$gohere.".php");
} else {
	include $_SERVER['DOCUMENT_ROOT']."error-404.php";
}
?>
AM_
Profil
bezpečnější je třetí:
<?php
if (!isset($_GET['gohere'])) {
    $gohere = "hlavni-stranka";
} else {
    $gohere = preg_replace('/[^a-z0-9]/i', '', $gohere);
}
if (file_exists("docs/".$gohere.".php")) {
    include ("docs/".$gohere.".php");
} else {
    include "docs/error-404.php";
}
?>

dokumenty je dobré ukládat do nějaké podsložky, ne na stejnou úroveň, jako máš index:
- do této složky dáš .htaccess s direktivou "deny from all", aby soubory nikdo nemohl zobrazit samostatně, ale jen skrz index
- jinak by někdo mohl vytěžovat server tím, že zavolá index.php?gohere=index, který by se pak pořád vkládal sám do sebe
Jinak ve variantě 2 používáš nesmyslně DOCUMENT_ROOT. Když si web pustíš na localhostu třeba ve složce /mujprvniweb, documentroot bude o úroveň výš, než chceš. jinak "./" není potřeba na začátku cesty uvádět.
JimmyHD
Profil *
AM_

supr, diky!

Jen uz bokem maly dotaz proc nemusim uvadet "./" (nekde jsem videl ze to je pry ochrana...

A jeste, odstrani mi preg_replace i "-" a "_" ? pouzivam je mezi slovy napr. hlavni_stranka
JimmyHD
Profil *
btw mozna nebudu includovat obsah, proto zustavam v rootu a nejdu do slozky kde je zakazany pristup. budu mit stranky jednotlive. includovat se bude treba jen menu atd (co bude na vice strankach spolecne) ... kvuli SEO aby mi vyhledavace pak indexovaly odkazy napr:

www.mojedomena.cz/prvni_stranka.html

www.mojedomena.cz/dalsi_stranka.html

www.mojedomena.cz/uplne_jina_stranka.html
JimmyHD
Profil *
kazdy html soubor se bude mimo obsahu (napevno) skladat z includu (header,menu,footer....) ... tak to mam v umyslu
AM_
Profil
vetsinou se to resi tak ze vsechny veci jako /prvni_stranka.html se prepisuji na index.php?text=prvni_stranka pomoci .htaccess pokud to chces mit seo... a spis nez ze mas tisic souboru ktere vkladaji jedno menu se to dela tak ze mas index ktery je pro vsechny stranky jednotny (tzv. master page) a do nejake jeho casti se includuje obsah aktualni sekce.
do preg_replace si muzes pridat _ a - takle: [^a-z0-9_\\-] a porad to bude dost bezpecne.
./ muze byt ochrana proti tomu, aby ti nekdo na zacatek adresy souboru nehodil protokol (http://) a tim inkludoval naky svuj skript ze sveho webu, ale tuhle moznost preg_replace vylucuje, protoze znaky : a / vyhazi, takze ten hack nebude fungovat.
AM_
Profil
Pokud to chces delat tak, jak rikas, tak tam ty include davej napevno :) to pak nema smysl je tlacit pres promennou, na include('obsah.php') se stejne nic nezmeni zejo... ale takhle se to nedela, az se jednou rozhodnes, ze chces pridat do vsech stranek pravy sloupec, s mym resenim ho pridas jen do indexu, s tim tvym budes muset opravovat vsechny soubory
JimmyHD
Profil *
ad tisic souboru: neni to jedno, mit tisic inc souboru a jeden index, nebo tisic html a par inc ? :) ja tomu prepisu adres pres htaccess moc neverim :)

ad ostatni: diky!
AM_
Profil
Neni to jedno :) jak sem vysvetloval, rozhodnes se zmenit neco v celkovym vzhledu (treba pridat ten pravej sloupec) a ses v pytli. Profici to delaji tak jak pisu, ma to i dalsi opodstatneni... htaccessu a mod_rewrite muzes plne verit, kazdy dobry hosting ho podporuje. Nekdy akorat stoji trochu usili dobre ty pravidla pro rewrite napsat, aby ti to apache spolknul, ale ne zas tolik prace aby to nestalo za vysledek. Jasne, pokud delas nakou malou osobni stranku, je prakticky jedno, co a jak udelas, hlavni je, ze to nak funguje. Ale kdyz to s programovanim a webarinou myslis vazne, je lepsi se to rovnou ucit dobre ;)
JimmyHD
Profil *
AM_

ja v tom mem reseni prave vydim hlavne vyhodu ze kdyz si pak budu editovat obsah tak otevru danou stranku v DW a uvidim rovnou jak se mi vsechno zformatuje (CSS)..

lze u tveho reseni webmasteru :) nejak editovat obsah (includy) tak abych rovnou videl jak to bude vypadat v prohlizeci?
JimmyHD
Profil *
jde i o to ze mam fakt par stranek, do budoucna max nekolik desitek, ale jde o to ze se budou lisit i usporadanim a nektere budou vypadat uplne jinak :-P
AM_
Profil
no neni tak slozity zeditovat obsah, ulozit a otevrit (nebo refreshnout) to v prohlizeci :)
JimmyHD
Profil *
a je to moje reseni vylozene spatne? nebo neprofesionalni? ..

.. je to muj styl O:-)
nightfish
Profil
if (file_exists("docs/".$gohere.".php")) {
v tomto případě se bude soubor hledat v celé include_path, což je zoufale hloupé, když chceš projít jenom ./docs/...

jinak "./" není potřeba na začátku cesty uvádět.
a tak bych rád doporučil uživateli AM_, aby se nevyjadřoval o věcech, kterým nerozumí
AM_
Profil
nightfish
aha, teď jsem díky tobě zjistil, že vlastně všechno co sem kdy napsal nefunguje, že mi na začátku všech cest chybí ./ ... předtím to pořád vypadalo že to funguje :-D prosímtě co to tu meleš...
AM_
Profil
co se týče include_path tak pokud s ní pracuješ a máš tam mraky složek tak jo... máš pravdu, souvislost s include_path mi unikla, ale 1) pochybuju, že JimmyHD include_path používá 2) běž si mastit ego na někom jiném, stane se, že i profesionál dá jen 99% radu, možná ty na to máš 3 vysoký ale s tim se vytahuj na někoho jinýho a ne na lidi co se snažej někomu pomoct, hlavněže tys celý ten problém co se tu řešil JimmyHDmu objasnil.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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