On Tue, 17 Aug 2004 16:07:47 +0200, "Andreas Falck"
<fake@skrift.dk.invalid> wrote:
>> I det hele taget er det temmeligt usundt, sådan som du bare
>> include'r $body ukritisk. En ondsindet bruger kan jo rette den sti
>> til noget vilkårligt, og på den måde include sin egen kode (fra en
>> ekstern server) eller se vilkårlige filer på serveren.
>>
>> Du bør læse:
>>
http://www.php.net/manual/en/security.filesystem.php
>
>Var det muligt at få et oversættelseskoncentrat, da jeg heller ikke er
>særlig god til engelsk?
I forhold til dine links, fx:
http://ravsted.net/index.php?body=admin/opret1.php
... så stoler du på at body ikke indeholder andre stier end dem, du
selv har opgivet i links.
Men en ondsindet bruger har jo fuld mulighed for selv at bestemme,
hvad body skal være sat til. Så kunne han passende vælge en fil på det
system, udover dem, dine links lige præcis peger på, og således få
serveret filer fra dit system. Et uskyldigt eksempel kunne være:
http://ravsted.net/index.php?body=../../../../windows/wordpad.ini
Angriberen kan selvfølgelig prøve at gætte på nogle filer med mere
følsomt indhold.
Ydermere, idet include() også virker på URLs, så kan brugeren lægge
noget PHP-kode tilgængelig på sin egen webserver, og så få din server
til at afvikle det (og den vej igennem have mulighed for at køre
programmer på din maskine).
Et fredeligt eksempel på inkludering af ekstern indhold, hvor der ikke
bliver afviklet kode i din ende, er:
http://ravsted.net/index.php?body=http://www.google.dk/
Der findes forskellige modeller til at løse dette problem. Helt
grundlæggende kan det siges så enkelt, at man skal validere input -
altså ikke tage brugerinput for givet (og slet ikke når brugeren har
indflydelse på præcis hvilken fil, der inkluderes). Det kræver måske
et par linjer ekstra kode, men det er nødvendigt nok (og fornuftigt,
mht. lille indsats i forhold til stort udbytte).
Et hurtigt eksempel på dette kunne være, at body ikke refererede til
en specifik fil, men bare et symbolsk navn - fx:
<?php
$body = $_REQUEST['body'];
switch($body) {
case 'adminside':
$include = "admin/opret1.php";
break;
case 'nyheder':
$include = "nyheder.inc";
break;
default:
$include = "";
}
if ($include != "") {
include($include);
}
?>
... og så skal links blot rettes tilsvarende til, fx:
index.php?body=nyheder, index.php?body=adminside og så videre.
Her vil en ondsindet person ikke få noget ud af at gå ind på
index.php?body=et_eller_andet_uventet
--
- Peter Brodersen
php -r 'print floor(8.2-0.2);'
perl -le 'print 5-4.9;'