|
автор: ботродье (03.04.2008 в 18:16) |
|
| вобщем есть путь покарявленый типа:
$path = "dir0/..//.images/..//\/.dir../\/files\dir2/.\/\\/..\/qwerty/.";
|
в ряльной жизни канешно же такого возникнуть не может)) но все же..
надо его исправить на такой :
$path2 = "dir0/../.images/../.dir../files/dir2/./../qwerty/.";
|
для этого я воспользовался таким способом:
$path2 = preg_replace("/\\\+/s","/",$path);
$path2 = preg_replace("/\\/+/s","/",$path);
|
тут сразу вопрос: как это можно сделать поэлегантней?..
дело в том что для обхода структур типа: "\/\/\///\\\//\/\\//\/\/" пришлось разбить на две строки...
а вот как убирать точки ума не приложу..
т.е. их нужно не просто убрать а соблюсти правилинсть пути.. | |
|
|
|
|
автор: ./\. (03.04.2008 в 23:52) |
|
|
для: ботродье
(03.04.2008 в 18:16)
| | какой интересно правильный путь понимается под "dir0 /../.images/../.dir. ./files/dir2/./../q werty/." ?
/files/qwerty/ ? | |
|
|
|
|
автор: ботродье (04.04.2008 в 07:20) |
|
|
для: ./\.
(03.04.2008 в 23:52)
| | да | |
|
|
|
|
автор: _ _ (04.04.2008 в 21:54) |
|
|
для: ботродье
(04.04.2008 в 07:20)
| |
<?
$BASE = '/home/site/www/'; // DOCUMENT_ROOT
$addr = preg_split('#(?<=/)#', $BASE, -1, 1);
$str = '../RAZ\\\\../DVA/TRI/.\\FOR/5../6';
function xxx($match)
{
global $addr;
switch($match[1]) {
case '.': break;
case '..':
if (! array_pop($addr)) exit('превышены допустимые переходы вверх');
break;
default:
if (isset($match[2])) $addr[] = $match[1] .= '/';
else $addr[] = $match[1];
}
}
preg_replace_callback('#([^/\x5c]*)([/\x5c]+)?#', 'xxx', $str);
$addr &= $str = implode('', $addr);
print_r($str);
if (!ereg("^$BASE", $str)) exit('<hr> нет доступа');
?>
|
| |
|
|
|