Autor Zpráva
lexlutor
Profil *
<?php
$filename = "/knihy/".$_GET["page" ]. ".html";
if (File_Exists ($filename)):
include("$filename");
else:
include("uvod.php");
endif;
?>
Prečo je nebezpečný tento kód a ako ho ošetriť aby nebezpečný nebol.
Ďakujem
WertriK
Profil *
Zas tak moz nebezpecny neni ( rozhodne bezpecnejsi nez muj :) ), dela se to (doufam) pres switch :

switch($page):
case "kniha":
$filename = "book/book.php";
break;
case "novinky":
$filename = "news.php";
break;
default:
$filename = "news.php";
endswitch;

Nebo jeste pres RewriteMod, to je slozitejsi .....
splite
Profil
Nebezpecný díky tomu .".html" není - takhle se dají vypsat pouze soubory ve formě .html a v nich asi žádné citlivé údaje nebudou.

Problém by byl pokud by jsi měl script:

if (File_Exists ($_GET["page"])):
include($_GET["page"]);
else:
include("uvod.php");
endif;

a jako url třeba

index.php?page=/knihy/kniha1.html


protože pak by si mohl bandita manipulací s url nechat vypsat cokoliv v dosahu php. Tradičně se jako příklad dává soubor s hesly v Linuxu

index.php?page=/dev/passwd
index.php?page=/etc/passwd
index.php?page=/bin/passwd
index.php?page=/usr/passwd

a nebo prostě hesla v .htaccess

index.php?page=.htpasswds

spoustu věcí se dá zabránit vhodným nastavením php potažmo apache, ale někde jsou amatéři admini a takovýto útok se dá lehce provést.
krteczek
Profil
navíc není dobré nekonečné zanoření indexu page=index || page=index.php podle toho jak je řešen skript, jestli se předává celý název stránky
Takže taková konstrukce:

$page=$_GET['page'].'.php';
include($page);

opravdu není bezpečná!

Bezpečnější je:

if($_GET['page']!='index')
{
$page="./".$_GET['page'].".php";
include($page);
}

1. podmínka vylouří zanoření indexu (předpokládá se že stránky je index.php)

2. ./ znamená že se to vstahuje k tomuto adresáři, nemělo by dojít k vypsání výše zmíněných hesel (splite). Do zanořeného adresáře se dostanete $page="./cesta/k/souboru/".$_GET['page'].".php";

3. sám volím kombinaci switch + ./ navíc na includovaných stránkách je vždycky funkce, kterou volám po include
takže jeden ten case vypadá nějak takhle:

case "pridej-komentar";
include("./akce/forum/pridej-komentar.php"); //načtení stránky na které je funkce pridej_komentar()
$r=pridej_komentar();// výsledek funkce je odevzdán do proměnné, je to pole s minimálně dvěma hodnotami: $r['nazev'] a $r['clanek'] které se na výsledné stránce předají a vrámci podmínek zobrazí
break;


krteczek
Toto téma je uzamčeno. Odpověď nelze zaslat.

0