2015-05-23 2 views
1

Я пытаюсь разработать небольшую социальную сеть и хотел бы знать, достаточно ли следующего подхода, чтобы сделать мой «сценарий загрузки файлов» максимально безопасным. Я хочу, чтобы мои пользователи загружали изображения [jpeg, jpg, png, gif], видео [3gp, wma, mp4] и mp3-файлы. Я рассмотрел многие вопросы здесь, в SO, но большинство из них, похоже, имеют дело с загрузкой изображений в деталях, а не с видео и mp3. Я хотел бы знать, что еще я могу сделать, чтобы сделать скрипт доступным для загрузки скриптом msot. [да, я довольно параноидальный о безопасности и определенно хочу, чтобы мой сайт был известен своей безопасностью, а не скоростью). Мой текущий подход заключается в следующем:Что такое самый безопасный способ загрузки файлов php, который может обрабатывать все типы файлов?

  • проверить, если пользователь зарегистрирован (путем проверки сеанса)
  • проверки, если файл загружается без ошибок
  • чек, если размер файла находится в допустимом диапазоне
  • дезинфицировать имя файла
  • получить расширение файла и проверить, разрешено ли его расширение
  • получить тип mime и проверить, является ли он допустимым типом mime
  • генерировать новое случайное имя файла
  • правило набора .htaccess для папки вне public_html и использовать его в магазин загруженных файлов
  • использовать move_uploaded_file()
  • использование CHMOD(), чтобы установить «0644» в качестве разрешения на загруженный файл

В файле .htaccess будут добавлены следующие:

SetHandler none 
    SetHandler default-handler 
    Options -ExecCGI 
    php_flag engine off 

ForceType application/octet-stream 
<FilesMatch "(?i)\.jpe?g$"> 
    ForceType image/jpeg 
</FilesMatch> 
<FilesMatch "(?i)\.gif$"> 
    ForceType image/gif 
</FilesMatch> 
<FilesMatch "(?i)\.png$"> 
    ForceType image/png 
</FilesMatch> 
<FilesMatch "(?i)\.mp3$"> 
    ForceType audio/mpeg 
</FilesMatch> 
<FilesMatch "(?i)\.mp4$"> 
    ForceType video/mp4 
</FilesMatch> 

код, который я пытаюсь это следующим образом:

$fileInput = $_FILES['image']; 
$sizeLimit="4000"; 
if($fileInput['error'] === UPLOAD_ERR_OK && isset($fileInput['tmp_name'])){ 
if($fileInput['size'] < $sizeLimit){ 
$cleanedName=stripslashes($fileInput['name']); //cleaning file name 
$checking = pathinfo($cleanedName); //finding extension 
$ext=$checking['extension']; 
$finfo = finfo_open(FILEINFO_MIME_TYPE); // find mime type 
$mimetype = finfo_file($finfo, $fileInput['tmp_name']); 
finfo_close($finfo); 
. 
. 
.//generate random name and use move_uploaded_file() and chmod() 
} 
} 

Является ли этот подход достаточно, чтобы держать мой сайт безопасным, или есть какие-то явные недостатки этого метода ?. Заранее спасибо за вашу помощь.

+0

Если вы хотите быть более безопасным, убедитесь, что у вас есть SSL. Что касается самих загрузок, файл - это просто файл, независимо от его типа, а более крупные файлы или файлы определенного типа не являются более жесткими или менее безопасными. – GolezTrol

+0

@GolezTrol Спасибо. Да, я обязательно использую SSL. Я заметил, что большинство пользователей на SO в основном предлагают использовать GD, чтобы проверить, является ли загрузка изображением, но есть ли такой метод проверки для видео и аудио, чтобы быть более уверенным в файлах ?. Мой подход оставляет любые зияющие лазейки, которые можно легко манипулировать? – newbiePrgrmr

ответ

0

Рекомендуется проверить расширение имени файла, хотя следует помнить, что тип mime можно легко подделать, поэтому это не является хорошей проверкой на безопасность.

То, что вы до сих пор это хорошо, мои дополнительные советы будут:

  • Вирус просканировать все файлы - это больше для защиты других пользователей вашего приложения, а не на сервере.
  • Храните изображения за пределами веб-корня полностью и используйте an approach such as this one для проксирования файлов, которые будут обслуживаться. Это имеет то преимущество, что любые дополнительные проверки разрешений могут выполняться в коде (поэтому Боб не может загружать файлы Алисы), и по мере доступа к файлам в качестве данных нет никаких шансов на выполнение.
  • Слушайте файлы с заголовком X-Content-Type-Options: nosniff, чтобы предотвратить любые атаки XSS через обман нюха IE.
  • Храните изображения с использованием имен, сгенерированных сервером. Например, вы можете назвать каждый файл после первичного ключа своей записи в базе данных. Это уменьшит любые атаки directory traversal (like this one), и если пользователю удастся загрузить что-то вредоносное, они с меньшей вероятностью найдут его на сервере.
  • Загрузите все изображения в библиотеку изображений и сохраните их, чтобы у них не было exploits embedded for popular browsers.
  • У вас есть какая-то ручная система контроля, чтобы следить за любым загруженным незаконным контентом.
  • Защитите свою форму от CSRF.
+0

Большое спасибо за замечательные советы. Я планирую использовать clamAv для сканирования файлов. Я надеюсь, что токенов csrf, основанных на сеансах, будет достаточно для смягчения любых угроз csrf. – newbiePrgrmr

+0

Да, сеанс csrf Tokens - это способ идти. – SilverlightFox

+0

К сожалению, у меня недостаточно очков репутации для повышения, так как я новичок. Надеюсь, в ближайшие дни эта публикация получит больше ответов от других экспертов, подобных вам, и определенно будет выбирать ответ как лучший после этого. еще раз спасибо – newbiePrgrmr

Смежные вопросы