Autor Zpráva
vaclav
Profil *
byl mi zablokován učet z důvodu rozesílání spamu, který odcházel z našeho webu. Jediný skript je ve stránce index.php a to


<? if (!$_GET['url']) $_GET['url']='stranka.php'; ?>

a

<? require($_GET['url']); ?>


je toto neuvážená expanze promennych jak mi bylo řečeno od admina?
a jak mám pochopit spolupráci s těmi, u kterých jsem na placeném hostingu?
psal jsem radu a bylo mi odpovězeno -
budeme s kolegy jeste resit, jestli jeji odblokovani vubec povolime
tiso
Profil
Tento skript s neošetrenou premennou dovoľuje pri vhodne benevolentnej konfigurácii servera každému vykonať jeho skript...
vaclav
Profil *
a můžete mi poradit jak by vypadal s ošetřetřenou proměnnou?? diky
tiso
Profil
-zakážeš vkladanie externej url
-porovnávaš zadanú url so zoznamom povolených url (pole, databáza)
Nehovoriac o tom že chýba kontrola na existenciu vkladaného súboru
mila
Profil
Když o tom zapřemýšlíš, tak do url může dát uživatel cokoli, a ten soubor se tak bude includovat. A pokud přídá nějaká ta lomítka, tak se dostane všude na serveru, kam skript...
vaclav
Profil *
dobře, a jak tedy na stránkování?
Stačí pro začátek stránkování na linuxsoftu.cz??

výsledek je tady příklad

je to bezpečné stránkování? jde mi o jednoduchý univerzální kod, kterým bych ovládal strukturu webu nikdo se mi tam už nenaboural, diky
tiso
Profil
To je celkom dobré riešenie... Nikto Ti z vonku nepodsunie súbor (vďaka ./ na začiatku) ale umožňuje útočníkovi chodiť po adresárovej štruktúre (zadaním page=../nejaka-stranka). Pokiaľ povolíš php súbory, tak Ti spustí skript ktorého bude vedieť adresu. Stačí tam mať skript na upload a už si robí čo chce...
Joker
Profil
vaclav
Neprůstřelná varianta by byla mít někde (třeba v databázi) uložený seznam alias-soubor a podle aliasu vkládat příslušný soubor.

Jinak ale myslím, že ta aktuální varianta by už byla dostačující.
Hooonza
Profil *
Stačí k ošetření vstupu htmlentities (..., ENT_QUOTES)?
krteczek
Profil
nejlepší je (pokud se jedná o scripty s php) řešení kdy se názvy proměnnách uloží do pole a k nim se přiřadí cesta...

if(!empty($_GET['akcia']))

{

$str = array ( 'login-db' => './funkce/registracia/vytvor-login-do-db.php',
'registracia-zalozena' => "./funkce/registracia/registracia-zalozena.php",
'registracia-dokoncena' => "./funkce/registracia/registracia-dokoncena.php",
'registracia' => "./funkce/registracia/registracia.php",
'vytvor-tabulky' => "./funkce/registracia/vytvor-nazvy-tabulek.php"
);
if(array_key_exists($_GET['akcia'], $str) === true)

{

if(file_exists($str[$_GET['akcia']]))

{

require_once($str[$_GET['akcia']]);

if(function_exists("stranka"))
{
$s = stranka();
}
else
{
$s = stranka_neni();
}

}

else

{

$s = stranka_neni();

}

}

else

{

$s = stranka_neni();

}

return $s;
}

jen dodám, že toto je výtah jen části mé funkce ukaz_clanek(); která vrací pole $s ($s['nazev'], $s['clanek'], ...), a každý volaný soubor obsahuje funkci stranka() která toto pole vrací..
takže použití vypadá takto:

<?php
//soubor index.php, na začátku jsou includy všech nutných souborů, a potom volání funkce ukaz_clanek();
$stranka = ukaz_clanek();

?>
<html><head>
<title><?php echo $stranka['nazev'];?></title></head>
<body>
<?php
if(!empty($stranka['nazev']))
{
echo '<h1>' . $stranka['nazev'] . '</h1>';
}
if(!empty($stranka['clanek']))
{
echo $stranka['clanek'];
}
?>
</body>
</html>

předesílám že je to výrazně zkráceno
krteczek
novice vaclav
Profil *
tiso - To je celkom dobré riešenie...

pomůžete mi využít tohoto příkladu a i s ...zakážeš vkladanie externej url
-porovnávaš zadanú url so zoznamom povolených url (pole, databáza)


zadaná cesta mi připadá taky jako ideální řešení, ale v příkladu se nějak nevyznám
tiso
Profil
novice vaclav
1. zakážeš vkladanie externej url
Ako som písal: vďaka ./ na začiatku vkladanej adresy (if (is_file("./".$mujclanek.".htm")):) to už máš obmedzené
2. porovnávaš zadanú url so zoznamom povolených url (pole, databáza)
Vytvoríš si asociativne pole so zoznamom stránok:
$stranky=array("uvod" => "uvod.php", "kontakt" => "kontakt.php", "webdesign" => "webdesign.php")

a potom kontroluješ $_GET premennú:
if(isset($stranky[$_GET["clanek"]])){include ($stranky[$_GET["clanek"]]);}

else{die("stranka neexistuje");//alebo nieco ine}
krteczek
Profil
novice vaclav: Prostě je seznam volaných skriptů, ten uložíš do pole tak, že klíč bude to co posíláš v $_GET['url']
mějme názvy stránek v parametru (příklad):

uvod
o-nas
kniha-navstev
...

tyto názvy uložíš do pole (array()), a každému přidáš adresu na které se nachází (
$stranky = array(
"uvod" => "./scripty/uvod.inc.php",
"o-nas" => "./nekde/onas.inc.php",
"kniha-navstev" => "./gb/kniha.inc.php"
);
[/pre]
takže máš pole $stranky a v něm jako klíče to co očekáváš ze $_GET['url']
teď v tom poli hledáš klíč shodný se $_GET['url']

if(array_key_exists($_GET['url'], $stranky) === true)
{
//klíč nalezen
if(file_exists($stranky[$_GET['url']]))
{
require_once($stranky[$_GET['url']]);
//tady už si obsah zpracuj podle sebe
}
else
{
echo 'požadovaný soubor neexistuje';
}
}
else
{
echo 'požadovaný soubor neexistuje';
}

toto je bezpečný, ovšem trošku pracnější přístup k souborům :-)

Aby mi nemohl nikdo vykonat skripty voláním konkrétního souboru jsou téměř ve všech souborech funkce (příklad):

<?php
function stranka()
{
$s['nazev'] = 'nazev stranky';
$s['clanek'] = '<p>nějaký obsah</p>';
$s['clanek'] .= '<h2>nadpis</h2><p>ks textu</p>';
if($neco == 'neco jineho')
{
//nějaké zpracování
}
return $s;
}
?>

navíc se snažím všechny proměnné před použitím iniciovat:

$a = "";
if((!empty($_GET['a'])) && (trim($_GET['a']) != ""))
{
$a = $_GET['a'];
}

takže ni na hostingu se zaplými register_globals by nemělo docházet k problémům
krteczek
Toto téma je uzamčeno. Odpověď nelze zaslat.

0