Я ищу функцию php, которая санирует строку и сделает готовым использовать для имени файла. Кто-либо знает об удобном?
(Я мог записать один, но я волнуюсь, что пропущу символ!)
Править: для того, чтобы сохранить файлы в файловой системе Windows NTFS.
Вместо того, чтобы беспокоиться о пропущенных символах - как насчет использования белого списка символов, которые вы будете рады использовать? Например, вы могли бы разрешить только хороший старый a-z
, 0-9
, _
, и единственный экземпляр периода (.
). Очевидно, что это больше ограничивает, чем большинство файловых систем, но это должно вас обезопасить.
preg_replace("[^\w\s\d\.\-_~,;:\[\]\(\]]", '', $file)
Добавление/удаление большего количества допустимых символов в зависимости от того, что разрешено для вашей системы.
Или же вы можете попробовать создать файл, а затем вернуть ошибку, если она плохая.
.Внесение небольших изменений в решение Tor Valamo для исправления проблемы, замеченной Домиником Роджером, вы могли бы использовать:
// Remove anything which isn't a word, whitespace, number
// or any of the following caracters -_~,;[]().
// If you don't need to handle multi-byte characters
// you can use preg_replace rather than mb_ereg_replace
// Thanks @Łukasz Rysiak!
$file = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $file);
// Remove any runs of periods (thanks falstro!)
$file = mb_ereg_replace("([\.]{2,})", '', $file);
Следующее выражение создает красивую, чистую и удобную для использования строку:
/[^a-z0-9\._-]+/gi
Превращение в финансовый: биллинг в финансовый: биллинг
/
и ...
в имени файла, предоставленного пользователем, может быть опасным. Поэтому от них нужно избавиться чем-то вроде:
$fname = str_replace('..', '', $fname);
$fname = str_replace('/', '', $fname);
Ну, tempnam() сделает это за тебя.
http://us2.php.net/manual/en/function.tempnam.php
но это создает совершенно новое имя.
Чтобы дезинфицировать существующую строку, просто ограничьте то, что могут ввести ваши пользователи, и сделайте это буквами, числами, периодом, дефисом и подчеркиванием, а затем дезинфицируйте с помощью простого регекса. Проверьте, какие символы должны быть экранированы, иначе вы можете получить ложное срабатывание.
$sanitized = preg_replace('/[^a-zA-Z0-9\-\._]/','', $filename);
Один из способов
$bad='/[\/:*?"<>|]/';
$string = 'fi?le*';
function sanitize($str,$pat)
{
return preg_replace($pat,"",$str);
}
echo sanitize($string,$bad);