2010-11-27 3 views
35

У меня есть форма, в которой пользователи могут загружать файлы, и я хотел бы назвать файл чем-то по строкам [id]_[lastname]_[firstname].pdf. Имя вводится пользователем, и я боюсь, что они вводят что-то с косой чертой. В противном случае что-то вроде $path = $dir.$filename может привести к $path = 'uploads/2_smith_john/hahaimajerk.pdf', если первое имя - john/hahaimajerk.PHP escape user input для имени файла

Я действительно не хочу принуждать пользователей ограничивать свои имена чем-либо; Я не возражаю изменить их имена немного в имени файла, пока я могу указать исходное имя. Какие персонажи мне нужно бежать, или есть ли другой способ сделать это? Или ... я просто использую mysql_real_escape_string?

+0

Как говорит Алекс Н., escapeshellarg является то, что вы ищете, но я бы сильно рассмотреть вопрос о выделении известно, что безопасные имена файлов и отображение их через вас базу данных, потенциально дружественные имена файлов , – 2010-11-27 03:09:16

+1

хуже: представьте себе имя «/../../../etc/passwd» – Greg 2012-02-03 16:55:55

+0

Вообще говоря, «.» и ".." также важны. – asmecher 2013-09-20 18:33:30

ответ

13

mysql_real_escape_string не избежать косой черты. Даже escapeshellarg этого не сделает. Вам необходимо будет использовать str_replace:

$path = str_replace('/', '_', $path); 
3

Единственный «небезопасный» символ в имени файла является / - так что вы можете легко избежать проблем с помощью str_replace("/","",$filename)

+6

"." и ".." также могут вызвать проблемы. – asmecher 2013-09-20 17:58:49

+4

`.` и` ..` безвредны без `/`. – 2013-09-20 18:18:34

64

Обычно я использую регулярные выражения для этого. Вместо того, чтобы удалять определенные символы (например, косые черты, точки и т. Д.), Я предпочитаю допускать определенные символы (например, буквенно-цифровые).

Например, это заменит любой символ, который не является буквой, числом, тире или подчеркивание подчеркивания:

$escaped = preg_replace('/[^A-Za-z0-9_\-]/', '_', $raw); 

обратного косой перед тиром, чтобы избежать тира в регулярном выражении, так как в противном случае тир используется для указания диапазонов символов (например, AZ).