1. PHP / Говнокод #2745

    +157.2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    public function is_image($mime) {
    		//Функция проверяет по mime типу является ли поступивший файл изображением
    		$images_mime = array('image/jpeg','image/pjpeg','image/png','image/cgm','image/fits','image/g3fax',
    							'image/gif','image/ief','image/jp2','image/jpm','image/jpx','image/naplps',
    							'image/prs.btif','image/prs.pti','image/t38','image/tiff','image/tiff-fx',
    							'image/vnd.adobe.photoshop','image/vnd.cns.inf2','image/vnd.djvu','image/vnd.dwg',
    							'image/vnd.dxf','image/vnd.fastbidsheet','image/vnd.fpx','image/vnd.fst',
    							'image/vnd.fujixerox.edmics-mmr','image/vnd.fujixerox.edmics-rlc','image/vnd.globalgraphics.pgb',
    							'image/vnd.microsoft.icon','image/vnd.mix','image/vnd.ms-modi','image/vnd.net-fpx',
    							'image/vnd.sealed.png','image/vnd.sealedmedia.softseal.gif','image/vnd.sealedmedia.softseal.jpg',
    							'image/vnd.svf','image/vnd.wap.wbmp','image/vnd.xiff');
    		if(!in_array($mime,$images_mime)) {
    			//Не было найдено совпадений mime типа - это не картинка
    			return false;
    		}
    		else {
    			//Было найдено совпадение mime типа
    			return true;
    		}
    	}

    Кучка бредокода ради закрытия уязвимости.

    Запостил: Subsanek, 10 Марта 2010

    Комментарии (28) RSS

    • Лучше заливать через библиотеку GD.
      Ответить
      • Да, но эта самая библиотека не везде установлена, так что если ее нет, то юзер вообще не загрузит картинку, а это не гуд.
        Потом через GD напишу уменьшение размера.
        Ответить
        • А откуда тогда берется mime?
          Ответить
          • Дык $_FILES['filename']['type'];
            Функция кстати нормально работает и закрыла критическую уязвимость в проекте.
            Ответить
            • А Вы знаете, что $_FILES['filename']['type'] передает браузер?
              Т.е., если я буду отправлять файл сам и подставлю mime как у картинки, то я смогу загрузить любой файл.
              Ответить
              • В коде, где собственно происходит загрузка уже проверяется, что все файлы и данные были переданы именно из формы.
                Ответить
                • И как это проверяется?
                  Ответить
                  • elseif (isset($_POST['submit_bottom']) ) {
                    Ответить
                    • Если я смог отправить файл, то труда не составит отправить другие POST-данные
                      Ответить
                      • Хм, и как с этим бороться?
                        P.S в проекте загрузка картинок только в админском разделе происходит.
                        Так что думаю это не так уязвимо будет, но все же интересно как бороться с этим?
                        Ответить
                        • Для админки, конечно, не страшно. А так как в первом комменте было, через GD
                          Ответить
                        • Обратись к функции getimagesize() - она не требует GD, а mime-тип изображения определяет успешно.
                          Ответить
                          • Что мешает запихнуть в начало файла заголовок от картинки, а дальше написать все тот-же php код(или от чего там защищаются)?
                            Ответить
                        • Никак. Все данные поступающие в скрипт потенциально подделаны.
                          Ответить
                    • блин, как я сразу не доумался проверять входящие данные по наличию ключа submit_BOTTOM =) ??
                      Ответить
                      • Я знаю, что криво написано, пока влом исправлять.
                        Все потом.
                        Ответить
        • Если у хостера нет GD, то и нечего там размещать проекты, требующие такой безопасности.

          ЗЫ проверка Mime это скорее не преграда от хакера, а просто ограничение. Мало ли человек нечаянно начнет bmp загружать или tiff (если это не входит в проект).
          Ответить
    • Код вполне нормальный для собственной заливалки изображений.
      Если понаглеть, то :
      /* 1 */ $images_mime = array('jpeg','pjpeg'....); // меньше пхать в память
      /* 2 */ return (!in_array('image/'.$mime,$images_mime))
      Ответить
      • Спасибо, исправлю.
        Ответить
      • Неа, так не работает.
        Ответить
        • а тьфу, двое суток не сплю...

          $images_mime верни как было, просто
          return (!in_array($mime,$images_mime))

          PS - почитай про ф-цию exif_imagetype()
          ^_^
          Ответить
      • !
        лишний
        Ответить
        • Теперь работает.
          А то я что-то жирно написал, на производительность влиляло бы плохо.
          Ответить
    • Всем спасибо, все равно проект только в стадии разработки так что завтра все допилю.
      Ответить
    • ещё убери пунктационные ошибки, глаза хочется выколоть
      Ответить
      • Это само собой на стадии тестирования.
        Ответить
        • Комментарии тоже в стадии тестирования?
          Ответить
    • В общем да. На тестирование много время просто отводить и попутно весь код пересмотреть и подкорректировать.
      Я так например делаю.
      Ответить

    Добавить комментарий