Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PHP: Угроза от хакеров (помогите)

3.0K
15 января 2007 года
NetWork
77 / / 10.08.2006
Люди очень важная проблема.

Ну одним словом "хакеры".
У нас есть проект один баннерообменная сеть и как и в любой сети в нашу можно загружать баннеры.
Система определяет формат баннера и размеры вот так.

Код:
$type=GetImageSize($SourceFilename);

                if (($type[2]!=1)and($type[2]!=2)and($type[2]!=3)and($type[2]!=4)and($type[2]!=13))
                {
                print '<li> <font color=red>Выбранный файл имеет неверный формат!</font>!';
                $err=1;
                }

                if (filetype($SourceFilename)<>"file")
                                {
                                print '<li> <font color=red>Это не файл</font>!';
                                $err=1;
                                }

                if (filesize($SourceFilename)>=25000)
                                {
                                print '<li> <font color=red>Баннер не может быть больше 25 кБт</font>!';
                                $err=1;
                                }
                if ($type[0]<>$width)
                                {
                                print "<li> <font color=red>Ширина баннера строго $width пикселей</font>!";
                                $err=1;
                                }
                if ($type[1]<>$height)
                                {
                                print "<li> <font color=red>Высота баннера строго $height пикселей</font>!";
                                $err=1;
                                }
                if ($err==0)
                        {
                        $resul= mysql_query("INSERT INTO banners (id_account,file_banner) VALUES ('$row[id]','$new_file_name')") or die("нельзя изменить текст, обратитесь к разработчикам");
                        print "<li> <font color=green>баннер загружен</font><br><Br>
                        <center>"
;


Но вот беда хакеры сказали и это не лож с их стороны. Короче дыра в проверке формата. Они могут взломать баннерку погрузив в неё баннер с инекцией php. При проверке баннерка говорит, что размеры не те, а формат тот, что нужно.
И мне сказали цитирую:

/----------------------------------------------------------------------

вообщем дыра в закачке баннеров

неправильный код

если хочеш я тебе покажу тока ничё не трону у тебя но если ты уберёш ограничение по размеру

просто подходяшего баннера щас нету

-------- какой формат ты грузишь?

php

ты не сможеш загрузить

но я смогу

если убрать на время огр на размер

я загружаю картинку в виде php кода вместе с инъекцией

и она проходит как картинка с расширением php хотя оно просто так не проходит

” ﶦИUKu — *&ЙQ 2 ќ€Ю R¦єФA~г с 2¤’–&#152;6Г.iUB\Ф" Щ7LЙћ°“Љь5–Хсa¦g–” О©yД…!(°›‹›gл‚Yьc™
WЄуЄ¦2КvђҐёL:а їC GYџ|y—Х°Бs-б„TЁTЭк—њќd|°t¤ ¤)DЪIWX оЎ Н‹FjъґФdпdМ)Z()yKx'Ja(Тmјх‹Шгќ ’ЩBРЋ`)…Ґs¤ы iЏ,?з.QрЯ љ еeSJ _Iс$‚І.w°c{cћ”J@зx P vШ{Џ-ыЩ*ДЩЌ
*2њЯв2чЫд-+KD&UЁ-1„Юwµрє§qZ ХЄй $ Ю=nq Х
щMИujЂ 6Хhц#эаоKILҐku
ye;LOX

вот такой код картинки примерно в php

----------------------------------------------/

Ну и опять я. Помогите реально важно. Покажите только, что и как. Сейчас время важнее всего.
13
15 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Запретить выполнение любых скриптов в тех директориях где хранятся картинки... это то что смог придумать за 15 секунд пока нет босса... позже отпишусь еще...
622
15 января 2007 года
nilbog
507 / / 19.12.2006
не ну вы что - фильтруйте значение перед выполнением вопросов
лично я решаю это так - не пользуюсь mysql_query а пользуюсь готовой библиотечкой
Код:
<?php ## Простейшая функция для работы с placeholder-ами.

// result-set mysql_qw($connection_id, $query, $arg1, $arg2, ...)
//  - или -
// result-set mysql_qw($query, $arg1, $arg2, ...)
// Функция выполняет запрос к MySQL через соединение, заданное как
// $connection_id (если не указано, то через последнее открытое).
// Параметр $query может содержать подстановочные знаки ?,
// вместо которых будут подставлены соответствующие значения
// аргументов $arg1, $arg2 и т.д. (по порядку), экранированные и
// заключенные в апострофы.
function mysql_qw() {
  // Получаем все аргументы функции.
  $args = func_get_args();
  // Если первый параметр имеет тип "ресурс", то это ID соединения.
  $conn = null;
  if (is_resource($args[0])) $conn = array_shift($args);
  // Формируем запрос по шаблону.
  $query = call_user_func_array("mysql_make_qw", $args);
  // Вызываем SQL-функцию.
  return $conn!==null? mysql_query($query, $conn) : mysql_query($query);
}

// string mysql_make_qw($query, $arg1, $arg2, ...)
// Данная функция формирует SQL-запрос по шаблону $query,
// содержащему placeholder-ы.
function mysql_make_qw() {
  $args = func_get_args();
  // Получаем в $tmpl ССЫЛКУ на шаблон запроса.
  $tmpl =& $args[0];
  $tmpl = str_replace("%", "%%", $tmpl);
  $tmpl = str_replace("?", "%s", $tmpl);
  // После этого $args[0] также окажется измененным.
  // Теперь экранируем все аргументы, кроме первого.
  foreach ($args as $i=>$v) {
    if (!$i) continue;        // это шаблон
    if (is_int($v)) continue; // целые числа не нужно экранировать
    $args[$i] = "'".mysql_escape_string($v)."'";
  }
  // На всякий случай запорняем 20 последних аргументов недопустимыми
  // значениями, чтобы в случае, если число "?" превышает количество
  // параметров, выдавалась ошибка SQL-запроса (поможет при отладке).
  for ($i=$c=count($args)-1; $i<$c+20; $i++)
    $args[$i+1] = "UNKNOWN_PLACEHOLDER_$i";
  // Формируем SQL-запрос.
  return call_user_func_array("sprintf", $args);
}
?>

а потом смело используем везде mysql_qw
а вообще что я тут рассказываю - вот http://dklab.ru/lib/DbSimple/
13
15 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: nilbog
не ну вы что - фильтруйте значение перед выполнением вопросов
лично я решаю это так - не пользуюсь mysql_query а пользуюсь готовой библиотечкой

а потом смело используем везде mysql_qw
а вообще что я тут рассказываю - вот http://dklab.ru/lib/DbSimple/


Ужас какой...

Вы действительно считаете что человек, который создал эту тему разберется в подобном коде?

Тогда уж лучше посоветовать ему как это сделать своими силами (иначе никогда не научится)
1) Все значения которые должны быть integer/float приводим к типу - intval()/floatval() соответственно
2) Все что должно быть строкой обрабатываем функцией mysql_escape_string() (не панацея, но в данном случае покатит)
3) все что имеет булево значение обрабатываем примерно так: $is_called = $_GET['is_called']=='yes'?'true':'false';

4) Еще некоторые умники (уж как устал про это писать) хранят пароли и настройки в файлах с расширениями отличными от .php (например всякие .inc или .conf) - так тоже не делать. Можно конечно выносить эти файлы за пределы директории доступной веб-серверу (но это сложнее чем просто тупо сменить расширение файла).

Также запомнить простое правило: никогда (НИКОГДА!!!) не верить данным которые присылает пользователь. Пишите код как будто у вас только два типа пользователей: абсолютный чайник-дурак и кулхацкер-взломщик.

Как говорится "Лучше перебдеть чем недобдеть"

8
15 января 2007 года
mfender
3.5K / / 15.06.2005
Цитата: RussianSpy
Еще некоторые умники (уж как устал про это писать) хранят пароли и настройки в файлах с расширениями отличными от .php (например всякие .inc или .conf) - так тоже не делать. Можно конечно выносить эти файлы за пределы директории доступной веб-серверу (но это сложнее чем просто тупо сменить расширение файла).


Ну да? А если мне нравится именно расширение .inc - что делать? и чем оно плохо? .inc дефолтом исполняются, как и .php. А вот .conf - действительно опасно оставлять в корне...

622
15 января 2007 года
nilbog
507 / / 19.12.2006
Цитата: RussianSpy

Вы действительно считаете что человек, который создал эту тему разберется в подобном коде?


в общем-то это цитата из учебника:) - ничего феноменального там нет и практически ни одно действие не остается не прокомментированным
ps
также не стоит полагаться на magic_quotws_gps - лучше отключите ее в php.ini и все !абсолютно входные данные тщательно обрабатывайте имхо очень удобно и оправдано использовать эту библиотечку mysql_qw

13
15 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: mfender
Ну да? А если мне нравится именно расширение .inc - что делать? и чем оно плохо? .inc дефолтом исполняются, как и .php. А вот .conf - действительно опасно оставлять в корне...



Дефолтом выполняется если сделать соответствующую запись в конфиге.
.php тоже дефолтом не выполняется так между делом если вы забыли. Все это прописывается в конфиге и только после этого начинает "выполняться дефолтом"

8
15 января 2007 года
mfender
3.5K / / 15.06.2005
Цитата: RussianSpy
Дефолтом выполняется если сделать соответствующую запись в конфиге.
.php тоже дефолтом не выполняется так между делом если вы забыли. Все это прописывается в конфиге и только после этого начинает "выполняться дефолтом"


.php всегда выполняется. Про остальное - может быть. Может быть это у меня хостёры сознательные. А вообще, можно просто в .htaccess написать AddType application/x-httpd-php .php .inc .htm

13
15 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Сразу видно что сами вы никогда не собирали веб-сервер...

 
Код:
в .htaccess написать AddType application/x-httpd-php .php .inc .htm

А так действительно можно делать... Но не проще ли все файлы называть правильно?
832
15 января 2007 года
Carpus
390 / / 14.04.2005
Цитата: RussianSpy

4) Еще некоторые умники (уж как устал про это писать) хранят пароли и настройки в файлах с расширениями отличными от .php (например всякие .inc или .conf) - так тоже не делать. Можно конечно выносить эти файлы за пределы директории доступной веб-серверу (но это сложнее чем просто тупо сменить расширение файла).



:-) Где-то месяц назад наблюдал ситуацию -- на одном известном сайте проводились какие-то работы, php отдавался как текст. В течении 5 минут не особо напрягаясь удалось получить пароль к БД.

Выводы делайте сами ;-)

8
15 января 2007 года
mfender
3.5K / / 15.06.2005
Цитата: Carpus
:-) Где-то месяц назад наблюдал ситуацию -- на одном известном сайте проводились какие-то работы, php отдавался как текст. В течении 5 минут не особо напрягаясь удалось получить пароль к БД.

Выводы делайте сами ;-)


Странный "известный сайт"... Уж пароли-то, пути и прочую вещь явно в корне оставлять нельзя... В независимости от расширения

3.0K
15 января 2007 года
NetWork
77 / / 10.08.2006
Я вот расширение проверяю вот так, но тут любой файл не хочет пускать :(

 
Код:
if (!eregi('\.(jpg|png|gif|swf)$',$file_banner) )
                {
                print '<li> <font color=red>Недозволенное расширение файла. Пожалуйста используйте файл с расширениями .gif, .png, .jpg и swf</font>!';
                $err=1;
                }
622
15 января 2007 года
nilbog
507 / / 19.12.2006
Цитата: NetWork

 
Код:
eregi('\.(jpg|png|gif|swf)$',$file_banner)


непонятно что вы имели ввиду - но это неправильно
возможно вы хотели использовать preg_match но для нее регулярное выражение неверно составлено

3.0K
15 января 2007 года
NetWork
77 / / 10.08.2006
А если в PREG_MATCH то как будет правельнее записать ?
12
15 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: mfender
.php всегда выполняется.


Борис, ты не прав (с) ;) . RussianSpy прав. По дефолту сервак вообще ни чего не выполняет. И выполнять по дефолту начинает только после работы с конфигурационными файлами. Неужели ни разу Apache+PHP хотя бы на виндах не делал???????? :eek:

8
15 января 2007 года
mfender
3.5K / / 15.06.2005
Цитата: alekciy
Неужели ни разу Apache+PHP хотя бы на виндах не делал???????? :eek:


Ну на Win-то делал... Вроде бы работает там .php сразу, если php раскомментировать в httpd.conf...

622
15 января 2007 года
nilbog
507 / / 19.12.2006
Цитата: NetWork
А если в PREG_MATCH то как будет правельнее записать ?


правильнее будет слово прав[COLOR="Red"]е[/COLOR]льнее через [COLOR="Red"]и[/COLOR] писать
и по подобным вопросам обращаться в ман http://php.ru/manual/function.preg-match.html и/или искать статьи по регулярным выражениям
насчет eregi я похожи был не прав - можно и с помощью нее решить эту задачу но лучше использовать preg_match имхо

832
15 января 2007 года
Carpus
390 / / 14.04.2005
Цитата: mfender
А вообще, можно просто в .htaccess написать AddType application/x-httpd-php .php .inc .htm



А еще есть замечательная директива php.ini -- include_path. Пишем include_path=".:/путь/к/подключаемым/файлам", и всё, более-менее интересное потенциальным взломщикам кладем туда. Враг не пройдет ;-)

12
15 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: NetWork
А если в PREG_MATCH то как будет правельнее записать ?


Вообще-то ты обратный слеш забыл
'\.(jpg|png|gif|swf)$\'
Ну во-вторых обратный слеш как ограничитель не должен использоваться. Ты справку к PHP читал?

Цитата:
Синтакcис шаблонов, используемых в функциях этого раздела, во многом похож на синтаксис, используемый в Perl. Выражение должно быть заключено в ограничители, например, прямые слеши '/'. Ограничителем могут выступать произвольные символы, кроме буквенно-цифровых и обратного слеша '\'.


Т.е. нормальная регулярка имеет вид

 
Код:
'/jpg$|png$|gif$|swf$/'
12
15 января 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: mfender
Ну на Win-то делал... Вроде бы работает там .php сразу, если php раскомментировать в httpd.conf...


Вот именно вроде бы ;) . Ибо строк

 
Код:
LoadModule php5_module H:/server/Apache2/php_5_1_4/php5apache2.dll
AddType application/x-httpd-php .php .php3 .php4 .htm .html

в файле конфига нет по умолчанию. Их приходиться руками дописывать ибо Apache знать не знает ни чего о PHP. Ты видно просто забыл уже. Или денвер юзал. Ффффтопку его.
16K
15 января 2007 года
_MIB_
30 / / 12.01.2007
Народ похоже совсем забыл, о чем тема была.
Если надо защитить сайт - почитай раздел по безопасности. Там доступно описано что к чему. Необходимо провести целый ряд работ.
Начать с защиты SQL запросов. И постепенно продвигаться решая вопросы безопасности. Никто Вам здесь не поможет. Сейчас народ начнет оговаривать свои темы и делов не будет.
15
15 января 2007 года
shaelf
2.7K / / 04.05.2005
Первое, что в голову пришло, это прошерстить вайл на наличие <? и ?> и если они есть, то это скрипт))) Если картинки небольшие, то пожно через GD их прогонять. Т.е. копировать его в такой же размер. По поводу паролей... У меня они вообще рандомно хранятся от проекта к проекту... То в php файле, то в xml, то в ini. Хранятся выше корня, а в корне только один index.php который выступает в роли контроллера и подгружает то, что ему нужно)))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог