строковое дезинфицирующее средство для имени файла

Я ищу функцию php, которая санирует строку и сделает готовым использовать для имени файла. Кто-либо знает об удобном?

(Я мог записать один, но я волнуюсь, что пропущу символ!)

Править: для того, чтобы сохранить файлы в файловой системе Windows NTFS.

96
задан Gordon 7 January 2010 в 17:06
поделиться

7 ответов

Вместо того, чтобы беспокоиться о пропущенных символах - как насчет использования белого списка символов, которые вы будете рады использовать? Например, вы могли бы разрешить только хороший старый a-z, 0-9, _, и единственный экземпляр периода (.). Очевидно, что это больше ограничивает, чем большинство файловых систем, но это должно вас обезопасить.

.
35
ответ дан 24 November 2019 в 05:31
поделиться
preg_replace("[^\w\s\d\.\-_~,;:\[\]\(\]]", '', $file)

Добавление/удаление большего количества допустимых символов в зависимости от того, что разрешено для вашей системы.

Или же вы можете попробовать создать файл, а затем вернуть ошибку, если она плохая.

.
13
ответ дан 24 November 2019 в 05:31
поделиться

Внесение небольших изменений в решение 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);
149
ответ дан 24 November 2019 в 05:31
поделиться

Следующее выражение создает красивую, чистую и удобную для использования строку:

/[^a-z0-9\._-]+/gi

Превращение в финансовый: биллинг в финансовый: биллинг

6
ответ дан 24 November 2019 в 05:31
поделиться

/ и ... в имени файла, предоставленного пользователем, может быть опасным. Поэтому от них нужно избавиться чем-то вроде:

$fname = str_replace('..', '', $fname);
$fname = str_replace('/',  '', $fname);
0
ответ дан 24 November 2019 в 05:31
поделиться

Ну, tempnam() сделает это за тебя.

http://us2.php.net/manual/en/function.tempnam.php

но это создает совершенно новое имя.

Чтобы дезинфицировать существующую строку, просто ограничьте то, что могут ввести ваши пользователи, и сделайте это буквами, числами, периодом, дефисом и подчеркиванием, а затем дезинфицируйте с помощью простого регекса. Проверьте, какие символы должны быть экранированы, иначе вы можете получить ложное срабатывание.

$sanitized = preg_replace('/[^a-zA-Z0-9\-\._]/','', $filename);
13
ответ дан 24 November 2019 в 05:31
поделиться

Один из способов

$bad='/[\/:*?"<>|]/';
$string = 'fi?le*';

function sanitize($str,$pat)
{
    return preg_replace($pat,"",$str);

}
echo sanitize($string,$bad);
0
ответ дан 24 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: