Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » DEL

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10

Открыть новую тему     Написать ответ в эту тему

israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Пипл, помогите пожалуйста!  
Скопируйте мне, если у кого есть готовый, кусок РНР кода, который выполняет все проверки безопасности, когда я организовываю для посетителей на сайте загрузку фотографий через НТМЛ форму. Чтобы злобный хакер вместо фотки не послал бы мне какой нибудь подлый скрипт.... Или ещё что нибудь в этом роде....

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 01:17 01-07-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider

Цитата:
Чтобы злобный хакер вместо фотки не послал бы мне какой нибудь подлый скрипт....

проверяйте расширение +  
http://us2.php.net/manual/en/function.image-type-to-mime-type.php
или инфа из  
http://us2.php.net/manual/en/function.getimagesize.php

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:20 01-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот, сделал поиск на "getimagesize", и нашёл в точности то, что искал!
 
http://forum.dklab.ru/viewtopic.php?t=26754

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 01:38 01-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Уважаемые Проффессионалы! Вот что у меня в результате получилось. Был бы счастлив выслушать ваши замечания.
 
<?php
if (!isset($_POST['fotobook'])) header("Location:book.php");        // Если юзер нажал кнопку "Загрузка файлов" что бы загрузить файл
if ($_FILES["imyfaila"]["size"] > 1024*2*1024) {                       // Проверяем размер
    echo "<h1 STYLE='color:red;'>Размер файла превышает 2 мегабайта.</h1><h2><a href=# onClick='history.back()'>Вернуться к отправке</а></h2>";
    exit();
}    
$prvrkimya = trim($_FILES["imyfaila"]["name"]);                  // Убираем пробелы с начала и конца оригинального имени фотки
$prvrkimya = substr($prvrkimya, -15);                             // Обрезаем оригинальное имя до 15-и знаков с конца  
if (stristr($prvrkimya, '.') !== '.jpg') {                       // Проверяем расширение оригинального имени
    echo "<h1 STYLE='color:red;'>Это походу не фотка ни хрена... </h1><h2><a href=# onClick='history.back()'>Вернуться к отправке</а></h2>";
    exit();
}    
$prvrkfaila = getimagesize($_FILES['imyfaila']['tmp_name']);//Проверяем, не (removed) ли с размером и расширением подделов "Content-Type"
if ($prvrkfaila > 1024*2*1024  or $prvrkfaila['mime'] != 'image/jpg') {
    echo "<h1 STYLE='color:red;'>Чёто не тое... </h1><h2><a href=# onClick='history.back()'>Вернуться к отправке</а></h2>";
    exit();    
}
move_uploaded_file($_FILES['imyfaila']['tmp_name'], "knigajiz/vremenni.jpg"); // Если фотка всё выдержала, помещаем её в папку под временным именем
if($_FILES['imyfaila']['error'] > 0) {
    echo "<h1 STYLE='color:red;'>Есть ошибки</h1><h2><a href=# onClick='history.back()'>Вернуться к отправке</а></h2>";
    exit();    
}
unlink($_FILES['image']['tmp_name'];                                               // Уничтожаем фотку во временной директории
?>                                                                                                                  





п. 2.3. главы VIII Соглашения по использованию /Cheery/
Думать есть чем?

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 08:51 02-07-2009 | Исправлено: Cheery, 19:45 02-07-2009
zerkms

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
israel_rider
1. непонятна последняя проверка. зачем она нужна, если перед ней мы уже сделали move_uploaded_file?
2. зачем unlink в конце?
3. лапша %)
4. тип файла нужно брать не из mime, а из того, что возвращает getimagesize
5. if ($prvrkfaila > 1024*2*1024  в переменной массив, а не размер в байтах.
6. расширение лучше брать из pathinfo()
7. имена всех переменных поменять на релевантные и переведённые на английский язык
8. зачем размер проверять дважды?
 
резюме: переписать полностью с нуля. никуда не годится.

----------
tvfёdor - оперативно уведомляет о раздачах rutracker | Блог об иммиграции в Новую Зеландию

Всего записей: 387 | Зарегистр. 07-05-2004 | Отправлено: 11:33 02-07-2009 | Исправлено: zerkms, 11:34 02-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
zerkms! Огромный сенкс за помощь и поддержку! Переписываю! Но, плиз, несколько вопросов.
«3. лапша %» - Не понял вообще, о чём ты.
«7. имена всех переменных поменять на релевантные и переведённые на английский язык» Дело в том, что мне так очень удобно. Когда я даю переменным левые имена, я точно знаю, что они у меня не повторяться. У меня уже и так голова пухнет, каждый раз, когда приходиться придумывать имя для переменной. А не называл ли я так уже что нибудь. И не только переменные. Каждый раз, когда придумываешь имя класса CSS, та же проблема.
«4. тип файла нужно брать не из mime, а из того, что возвращает getimagesize» Вообще беда . Пишу  
$prvrkfaila = getimagesize($_FILES['imyfaila']['tmp_name']);  
echo image_type_to_mime_type($prvrkfaila);
А он у меня пишет «image/gif». И это то при том, что я загружаю реальную фотографию с расширением «jpg»!!!!
 
 
Добавлено:
Вот, переписал. То, что понял из твоих замечаний, изменил.
<?php
if (!isset($_POST['fotobook'])) header("Location:book.php");        // Если юзер нажал кнопку "Загрузка файлов" что бы загрузить файл
if ($_FILES["imyfaila"]["size"] > 1024*2*1024) {                       // Проверяем размер
    echo "<h1 STYLE='color:red;'>Размер файла превышает 2 мегабайта.</h1><h2><a href=\"#\" onclick='history.back()'>Вернуться к отправке</а></h2>";
    exit();
}    
$prvrkimya = trim($_FILES["imyfaila"]["name"]);                  // Убираем пробелы с начала и конца оригинального имени фотки
$prvrkimya = substr($prvrkimya, -15);                             // Обрезаем оригинальное имя до 15-и знаков с конца  
$asdfg = pathinfo($prvrkimya);
if ($asdfg['extension'] !== 'jpg') {                       // Проверяем расширение оригинального имени
    echo "<h1 STYLE='color:red;'>Это походу не фотка ни хрена... </h1><h2><a href=# onClick='history.back()'>Вернуться к отправке</а></h2>";
    exit();
}
$prvrkfaila = getimagesize($_FILES['imyfaila']['tmp_name']);//Проверяем, не (removed) ли с  расширением подделов "Content-Type"
if ($prvrkfaila['mime'] != 'image/jpeg') {
    echo "<h1 style='color:red;'>Чёто не тое... </h1><h2><a href=\"#\" onclick='history.back()'>Вернуться к отправке</a></h2>";
    echo '<br/><br/><br/>'.$prvrkfaila['mime'];
    exit();    
}
move_uploaded_file($_FILES['imyfaila']['tmp_name'], "knigajiz/vremenni.jpg"); // Если фотка всё выдержала, помещаем её в папку под временным именем
?>




п. 2.3. главы VIII Соглашения по использованию /Cheery/

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 13:00 02-07-2009 | Исправлено: Cheery, 19:45 02-07-2009
zerkms

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
А он у меня пишет «image/gif». И это то при том, что я загружаю реальную фотографию с расширением «jpg»!!!!  

расширение ничего не значит. открой файл и посмотри сигнатуру в начале:
&#255;&#216;&#255;&#224;&#12544;JFIF - jpg
GIF89 - gif
Посмотри как работать с getimagesize(), ты не совсем понимаешь.
 
далее - смотри в документацию по move_uploaded_file() - посмотри, что оно используется в паре с if() обычно.
 
if ($asdfg['extension'] !== 'jpg') {                       // Проверяем расширение оригинального имени  
зачем тебе проверять расширение?????? getimagesize() возвращает тебе и так тип картинки.
 
лапша - это значит адская смесь кода и отображения. это значит неподдерживаемый и нечитаемый код.
 
$prvrkfaila = getimagesize($_FILES['imyfaila']['tmp_name']);//Проверяем, не (removed) ли с  расширением подделов "Content-Type"
if ($prvrkfaila['mime'] != 'image/jpeg') {
этот код работать не может. getimagesize() возвращает числовой массив. ассоциативного ключа mime в нём быть не должно.

----------
tvfёdor - оперативно уведомляет о раздачах rutracker | Блог об иммиграции в Новую Зеландию





Речь фильтруем /Cheery/
Даже когда просто копируем из поста выше

Всего записей: 387 | Зарегистр. 07-05-2004 | Отправлено: 13:24 02-07-2009 | Исправлено: Cheery, 19:44 02-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
zerkms, я думаю над тем, что ты сказал, но вообще то....  
Вот здесь, http://il.php.net/manual/en/function.getimagesize.php , написано вот это, копирую целиком:
"
 
Index 2 is one of the IMAGETYPE_XXX constants indicating the type of the image.  
 
Index 3 is a text string with the correct height="yyy" width="xxx" string that can be used directly in an IMG tag.  
 
mime is the correspondant MIME type of the image. This information can be used to deliver images with correct the HTTP Content-type header:  
 
Example #1 getimagesize() and MIME types
 
<?php
$size = getimagesize($filename);
$fp = fopen($filename, "rb");
if ($size && $fp) {
    header("Content-type: {$size['mime']}");
    fpassthru($fp);
    exit;
} else {
    // error
}
?>  
"
Получается, getimagesize() возвращает не числовой массив. а смешанный, и один из его ключей как раз "['mime'].
 
Добавлено:
Вообще то, при написании кода, я руководствовался вот этой http://habrahabr.ru/blogs/php/44610/ статьёй. Там, в часности, автор доказывает, что всегда имеет смысл проверять расширение загружаемого файла, что бы там не было, ну например, "РНР".

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 13:41 02-07-2009 | Исправлено: israel_rider, 13:59 02-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Попрос номер раз.  
zerkms говорит, что это:
$prvrkfaila = getimagesize($_FILES['imyfaila']['tmp_name']);  //Проверяем, не накололи ли с  расширением, подделов "Content-Type"  
if ($prvrkfaila['mime'] != 'image/jpeg') {  
    echo "<h1 style='color:red;'>Чёто не тое...  </h1><h2><a href=\"#\" onclick='history.back()'>Вернуться к отправке</a></h2>";  
    echo '<br/><br/><br/>'.$prvrkfaila['mime'];  
    exit();      
}
Работать не может, поскольку getimagesize(); возвращает числовой массив, а не ассоциативный. Я же прочитал совсем другое, мануал РНР процитирован выше.  
Вопрос, как же оно на самом деле? И кста…. Хоть мой код и обозвали «лапшой», но проверяю я его всегда очень тщательно. Всё, что я написал работает.
 
 
Добавлено:
Вопрос номер два
«отрубить php в дире, куда заливается картинка»  
Если уважаемый Черри имеет в виду не допустить, что бы фотка записалась с расширением «РНР», то я в принципе, после того как меняю размер залитой фотографии, копирую её на её постоянное место жительства вообще под другим именем. И конечно же расширение в этом имени стандартное, «фотографическое».  
Вопрос, это имелось в виду?
 
 
 
Добавлено:
Вопрос номер 3

Цитата:
Посмотри как работать с getimagesize(), ты не совсем понимаешь.  

Родной мануал РНР по фукции getimagesize() я изучил досканально. Прочитал его вдоль и поперёк. Соблаговолите указать конкретно, где именно в данном вопросе я ошибаюсь?

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 00:25 03-07-2009 | Исправлено: israel_rider, 00:39 03-07-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider

Цитата:
Работать не может, поскольку getimagesize(); возвращает числовой массив, а не ассоциативный. Я же прочитал совсем другое, мануал РНР процитирован выше.  


Цитата:
<?php
  print_r(getimagesize("image.png"));  
?>
 

ответ

Цитата:
Array ( [0] => 259 [1] => 32 [2] => 3 [3] => width="259" height="32" [bits] => 8 [mime] => image/png )  


Цитата:
Вопрос, это имелось в виду?

имелось в виду - для безопасности. ресайз приводит к потере качества, без него для безопасности можно и отрубить

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:46 03-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Так, понял. По поводу getimagesize()  вопрос закрыт. Черри супер наглядно продемонстрировал, что getimagesize()  возвращает смешанный массив. Я всё сделал правильно.
Далее, мне без ресайза не обойтись. Пользователи заливают мне фотки любых размеров, я же вывожу их им в двух стандартных размерах – большом и «провью». С этим я тоже успокоился. И, кста. В той статье с Хабрахабра, ссылку на которую я привёл, автор доказывает, что обрубить расширение РНР тоже не панацея. При определённых настройках сервера он может обрабатывать графические файлы как файлы РНР. И тогда, даже без расширения РНР скрытый в файле вредоносный код начнёт работать. Получается, единственная панацея – ресайз.

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 01:00 03-07-2009 | Исправлено: israel_rider, 01:01 03-07-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider

Цитата:
При определённых настройках сервера он может обрабатывать графические файлы как файлы РНР

очень и очень редко. почти никогда, а уже если так настроил админ - его проблемы
CGI в принципе запрещать надо.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:17 03-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ещё вопросик, плиз. Можно регулярное выраженице готовенькое? А то, если я ещё с регулярными выражениями начну сейчас запариваться, у меня точно крыша отъедет. Нужно проверять данные, вводимые пользователем. Имя, адрес…. По идее, должны быть русские буквы, латиница…. И всё? Вот так можно проверять?
if (preg_match("/[^(\w)|(\@)|(\.)]/",        $imel))     $imel='Ошибка';
Хотя, всё равно понять не могу. У меня пользователи вводят большие куски текста через текстареа. И эти большие куски текста сказано проверять так:
$malavabg=htmlspecialchars($malavabg, ENT_QUOTES);  
Вопрос. Если текстарея я всё равно не проверяю при помощи регулярных выражения, какой смысл проверять при помощи регулярных выражений что то другое? Злоумышленник, то, что он захочет ввести введёт через текстареа. Так тогда уж всё можно проверять при помощи только htmlspecialchars()? Выходит, если я хоть гдето не проверяю при помощи регулярных выражений, я могу тогда в данном коде не использовать их вообще?
 

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 01:18 03-07-2009 | Исправлено: israel_rider, 01:19 03-07-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider

Цитата:
Можно регулярное выраженице готовенькое?

PHP: Регулярные выражения (RegExp, Regular, eregi, preg)
 

Цитата:
И эти большие куски текста сказано проверять так:

это - не проверка. а всего лишь замена кавычек на их html entities
 

Цитата:
Вопрос. Если текстарея я всё равно не проверяю при помощи регулярных выражения, какой смысл проверять при помощи регулярных выражений что то другое? Злоумышленник, то, что он захочет ввести введёт через текстареа. Так тогда уж всё можно проверять при помощи только htmlspecialchars()? Выходит, если я хоть гдето не проверяю при помощи регулярных выражений, я могу тогда в данном коде не использовать их вообще?  

проверяете что??? с этим определитесь сначала. зачем что то писать, если не понимаете от чего защищает? при введенных данных вам нужно
1) защититься от ввода html тегов (XSS)
2) защита от SQL injection в SQL
вот и все.. первое - htmlentities или htmlspecialchars  
второе - mysql_real_escape_string

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:23 03-07-2009 | Исправлено: Cheery, 01:32 03-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Про mysql_real_escape_string вообще первый раз слышу! Всё понял, сейчас буду читать про неё. Огромный преогромный сенкс!!!!!!!!!!!!!!!!!!!!!!! Хоть какую то ясность обрёл. Уж если не сейфовый замок, то хоть как то двери и окна прикрыл.  

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 01:31 03-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Уважаемые Cheery и другие проффессионалы. А как же мне защититься от XSS-атаки, если злоумышленник ввдодит мне в поле формы скрипт, написанный в кодировке UTF-7? Функция htmlspecialchars() в этим случае мне не поможет.  
 
Добавлено:
Вот, сделав вывод из того, что сказал Cheery, написал функцию для проверки данных, вводимых пользователем в поля формы.  
<?php
function antuvzlomsql($fromfrm)
{
    if (!is_numeric($fromfrm)) {   // Если переменная - число, то экранировать её не нужно, если нет -   экранируем  
              $fromfrm = htmlspecialchars($fromfrm, ENT_QUOTES);
              $fromfrm = mysql_real_escape_string($fromfrm);
    }
     return $fromfrm;
}
?>  
Вопрос. Достаточно ли надёжна такая проверка, если после проверки эти данные предполагается заносить в базу данных, а потом выводить на страницах сайта?

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 13:16 04-07-2009 | Исправлено: israel_rider, 16:17 04-07-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider
а если массив?  
ну это смотря что посылаться для проверки будет.

Цитата:
А как же мне защититься от XSS-атаки, если злоумышленник ввдодит мне в поле формы скрипт, написанный в кодировке UTF-7? Функция htmlspecialchars() в этим случае мне не поможет

где об этом написано? делайте сайт в UTF-8 и работайте с этой кодировкой

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:35 04-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
где об этом написано?
Написано в этой http://www.captcha.ru/articles/antihack/  статье, в параграфе «XSS и UTF-7». У меня сайт естественно в UTF-8, но в статье написано, что браузер, встретив символы UTF-7, может переключиться на неё , и выполнить вредоносный код.

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 20:45 04-07-2009
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider

Цитата:
что браузер, встретив символы UTF-7, может переключиться на неё

с чего бы, если это будет в каком то куске страницы?
если, конечно, не разрешаете вставлять что то в head область страницы
но ведь вы же выдаете content-type с кодировкой? ему предпочтение и будет отдаваться


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:48 04-07-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Cheery, прошу прощение за непонятливость. Что значит
Цитата:
а если массив?  
Как пользователь может ввести мне через поле формы МАССИВ??!!! И зачем? Как введение массива позволит хакеру взломать сайт? И ни чего не могу понять из данного высказывания, и ни где ни чего подобного не читал!!!!

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 20:50 04-07-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10

Компьютерный форум Ru.Board » Интернет » Web-программирование » DEL


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru