> >> Something like the following would be much better (untested)...
> >>
> >> $page = realpath(dirname(__FILE__).'/inc/'.$_GET['page'].'.php');
> >> $expecteddir = realpath(dirname(__FILE__).'/inc');
> >> if (substr($page, 0, strlen($expecteddir)) != $expecteddir)
> >> {
> >> // Ideally return a 403 status here
> >> die('Access denied');
> >> }
> >> // Now we know it's a file in the right directory
> >> if (file_exists($page))
> >> {
> >> include($page);
> >> }
> >> else
> >> {
> >> // Return a 404 status here
> >> die('Resource not found');
> >> }
> >>
> >> That should lock the requested page to the given directory. If anyone
> >> can see any way around that I'd be interested in hearing about it.
> >>
> >> -Stut
> >>
> >> --
> >> http://stut.net/
> >
> > Good points about (.php, evil-payload, and evil-payload.php?).
> >
> > Although I'll defer to a security expert, your modification looks good to
> > not include a remote site's code.
> > But on a shared host, what about this?:
> > index.php?page=../../../../../../../../../../../../home/evil-user-home-dir/evil-payload.php
> >
> > If that gives something like:
> > $expecteddir ===
> > "/home/stut/phpstuff/inc/../../../../../../../../../../../../home/evil-user-home-dir/evil-payload.php"
> > maybe it will include "/home/evil-user-home-dir/evil-payload.php"
> >
>
> No, you've missed the point. $expecteddir is a fixed variable that you,
> the script author, specify. It does not contain anything coming from
> external veriables. You then compare the full path you build from the
> external variables to $expecteddir to verify that the file is in the
> right directory.
>
> I suggest you read the code I posted again.
>
> -Stut
I meant if $page evaluates to
"/home/stut/phpstuff/inc/../../../../../../../../../../../../home/evil-user-home-dir/evil-payload.php"
which it does not.
However I don't think your if (substr($page, 0, strlen($expecteddir)) !=
$expecteddir)
ever evaluates to TRUE. So you'll never get Access denied.
So how you set $page saved your ass. Good job.
_________________________________________________________________
Help yourself to FREE treats served up daily at the Messenger Café. Stop by
today.
http://www.cafemessenger.com/info/info_sweetstuff2.html?ocid=TXT_TAGLM_OctWLtagline