PHP: Угроза от хакеров (помогите)
Ну одним словом "хакеры".
У нас есть проект один баннерообменная сеть и как и в любой сети в нашу можно загружать баннеры.
Система определяет формат баннера и размеры вот так.
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¤’–˜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
----------------------------------------------/
Ну и опять я. Помогите реально важно. Покажите только, что и как. Сейчас время важнее всего.
лично я решаю это так - не пользуюсь mysql_query а пользуюсь готовой библиотечкой
// 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/
лично я решаю это так - не пользуюсь 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) - так тоже не делать. Можно конечно выносить эти файлы за пределы директории доступной веб-серверу (но это сложнее чем просто тупо сменить расширение файла).
Также запомнить простое правило: никогда (НИКОГДА!!!) не верить данным которые присылает пользователь. Пишите код как будто у вас только два типа пользователей: абсолютный чайник-дурак и кулхацкер-взломщик.
Как говорится "Лучше перебдеть чем недобдеть"
Ну да? А если мне нравится именно расширение .inc - что делать? и чем оно плохо? .inc дефолтом исполняются, как и .php. А вот .conf - действительно опасно оставлять в корне...
Вы действительно считаете что человек, который создал эту тему разберется в подобном коде?
в общем-то это цитата из учебника:) - ничего феноменального там нет и практически ни одно действие не остается не прокомментированным
ps
также не стоит полагаться на magic_quotws_gps - лучше отключите ее в php.ini и все !абсолютно входные данные тщательно обрабатывайте имхо очень удобно и оправдано использовать эту библиотечку mysql_qw
Дефолтом выполняется если сделать соответствующую запись в конфиге.
.php тоже дефолтом не выполняется так между делом если вы забыли. Все это прописывается в конфиге и только после этого начинает "выполняться дефолтом"
.php тоже дефолтом не выполняется так между делом если вы забыли. Все это прописывается в конфиге и только после этого начинает "выполняться дефолтом"
.php всегда выполняется. Про остальное - может быть. Может быть это у меня хостёры сознательные. А вообще, можно просто в .htaccess написать AddType application/x-httpd-php .php .inc .htm
А так действительно можно делать... Но не проще ли все файлы называть правильно?
4) Еще некоторые умники (уж как устал про это писать) хранят пароли и настройки в файлах с расширениями отличными от .php (например всякие .inc или .conf) - так тоже не делать. Можно конечно выносить эти файлы за пределы директории доступной веб-серверу (но это сложнее чем просто тупо сменить расширение файла).
:-) Где-то месяц назад наблюдал ситуацию -- на одном известном сайте проводились какие-то работы, php отдавался как текст. В течении 5 минут не особо напрягаясь удалось получить пароль к БД.
Выводы делайте сами ;-)
Выводы делайте сами ;-)
Странный "известный сайт"... Уж пароли-то, пути и прочую вещь явно в корне оставлять нельзя... В независимости от расширения
{
print '<li> <font color=red>Недозволенное расширение файла. Пожалуйста используйте файл с расширениями .gif, .png, .jpg и swf</font>!';
$err=1;
}
непонятно что вы имели ввиду - но это неправильно
возможно вы хотели использовать preg_match но для нее регулярное выражение неверно составлено
Борис, ты не прав (с) ;) . RussianSpy прав. По дефолту сервак вообще ни чего не выполняет. И выполнять по дефолту начинает только после работы с конфигурационными файлами. Неужели ни разу Apache+PHP хотя бы на виндах не делал???????? :eek:
Ну на Win-то делал... Вроде бы работает там .php сразу, если php раскомментировать в httpd.conf...
правильнее будет слово прав[COLOR="Red"]е[/COLOR]льнее через [COLOR="Red"]и[/COLOR] писать
и по подобным вопросам обращаться в ман http://php.ru/manual/function.preg-match.html и/или искать статьи по регулярным выражениям
насчет eregi я похожи был не прав - можно и с помощью нее решить эту задачу но лучше использовать preg_match имхо
А еще есть замечательная директива php.ini -- include_path. Пишем include_path=".:/путь/к/подключаемым/файлам", и всё, более-менее интересное потенциальным взломщикам кладем туда. Враг не пройдет ;-)
Вообще-то ты обратный слеш забыл
'\.(jpg|png|gif|swf)$\'
Ну во-вторых обратный слеш как ограничитель не должен использоваться. Ты справку к PHP читал?
Т.е. нормальная регулярка имеет вид
Вот именно вроде бы ;) . Ибо строк
AddType application/x-httpd-php .php .php3 .php4 .htm .html
в файле конфига нет по умолчанию. Их приходиться руками дописывать ибо Apache знать не знает ни чего о PHP. Ты видно просто забыл уже. Или денвер юзал. Ффффтопку его.
Если надо защитить сайт - почитай раздел по безопасности. Там доступно описано что к чему. Необходимо провести целый ряд работ.
Начать с защиты SQL запросов. И постепенно продвигаться решая вопросы безопасности. Никто Вам здесь не поможет. Сейчас народ начнет оговаривать свои темы и делов не будет.