Как запретить загрузки шелл?

1. ion (06.12.2009 / 18:25)
Как запретить загрузки шелл если она помещенна в картинку и загружается через импорт?

2. Lugaro (06.12.2009 / 18:29)
Он не чем не опасен в таком виде, а проветрить можно по mine type'пу

3. ктулху (06.12.2009 / 18:35)
2, Ну раз некоторые так делают логично предположить что на некоторых серверах это всё-же может сработать. Советую в папке с загруженными файлами создать .htaccess и прописать
php_value engine off

4. ion (06.12.2009 / 18:48)
спасибо

5. ктулху (06.12.2009 / 18:56)
Это отключит PHP в этой папке и всех подпапках.

6. Lugaro (06.12.2009 / 18:59)
3
//на всякий случай D
if(false == true)...

7. ктулху (06.12.2009 / 19:02)
6, я наверно затупил, но не понял к чему это smile

8. ramzes (06.12.2009 / 19:13)
Если в папку только картинки загружаются то можно вообще закрыть к папке доступ и выдавать картину скриптом (ресайзом)
#3 самый действенный вариант, но говорят на некоторых хостах не работает. Не выключается.

9. ion (06.12.2009 / 19:14)
то есть если в той папке есть еще папки то там пых не будет работать?

10. Lugaro (06.12.2009 / 19:14)
7 я это к тому что с той же логической точки зрения картинки не должны работать как рнр, интересно как будет сайт работать с такими настройками сервера)))
а загружается шелл в картинке с расчетом на какой нибудь include $_GET['file']; в скрипте, в этом случае php_value engine off не поможет, поправь если что не такsmile

11. Lugaro (06.12.2009 / 19:22)
9 да, код будет выводится как обычный текст

12. ion (06.12.2009 / 19:35)
тогда какое решение?

13. ramzes (06.12.2009 / 19:52)
#10 если на сайте есть такой инклуд то надо не о защите от загрузки шелла думать а о том какой тормоз такой код написал.

14. Lugaro (06.12.2009 / 20:21)
13 ну это понятно))

15. Станислав (06.12.2009 / 20:22)
12 ну если тебе надо в какой-то папке чтоб работало, то php_value engine on и всё. А вообще, лучше всего загруженые файлы хранить с именами их хэша, а потом скриптом выдавать на скачивание. И никаких проблем небудет

16. ion (07.12.2009 / 07:19)
Просто там картинка а в нем шелл! Ее принцип воровство пароля! Начальное имя отсекается скриптом и присваивается новое имя! То есть соответственно имя уже не кар.рhр.jрg а просто 12.jрg соответственно отключение рhр не пригодится так? А как не пропускать такое?

17. Станислав (07.12.2009 / 07:42)
16 ты нифига не понял. Скриптом сам файл выдавай

18. CROWS (07.12.2009 / 15:44)
ShiftBHT (06.12.09 / 18:35)
2, Ну раз некоторые так делают логично предположить что на некоторых серверах это всё-же может сработать. Советую в папке с загруженными файлами создать .htaccess и прописать
php_value engine off
самый оптимальный вариант.

19. Михаил (07.12.2009 / 18:14)
Если на каком-то хостинге картинки могут обрабатываться, как php, то валить нужно с этого хостинга

20. Удаленный (10.12.2009 / 13:09)
А на мое мнение просто надо проверять картинку как на вап моторе-18.

21. ктулху (12.12.2009 / 07:28)
20, дак задача вроде не только картинки протпускать

22. Удаленный (14.12.2009 / 22:35)
В .htaccess прописать:
RemoveHandler .php .phtml .pl
AddType text/plain .php .phtm .htm .html .phtml .pl .php.gif
И вроде норм получается, меня с этим на шеллы проверяли, норм вроде...

23. ктулху (15.12.2009 / 11:37)
php5 прокатит, иногда расширение php6 прокатывает даже)

24. Станислав (15.12.2009 / 18:00)
23 ога =))) Я таким образом одно время много всяких скриптов сливал =)))

25. ion (15.12.2009 / 19:32)
Так 22 не пойдет получается если я пропишу .htaccess? Все равно что то может попасть?

26. Станислав (15.12.2009 / 19:35)
25 да блин, не знаю как ещё написать. Может вот так?: СохРаНяЙ с ИмЕнеМ в ВиДе mD5-ХэшА, а ПотОм вЫдаВаЙ сКриПтОм. И пофиг будет что загрузили тебе на хост

27. ктулху (16.12.2009 / 11:48)
26, солидарен. Много преимуществ, можно и скорость ограничивать, и защиту от прямых ссылок сделать

28. smartvbxos7 (16.12.2009 / 12:46)
Гети файл и реадь внутри иши print else echo. . .

29. Станислав (16.12.2009 / 15:02)
28 а чё если кто-нидь текстовый файл с кодом загрузить хочет?

30. Удаленный (17.12.2009 / 07:41)
23,25, У меня еще правда файлы сохраняются ввиде: time().gif например smile

31. Удаленный (17.12.2009 / 07:45)
25, Я вообще считаю что 100% защиты от дыр и всей хни добиться практически не реально... Хакеры не дремлют...

32. ктулху (17.12.2009 / 10:43)
30, а зачем расширение? Я храню просто time() в названии файла. реальное название хранится в базе, размер и mime type определяется перед выдачей файла.
31, главное закрывать актуальные уязвимости, уже на 90% меньше вероятности что взломают.

33. Станислав (17.12.2009 / 19:32)
Короче
$file_size = ''.$_FILES['ufile']['size'].'';
if($file_size!=0)
{
$file_hash = md5_file($_FILES['ufile']['tmp_name']);
copy($_FILES['ufile']['tmp_name'], "attach/$file_hash");
$tm=time();
$filename= ''.$_FILES["ufile"]["name"].'';
mysql_query("INSERT INTO ".$prefix."attach(hash,name,date,size) VALUES('$file_hash','$filename','$tm','$file_size')") or die(mysql_error()); 
}
Типа вот так файлы загружай

34. Станислав (17.12.2009 / 19:34)
И типа вот так выдавай (тока ты тупо код не копируй, переменные пофильтровать надо ещё)
$attach=(int)$_GET['attach'];
$file=mysql_fetch_assoc(mysql_query("SELECT * FROM ".$prefix."attach WHERE id='$attach'"));
@mysql_query("UPDATE ".$prefix."attach SET count=count+1 WHERE id=$attach");
    $local_file='attach/'.$file[hash].'';
	header('Cache-control: private'); 
    header('Content-Type: application/octetstream'); 
    header('Content-Length: '.filesize($local_file)); 
    header('Content-Disposition: attachment; filename='.$file[name]); 
    flush(); 
	$files = fopen($local_file, "r"); 
    while (!feof($files)) 
    { 
        print fread($files, round(9999 * 1024)); 
        flush(); 
        sleep(1); 
    } 
    fclose($files); 


35. ктулху (18.12.2009 / 01:54)
34, можно ещё сделать докачку и ограничение скорости) видел на php.su

36. Tony V (18.12.2009 / 03:11)
34, мда... серваки вам не жалко...

37. ктулху (18.12.2009 / 06:49)
36, проверь, быдлокодом можно куда больше нагрузить сервер. тут поидее нагрузки то нет, оператива только, если большой файл.

38. Михаил (19.12.2009 / 23:54)
В php для отдачи файла есть вроде отдельная функция.

39. ктулху (20.12.2009 / 16:26)
38, помню когда только придумал отдавать файл скриптом, много гуглил на эту тему.. везде предлогалось лишь отослать заголовки и файл (Короче как выше SNELS описал), ни о каких функциях ничего не писали (

40. Станислав (21.12.2009 / 17:57)
39 аналогично =)))

41. Михаил (21.12.2009 / 20:04)
Иногда необходимо передать браузеру некоторый (обычно текстовый) файл цели-
ком. Самым простым решением является использование функции readfileO, имею-
щей следующий синтаксис:
readfile($filename [, $use_include_path])
где $filename представляет имя файла (локального или удаленного, заданного
с помощью упаковщика URL), который необходимо отобразить клиенту, а
$use_include_path — это булевское значение, которое определяет, нужно ли искать
файл в списке включаемых каталогов РНР. В листинге 20.18 функция readfileO
применяется для загрузки файла agreement. txt в HTML-дескриптор <TEXTAREA>.
Листинг 20.18. Использование функции readfile ()
<НТМЬХНЕА0ХТ1ТЬЕ>Использование функции r e a d f i l e ()</TITLEX/HEAD>
<BODY>
<TEXTAREA R0WS=5 COLS=60 NAME="agreement">
<?php r e a d f i l e C a g r e e m e n t . t x t " ) ; ?>
</TEXTAREA>
</BODY>
</HTML>

42. Михаил (21.12.2009 / 20:06)
fpassthru
(PHP 3, PHP 4, PHP 5)
fpassthru -- Выводит все оставшиеся данные из файлового указателя
Описание
int fpassthru ( resource handle )
Читает указанный файловый указатель с текущей позиции до EOF (конца файла) и записывает результат в буфер вывода.
Если происходит ошибка, fpassthru() возвращает FALSE. В ином случае, fpassthru() возвращает количество символов, прочтнных из handle и переданных на вывод.
Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen().
Вам может понадобиться вызвать rewind() чтобы сбросить файловый указатель на начало файла, если вы уже записывали данные в файл.
<?php
// открываем файл в бинарном режиме
$name = ".\public\dev\img\ok.png";
$fp = fopen($name, 'rb');
// отправляем нужные заголовки
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));
// скидываем картинку и останавливаем выполнение скрипта
fpassthru($fp);
exit;
?>

43. Дмитрий (22.12.2009 / 05:40)
я ко всему прочему еще и переименовываю загруженый файл сгенерированым числом.

44. ктулху (22.12.2009 / 09:39)
43, это естественно, иначе могут попасться файлы с одинковым именем
42, а... ну дак это понятно =) Я думал функция и заголовки сама посылает =)

45. Михаил (24.12.2009 / 23:00)
#44, откуда ж он может знать что отправлять. Я про то, что зачем использовать while(){fread(...)}, если есть специальные функции

46. ктулху (28.12.2009 / 23:40)
45, при использовании этой функции теряется много преимуществ. нельзя управлять скоростью например, нельзя организовать докачку

47. Олег (29.12.2009 / 13:08)
SNELS, по поводу 33 поста. Для имени файла необязательно генерировать имя используя его хеш. Я к тому что механизм md5 достаточно ресурсоемкий и при массовой загрузке файла это скажется, а если это для закрытой части, то, конечно, можно. Имя файла лучше генерировать при помощи time(), rand(), или идентификатора в базе данных. Потом еще раз повторюсь, никогда не используйте copy при загрузке файла на сервер. Перемещение намного быстрее чем его копирование, следовательно вместо этого можно задействовать move_uploaded_file().

48. Михаил (29.12.2009 / 18:12)
#46, докачку с помощью fpassthru($fp); легко сделать, нужно только указатель на нужное значение поставить fseek(...)

49. Станислав (29.12.2009 / 21:47)
47 ну, эт я к примеру ведь просто =) ТАм уж кто что захочет =)

50. Дмитрий (07.01.2010 / 05:33)
50. Создатель, жостко)

URL: https://visavi.net/topics/3624