Autor Zpráva
Leopik 2x
Profil
Prave som cital jeden clanok s include a dost ma vystrasil. Bol o include a nieco ze sa da dostat do systemu a citat si zdrojove kody. A preto sa pytam ci je bezpecne mat takuto strukturu:

<?php
$page = $_GET['page'];

if ($page == "daco") {include "../daco.php";}
if ($page == "nieco") {include "../nieco.php";}
...
?>

Je to bezpecne? Mozem si posielat v $_GET['page'] uz ronvo nazov suboru (ktory je ale v inej zlozke) alebo to mam posielat napr:
<?php
$page = $_GET['page'];

if ($page == "daco") {include "../ggg.php";}
if ($page == "nieco") {include "../hhh.php";}
...
?>
Matty
Profil
Leopik 2x
Máš to bezpečně, neboj ;-).
Mozem si posielat v $_GET['page'] uz ronvo nazov suboru (ktory je ale v inej zlozke)
Pokud by soubor byl v nějaké složce (příklad include('slozka/'.$_GET['page']);), tak by to vadit nemělo. Pokud bys ale includoval přímo $_GET['page'], tak ti může někdo udělat PHP injection.
Leopik 2x
Profil
Uf... Tak to je dobre pretoze kazdy subor sa nachadza o uroven nizsie (../). Takze mozem pouzivat to prve? (pre istotu :))
EDIT: A netreba tam dat funkciu file_exists()?
EDIT2: Ja to robim takto: Mam stranku include php v http://www.example.com/slozka/include.php
Do include .php vkladam main.php pomocou include (je to automaticke):
<?php
include "main.php";
?>

a v main.php uz mam tu strukturu ktoru som pisal (tu hornu). Aj to moze byt?
Matty
Profil
Leopik 2x
Zde funkce file_exists() není zapotřebí, protože ty sám ovlivňuješ, kdy se jaký soubor bude includovat.
Leopik 2x
Profil
OK teda takto to je vzdy funkcne a iste. No a este to co som pisal v EDIT2:
EDIT2: Ja to robim takto: Mam stranku include php v http://www.example.com/slozka/include.php
Do include .php vkladam main.php pomocou include (je to automaticke):

<?php
include "main.php";
?>


a v main.php uz mam tu strukturu ktoru som pisal (tu hornu). Aj to moze byt?
Ked uz mi aj toto potvrdite, budem uz spokojny a dam vam uz pokoj :)
Matty
Profil
Leopik 2x
ad edit2: bezpečné. Uživatel nijak nemůže ovlivnit, který soubor includovat, takže můžete být úplně v klidu :-)
Taps
Profil
Matty
hledně aby si uživatel nanaincludoval např stránky www.seznam.cz :-)
srigi
Profil
Leopik 2x
Máš to bezpečně, neboj ;-).

Bohuzial to nie je pravda! Navstevnik moze odhadnut URL k suborom ../ggg.php a spustit ich tak mimo kontext index.php, co casto vedie k fatalnym nasledkom. Naprava je vsak tirvialna
index.php
<?php
define('SECURITY', 'sd87f68sd9');
...
...
...
$page = $_GET['page'];

if ($page == "daco") {include "../daco.php";}
if ($page == "nieco") {include "../nieco.php";}
?>

daco.php
<?php
if (!defined('SECURITY') || SECURITY != 'sd87f68sd9') {
  die("die in hell kiddie");
}
...
...
...
Princip je teda taky, ze v index.php definujes tajnu konstantu a v includovanom subore overis ci je tato konstnta definovana a ma spravnu hodnotu. Ked sa includovany subor spusti mimo kontext index.php, nie je splnena ani jedna podmienka a vykonavanie skriptu skonci nepeknou hlaskou :D
Matty
Profil
srigi
URL k suborom ../ggg.php a spustit ich tak mimo kontext index.php, co casto vedie k fatalnym nasledkom.
Můžeš mi říct, co se může stát, když návštěvník spustí soubor rovnou a né přes include? Leda tak mu nebude fungovat, ale určitě to web neohrozí.
srigi
Profil
No ak je index.php rozsiahlejsi, tak okrem rozhodenia layoutu moze dojst k nejakej chybovej hlaske, ktora moze odhalit kompromitujuce detaily. Kazdopadne ta mnou navrhnuta ochrana je tak trivialna, ze by som ju pouzival defaultne.
bukaj
Profil
srigi
Pokud bych se už tak bál, aby si ty skripty někdo nespustil samostatně, bez jejich vložení do indexu, lepší by bylo je hodit mimo root webu, nebo do nějaké složky se zakázaným přístupem zvenčí. Podle mě jednodušší a čistší.
Leopik 2x
Profil
No takze prerobil som to podla srgiho:
<?php
define('SECURITY', 'tajny_kod');
$page = $_GET['page'];

if ($page == "daco") {include "../security/daco.php";}
if ($page == "nieco") {include "../security/nieco.php";}
?>

a s daco.php vyzera takto:
<?php
if (!defined('SECURITY') || SECURITY != 'tajny_kod') {
  die("die in hell kiddie");
}
// pokracuju ine php veci...
?>
A dalsi HTML text

Takze: Vzdy sa overuje pomocou define to SECURITY, subory su teraz v zlozke security kde je .htaccess a obsah ma deny from all (teda vsetci maju zakazane ist do tej zlozky). Takze uz to je bezpecne?
ShiraNai7
Profil
A co třeba takto jednoduše?

include('../'.basename($_GET['page']).'.php');
Leopik 2x
Profil
Ani nie pretoze ja to mam spravene tak:

if ($page == "nieco") {
include "../security/nieco.php";
// + ine scripty...
}

No ale prosim, mohol by si mi potvrdit (alebo niekto iny) ci ten moj minuly prispevok je uz bezpecny?
Matty
Profil
Leopik 2x
ci ten moj minuly prispevok je uz bezpecny?
Je bezpečný, ale stejně tvrdím, že by byl dostačující i bez define().
srigi
tak okrem rozhodenia layoutu
S tím musí uživatel počítat, když leze, kam nemá.
moze dojst k nejakej chybovej hlaske, ktora moze odhalit kompromitujuce detaily
Nemyslím si.
Navstevnik moze odhadnut URL k suborom ../ggg.php
Dosti nepravděpodobné.
Leopik 2x
Profil
A teraz ma napadlo ze ak dam tie subory do ../security/daco.php je to na rovnakej urovni ako ten subor, do ktoreho sa to bude includovat takze to nevadi? Inac ta zlozka /security/ ma subor .htaccess kde je deny from all. Ale myslim ze uz by sa to nemalo niak dat dostat. Takze dakujem vam vsetkym za tieto "vychytavky".

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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