Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Опасен ли такой код?
 
 автор: yvgorshkov1   (29.09.2016 в 17:22)   письмо автору
 
 

if( ! $_SERVER['HTTP_HOST'] == 'supersite.ru')
    exit('abnormal host');
if( ! isset($_GET['file']))
    exit('select the file you want');
if( ! file_exists($_SERVER['DOCUMENT_ROOT'] . $_GET['file']))
    exit('file not found');

$file = $_SERVER['DOCUMENT_ROOT'] . $_GET['file'];

header("Content-type: " . mime_content_type($file));
header('Content-Disposition: filename='.basename($file));
echo readfile($file);

  Ответить  
 
 автор: prodigy   (01.10.2016 в 14:40)   письмо автору
 
   для: yvgorshkov1   (29.09.2016 в 17:22)
 

Я бы ещё проверил файл по расширению, размеру(при загрузке файлов на сервер), допустимым символам в названии.

Вместо такого:
$file = $_SERVER['DOCUMENT_ROOT'] . $_GET['file']; 


Делайте так:
$file = $_SERVER['DOCUMENT_ROOT'] . pathinfo($_GET['file'])['basename']; 


Чтоб не было всяких /../ в имени файла

  Ответить  
 
 автор: Tamplier   (03.10.2016 в 12:53)   письмо автору
 
   для: prodigy   (01.10.2016 в 14:40)
 

А какой смысл хранить на сервере файл, с родным именем...?

Во первых это небезопасно, а во вторых куча проверок нужна и они на 100% не гарантируют отсутствие вредоносного содержимого. Проще файл переименовывать и менять расширение, а оригинал названия и расширения хранить в БД. А при скачивании файла, просто обратно поставлять родное имя и расширение. Плюсы: безопасность и отсутствие геморроя при загрузке (даже если загружен эксплойт или вирусняк, с измененным расширением и названием, его не найти и не запустить).

  Ответить  
 
 автор: prodigy   (07.10.2016 в 16:20)   письмо автору
 
   для: Tamplier   (03.10.2016 в 12:53)
 

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

  Ответить  
 
 автор: Tamplier   (10.10.2016 в 12:49)   письмо автору
 
   для: prodigy   (07.10.2016 в 16:20)
 

Я говорил про эксплойты, а не про изображения
Кроме того мне приходилось видеть на взломанных сайтах которые просили переделать конструкции такого вида:


<?php
require_once('style/img.jpg');


А в якобы .jpg файле был обычный php код и эксплойт прекрасно работал маскируясь под картинку.
Так что не будьте преступно доверчивы, картинки перерисовывайте при загрузке, а файлы переименовывайте.
Если файл имеет расширение - .jpg .png .gif еще не означает что это безобидная картинка.

Безопасности много не бывает!

  Ответить  
 
 автор: prodigy   (11.10.2016 в 10:48)   письмо автору
 
   для: Tamplier   (10.10.2016 в 12:49)
 

В гугле порылся и нашел тройку интересных тем про загрузку файлов:

https://habrahabr.ru/post/44610/ - Безопасная загрузка изображений на сервер. Часть первая
https://habrahabr.ru/post/44615/ - Безопасная загрузка изображений на сервер. Часть вторая
https://habrahabr.ru/post/148999/ - Ваш сайт тоже позволяет заливать всё подряд?

  Ответить  
 
 автор: Fart   (03.10.2016 в 23:58)   письмо автору
 
   для: prodigy   (01.10.2016 в 14:40)
 

а какая польза?)

  Ответить  
 
 автор: prodigy   (07.10.2016 в 14:39)   письмо автору
 
   для: Fart   (03.10.2016 в 23:58)
 

>а какая польза?)

???

  Ответить  
 
 автор: Fart   (03.10.2016 в 23:56)   письмо автору
 
   для: yvgorshkov1   (29.09.2016 в 17:22)
 

if( ! $_SERVER['HTTP_HOST'] == 'supersite.ru') - кто так учил писать?

введи следующее query_string: ?file=../../../../

и увидишь насколько безопасен твой код.

$file = $_SERVER['DOCUMENT_ROOT'] . pathinfo($_GET['file'])['basename']; - сомнительная часть

  Ответить  
 
 автор: prodigy   (07.10.2016 в 14:28)   письмо автору
 
   для: Fart   (03.10.2016 в 23:56)
 

Что там сомнительного?
Вообще-то я выше написал про проверку имени файла на допустимые символы.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования