Я знаю золотое правило, никогда не доверяю указанным пользователем именам файлов. Однако я хочу нарушить это правило. Есть ли что-то небезопасное по следующей схеме?Является regex safe для пользовательских имен файлов - PHP
$name = $_POST['name'];
$id = intval($_GET['id']);
$sanitized_name = preg_replace('/[^0-9a-zA-Z]/','',$name);
$fp = fopen("/path/to/".$id."/".$sanitized_name.".jpg",'w');
Если я заменю все, что не 0-9 или A-Z или A-Z с «», то есть абсолютно 0% изменение каждый может привнести «». для создания собственного расширения (с комбинацией NULL-байта) или перемещения по каталогу. Это кажется безопасным. Я просто хотел запустить его SO.
Кроме того, поскольку ID вынужден быть ИНТ, что-нибудь в стиле фанк просто превратится в 0.
Почему в имени богов вы используете имена файлов HTML-кодировки ?! – deceze
Это обычная дезинфекция, которую я скопировал и наклеил. Это не должно иметь значения, потому что любые символы HTML будут полосатыми в любом случае. Это не нужно и избыточно. Обычные имена, такие как «кот», будут оставаться «кошкой». '> cat' превратится в '> cat', который превратится в 'gtcat'. Не имеет значения, так как это было бы просто лишено. –
«Безопасность» - это не то, что вы можете просто побрызгать своим кодом, например солью на еду, и ожидать, что волшебство станет лучше/вкуснее. Что такое ** ВАШИ ** требования безопасности? Возможно, вы разрешаете нескольким пользователям загружать файлы и только хотите, чтобы они имели доступ к своим собственным файлам. В этом случае этот код бесполезен, потому что пользователь A с файлом 'z.txt' может калечить имя файла и получить доступ к' y.txt', который принадлежит пользователю B. «oops». –