Как предотвратить нежелательные файлы, когда сайт предлагает загрузку изображений с использованием PHP? - PullRequest
2 голосов
/ 05 декабря 2009
if ((($_FILES["uploadedfile"]["type"] == "image/gif")
|| ($_FILES["uploadedfile"]["type"] == "image/jpeg")
|| ($_FILES["uploadedfile"]["type"] == "image/pjpeg"))
&& ($_FILES["uploadedfile"]["size"]/1024<100))

Когда я тестировал приведенный выше код, я обнаружил, что пользователь может обойти проверку типа файла, просто изменив имя расширения, как получить реальное имя расширения файла?

Кроме того, когда пользователь загружает очень большой файл, как немедленно отклонить загрузку на стороне сервера?

Ответы [ 3 ]

1 голос
/ 05 декабря 2009

вы не можете точно получить тип файла из mimetype, так как это пользовательский ввод, который можно легко забыть. Что вы можете сделать, это использовать команду file в * nix, чтобы убедиться, что это настоящие файлы jpeg или gif. Таким же образом вы можете попробовать загрузить его с помощью GD (расширение изображения) или Image magic .

пример вывода файла

olivier@olivier-laptop:~/trust/public/images$ file verisign_sample.gif 
verisign_sample.gif: GIF image data, version 89a, 100 x 60

с помощью оператора backtice вы сможете получить результат и проанализировать его

$line = `file $filepath`

Ваш второй вопрос зависит от браузера: в RFC браузер не должен указывать размер контента при выполнении запроса, поэтому вы не можете остановить загрузку, если файл очень большой. Он будет загружаться до тех пор, пока не достигнет вашей загрузки PHP limit (параметр upload_max_filesize в php.ini), и PHP прервет запрос.

0 голосов
/ 01 июля 2011

Если вы хотите обеспечить только загрузку изображений, вы проверяете тип файла, используя getimagesize () , а затем image_type_to_mime_type () .

0 голосов
/ 05 декабря 2009

Действительно, пользователь может обойти проверку файла, изменив расширение файла. Вы не можете полагаться на что-либо , содержащееся в «1003» под «именем» или «типом», так как они оба могут быть предоставлены пользователем, поэтому это определенно не может считаться заслуживающим доверия.

Как указало RageZ, вы можете использовать команду file для определения типа файла или попробовать загрузить изображение с помощью GD или чего-то подобного. Вы также можете посмотреть заголовок файла самостоятельно: здесь есть интересная статья о том, как это сделать 1008 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...