|
|
|
| Здравствуйте!
Возникла необходимость дать пользователю возможность
переименовывать некоторые файлы на сервере.
Нужно проверить допустимость вводимого пользователем имени,
а именно, исключить возможность имени: "../../somedir/some.file", кроме того,
исключить наличие символов \/:*?"<>|
Лучше всего, как мне кажется, использовать регулярное выражение.
Что-то вроде:
<?
//Список недопустимых символов
$regex='[чёрный список символов]';
//Если имя файла плохое - стоп и ругаемся
if (preg_match($regex,$newname)){die('Недопустимое имя файла!');}
//Заменяем пробелы на подчёркивания
$newname=str_replace(' ','_',trim($newname));
//Переименовываем, сообщаем результат.
if (@rename($path.$oldname, $path.$newname)){echo"Файл переименован успешно.";}
else{echo"Не удалось переименовать.";}
?>
|
Проблема с [чёрным списком символов]. Ведь большинство этих символов являются
спецсимволами PCRE. При экранировке вручную запутался. Чегой-то голова в третьем
часу ночи не варит...
Также пытался использовать
<?
$regex=preg_quote ('\/:*?"<>|', "/");
//и
$regex=preg_quote ('\\/:*?"<>|', "/");
?>
|
Не работает.
Как правильно написать рег. выражение для отлова \/:*?"<>| ?
Спасибо. | |
|
|
|
|
|
|
|
для: lokispb
(27.01.2006 в 02:21)
| | А вы зря, кстати, preg_quote() используете, лучше от греха все запрещённые символы удаляйте
<?
//Список недопустимых символов
$regex='#[\\/:\*\?"<>\|]#';
//Если имя файла плохое - стоп и ругаемся
if (preg_match($regex,$newname)){die('Недопустимое имя файла!');}
//Заменяем пробелы на подчёркивания
$newname=str_replace(' ','_',trim($newname));
//Переименовываем, сообщаем результат.
if (@rename($path.$oldname, $path.$newname)){echo"Файл переименован успешно.";}
else{echo"Не удалось переименовать.";}
?>
|
preg_quote() лучше не использовать, а если использовать, то так
<?
$newname = preg_quote($newname, "\\/:*?"|");
?>
|
| |
|
|
|