"Незаконное" блуждание по папкам

Gluk

Новичок
"Незаконное" блуждание по папкам

В скрипте файл менеджера использую ссылки типа:
?file=name.txt
а если написать ?file=C:\other.txt, то без проблем можно прочитать файл из другой папки...

как от этого защититься?
как я понимаю, надо убирать из переменной $file двоеточие ( : ), слеш ( / )...

если кто знает, дополните меня пожалуйста...
 

Demiurg

Guest
а не надо так делать
надо ссылки делать типа: ?file=news

а в скрипте:
$modules = array (
'news' => 'news.php' ,
'articles' => 'articles.php' ,
....
);

if(isset($_GET['file']) && isset($modules[$_GET['file']]))
{
include $modules[$_GET['file']];
}
else
{
// error
}
 

Фанат

oncle terrible
Команда форума
у него браузер, по ходу.
человек пишет свой ремвью :)
 

Alien

Новичок
Gluk

Я когда то писал похожий велосипед.
Бери кусок кода оттуда (комментарии специально для тебя написал).

PHP:
// ниже этой папки доступа нет.
DEFINE('PME_FOLDER_ROOT', '/home/www/htdocs/');

$V['dir'] = "images/banners/444/333.gif";
// $V['dir'] - в этой переменной путь к папке или файлу. 
// получили из $HTTP_GET_VARS к примеру

if (preg_match("/\.\.\//", $V['dir'])) {
        // запрет перехода на уровень ниже
	$V['dir'] = '';
	};

if (is_dir(PME_FOLDER_ROOT.$V['dir'])) {
// есть такая папка.
// ok, обрабатываем...
}
elseif (is_file(PME_FOLDER_ROOT.$V['dir'])) {
// есть такой файл.
// ok, обрабатываем...
}
else {
// ooops! h4cker
};
 

Demiurg

Guest
Alien
это все к чему ? эмулирование safe_mode средствами php ?
 

Ferr

Guest
Ещё можно так:

/?=text.txt

$fname= "./$file";
include($fname);

Будет означать, что text.txt находится в той папке, где и скрипт.
 

SashOk

Guest
Ferr
неможно так. что будет, если написать /?=../../otherfile.txt
нужно делать так, как сказазал Demiurg
 

fixxxer

К.О.
Партнер клуба
Как вариант:
PHP:
$allowed = array('news','articles','questions','contacts');
// ...
if (in_array($_GET['file'],$allowed) include ($_GET['file'].'.txt');
 

Ferr

Guest
Автор оригинала: SashOk
Ferr
неможно так. что будет, если написать /?=../../otherfile.txt
нужно делать так, как сказазал Demiurg
Читайте главный пост, там идёт речь про C:/xx/xx.x
Так вот ./ полностью решает проблему C:/xx
Да и вообще в пхп очень часто стоит защита от иклудов файлов, находящихся в другой папке.
А способ описанный Demiurg - я полностью с ним согласен, но бывают случаи, когда проще его не делать, а защититься от инклуда лишних файлов, стоящих выше, чем скрипт так: ./

Например: http://example.com/print/files/echo.php
в директории /files/ находится сотня-другая текстовых файлов, которая динамично пополняется, при этом других файлов кроме echo.php там нет и поддиректорий тоже.
Тогда какой смысл делать ассоциации по методу, описанному Demiurg ? Тогда при каждом добавлении нового файла нужно будет добавлять значения в массив. А то просто куда надо ставим ссылку http://example.com/print/files/echo.php?file=text.dat и так далее...
$fname= './'.$file защищает вполне достаточно.

Надеюсь, что донёс, что хотел, в весма понятной Всем форме.
:) :) Если не прав - поправьте...
 

Ferr

Guest
Выше не залезть.
./ означает, что файл наравне со скриптом и далее ../../ не действуют, хотя могу ошибаться.
Проверить не имею возможности - у меня include из других папок disabled.
 

SashOk

Guest
>> ./ означает, что файл наравне со скриптом и далее ../../ не действуют, хотя могу ошибаться.
ошибаешся. "./" означает текущюю директорию. И всё.
Например: http://example.com/print/files/echo.php
в директории /files/ находится сотня-другая текстовых файлов, которая динамично пополняется, при этом других файлов кроме echo.php там нет и поддиректорий тоже.
В таком случае разумно из $_GET['file'] удалить все слеши.
 

NOT NULL

Guest
я вот что придумал... Незнаю насколько это корректно, да кстати, скажите, если так правильно делать:
PHP:
if($QUERY_STRING == "")
{
$address = "home.php";
}

if(isset($link))
{
$address = $link.".php";
}

include ($address);
тут если переменная addres появляется, то инклудится файл,
например если ?link=home, то инклудится home.php и так далие, именна переменных совподают с частью имени файла, а файлы можно, чтоб без родительского файла не открывали, можно так защитить.
В index.php добавить такую строчьку :
PHP:
 define("logged","");
,
а файле инклудящамся написать
PHP:
if(!isset($logged))
{
die("You cannot acses this file");
}
 

fixxxer

К.О.
Партнер клуба
Прежде чем постить, надо хотя бы подумать. А лучше - проверить.
 

Altex

Новичок
Автор оригинала: Ferr
Ещё можно так:

/?=text.txt

$fname= "./$file";
include($fname);

Будет означать, что text.txt находится в той папке, где и скрипт.
человек имел ввиду

/?=text.txt

$fname= "./".realpath($file);
include($fname);


%))
 
Сверху