2017-02-18 17 views
0

На моем сайте есть форма для загрузки. На самом деле я не включаю и не исключаю типы файлов.Загрузка веб-сайта предотвращает взлом

Вместо этого я использую это:

$fileUploadName = $target_dir.md5(uniqid($target_file.rand(),true)).".".$imageFileType; 

Это будет держать тип файла, но изменить имя файла для некоторых случайных загадочного как 790cd5a974bf570ff6a303c3dc5be90f.

Таким образом, хакер не может загрузить файл hack.php и открыть его с помощью www.example.com/uploaded_files/hack.php, так как он изменился, например. 790cd5a974bf570ff6a303c3dc5be90f.php. На мой взгляд, это абсолютно безопасно. Правильно ли, что это безопасно?

Я думаю, что проблемой может быть только сам исполняемый файл. Существуют ли самоисполняющиеся файлы?

+0

Применив [Принцип Керкхофф] (https://en.wikipedia.org/wiki/Kerckhoffs 's_principle) "злоумышленник знает все о системе, кроме ключа (криптографического), ваш злоумышленник может знать, что вы используете контрольную сумму MD5 имени файла и, следовательно, можете вывести имя загруженного файла. –

+0

Почему, при любых обстоятельствах, разрешаете ли вы выполнять загрузку файлов? – miken32

+0

@ miken32 Я не понимаю, что вы имеете в виду. Конечно, я хочу, чтобы хакер мог загрузить файл, а потом искупить. Чтобы этого избежать, я изменяю имя реального файла в чем-то загадочном с помощью md5 (uniqid ($ filename)). Таким образом, я надеюсь, что хакер не может вызывать и экспроксимировать файл через браузер, потому что он не знает имя (фактического) файла. Это, конечно, не сработает, если это файл самозавершения. Но делай. файлы самоисполнения даже существуют? – David

ответ

0

Вы также должны проверить именовать тип mime загруженного файла и расширение (хотя это можно легко подделать при загрузке). Если вы ожидаете только изображения, можно также проверить ширину изображения и длины параметров, выполнив сценарий, как это:

$size = getimagesize($target_file); 

Если это не возвращает правильные значения, это не файл изображения.

Возможно, вы захотите сообщить о опасной графике, например, Gifar.

+0

Хорошо, но зачем мне делать дополнительные проверки? Пользователь не сможет вызывать/открывать загруженный файл, или он? – David

+0

Я бы санировал каждую загрузку как можно больше. Если вы ожидаете файлы изображений, я бы проверял файлы изображений, например, используя getimagesize. Существует множество обстоятельств, когда кто-то может реально дойти до загруженного файла. Например, обновление/неправильное конфигурирование веб-сервера может включать просмотр каталогов. Или кто-то может просто попробовать атаку грубой силы, чтобы найти файлы на сервере (если они могут быть выполнены из Интернета). – Cruiser

+0

Обычно люди хотят что-то сделать с файлами, загруженными позже. Скачайте их, покажите их где-нибудь.Даже простой оптимизационный скрипт для файлов или какой-либо службы индексирования может запускать файлы и запускать их, если это позволяют обстоятельства. – Cruiser

0

Помещенные загрузил файлы в отдельную папку там как /etc/web/uploads/<Random> (../uploads) в то время как веб-сайт корня на /etc/web/public/ или если вы можете использовать .htaccess создать в папке загрузок и положить Deny from all Также uniqid и рант не создает криптографически безопасные значения Я хотел бы также проверить, что файл загруженного изображения в любом случае Link to someones isimage functionhttp://php.net/manual/en/function.uniqid.phphttp://php.net/manual/en/function.rand.php

file_get_contents Используйте, чтобы получить пользователи изображения