Обязательно к прочтению: http://php.ru/manual/security.filesystem.html лучшее решение основано на регулярном выражении.
Код (PHP): /** * Check that path realy is inside that folder, and return path if yes, and FALSE if not. * @param String $path Path to check * @param String $folderPath Path to folder, where $path have to be in * @return Mixed False on fail, or $path on success */ function checkPathIsInFolder($path, $folderPath) { if (!$path OR !$folderPath) { return false; } $folderRealpath = realpath($folderPath); $pathRealath = realpath($path); if ($pathRealath === false OR $folderRealpath === false) { return false; } $folderRealpath = rtrim($folderRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; if (substr(rtrim($pathRealath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR, 0, strlen($folderRealpath)) !== $folderRealpath) { return false; } return $path; } } Добавлено спустя 23 секунды: попробовал вот так
я еще код не проанализировал, но у меня есть другое замечание. ИМХО, $folderPath вполне имеет право быть пустым. Пустая директория означает текущую (открытую, которую можно сменить функцией chdir()) директорию. Так её воспринимают файловые функции и realpath().
http://php.ru/manual/splfileinfo.getrealpath.html#refsect1- ... h-examples ето я думаю лучше чем такая функтцыя
просто я думал, што пхп не просто так SplFileInfo добавил, штоб мы не мучялись с папками у функции а получяли обекты Добавлено спустя 4 минуты 3 секунды: фила нету Код (Text): <?php $info = new SplFileInfo("C://tmp"); var_dump($info->getRealPath()); //false; $info = new SplFileInfo("C://xampp//htdocs//test//00//test.txt"); var_dump($info->getRealPath()); //string 'C:\xampp\htdocs\test\00\test.txt' (length=32) $info = new SplFileInfo("C://xampp//htdocs//test//0//test2.txt"); var_dump($info->getRealPath()); //string 'C:\xampp\htdocs\test\0\test2.txt' (length=32) Добавлено спустя 10 минут 16 секунд: Код (Text): $info = new SplFileInfo("C://xampp//htdocs//test//00//test.txt"); var_dump($info->getRealPath()); //string 'C:\xampp\htdocs\test\00\test.txt' (length=32) $info = new SplFileInfo("C://xampp//htdocs//test//0//..//00//test.txt"); var_dump($info->getRealPath()); //string 'C:\xampp\htdocs\test\00\test.txt' (length=32) я думаю тепер я понял в чем проблема
Игорь, последняя версия у меня не пропускает ничего. Путь на винте был создан. Вродь работает. Подкинь неработающую конструкцию.
не понял. всё подряд фейлит? у меня работает, я доволенчег. фишка была в том, чтобы не просто побайтово сверить, как ты говорил, а убедиться что сверяешь правильные пути. иначе /a/ и /aa/b прокатывало, а это беда.