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

    +161

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    //Создаём новое изображение из старого // gif png jpg
                if (preg_match('/[.](GIF)|(gif)$/', $filename)) {
                    $src = imagecreatefromgif($target);         //если оригинал был в формате gif,
                } else if (preg_match('/[.](PNG)|(png)$/', $filename)) {
                    $src = imagecreatefrompng($target);         //если оригинал был в формате png,
                } else if (preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
                    $src = ImageCreateFromJPEG($target);        //если оригинал был в формате jpg,
                } else {
                    throw new Exception('формат не определён, шли-бы вы лесом');
                }

    Запостил: хуита, 20 Января 2014

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

    • Школьники апнулись раньше die писали.
      Ответить
    • Виндузятники определяют тип файла по расширению и не знают о функции getimagesize. НЕНАВИСТЬ!!!
      Ответить
      • Не скажите, дорогой товарищ! Я был свидетелем того, как картинкам каптур намеренно задавали неверное расширение, (файл "ololo.gif" на самом деле *.png)чтобы вызвать ошибки в работе всевозможных спамеров/хрумеров и тп. Я всегда в блокноте открываю, и смотрю заголовок.
        Ответить
        • > картинкам каптур намеренно задавали неверное расширение
          +1
          А "виндузятникам" предлагается ребус:
          http://radikal.ua/data/upload/0fccf/6895e/c5de0f9517.jpg
          Ответить
          • HTTP/1.1 200 OK
            Server: nginx/1.0.14
            Date: Tue, 21 Jan 2014 05:05:34 GMT
            Content-Type: image/jpeg
            Content-Length: 108947
            Last-Modified: Tue, 21 Jan 2014 01:20:24 GMT
            Connection: close
            Accept-Ranges: bytes
            P.S. Кто тут говорил про миме?
            Ответить
            • closesocket(inkanus_gay_http_server);
              Ответить
            • GIF89a,·чя

              И все таки... это гифка. Браузер не смотрит на тип контента, он определяет тип изображения сам - в отличие прог для спаминга.
              Ответить
            • Кстати, что будем делать со nginx'ом, который для гифки возвращает тип image/jpeg? Отправим в топку за негодность?
              Ответить
        • >Я всегда в блокноте открываю, и смотрю заголовок.
          извращенец.
          file "${path_to_image}"
          Ответить
        • О том и речь: getimagesize возвращает РЕАЛЬНЫЙ тип графического фала - не обращая никакого внимания на его расширение.
          Ответить
        • > Я всегда в блокноте открываю, и смотрю заголовок.
          ТАк и вижу, как блокнот залипает так, что под аккомпанемент тормозов приходится убивать процесс.
          Ответить
          • Ну дык file ко-ко-консольный и в винде его из коробки нет, far ко-ко-консольный, а TotalCommander поставить, видимо, не судьба...

            Вот и мучается бедняга Стертор...
            Ответить
            • Еще Чехов сказал, в первоисточнике всего хорошего лежит гадость. Для того, чтобы обладать знаниями нужно проесть плешь и сжечь глаза о инвертор.
              Ответить
              • >сжечь глаза о инвертор.
                Это как? :)

                Кстати, в ноутбучном мониторе есть какая-то хрень, когда я коснулся ее (изолятор), меня как будто сильно обожгло. Что это было?
                Ответить
                • Инвертор - это лампа, которая освещает экран. Сам по себе экран не светится, только рисует.
                  http://ko.com.ua/img/ko/2005/49/012482.jpg


                  Хз, что. Мой ноутбук сгорел 4,5 лет назад ;)
                  Ответить
                  • Инвертор - это хрень, которая дает высокое напряжение для лампы. Лампа и есть лампа.
                    Ответить
                  • > http://ko.com.ua/img/ko/2005/49/012482.jpg
                    http://ko.ko.ko.com.uaa/img/ko/2005/49/012482.jpg
                    Время, проведённое на ГК в последние дни не прошло даром.
                    Автоматический детектор "ко-ко-ко" уже не отключишь.
                    Ответить
                  • И кстати, в данном случае название «инвертор» является жаргонным и не отражает его назначения. Оно унаследовано от аналогичного устройства, который из однополярного постоянного напряжения вырабатывал двухполярное.

                    Допустим, на входе плюс относительно массы. Зарядим конденсатор входным напряжением, потом оторвём его и подключим плюсом к массе. Ололо, мы получили отрицательное относительно массы напряжение! Инвертор!

                    Та хрень, которая питает люминесцентную лампу, тоже из постоянного напряжения вырабатывает переменное, чтобы затем его выпрямить, но только использует трансформатор для повышения напряжения, поэтому с тем же успехом может называться и умножителем.

                    К вопросу Анонимба, что это было: 600 вольт — не укус комара.
                    Ответить
                    • >>600 вольт — не укус комара.
                      ~1000, люминесцентная же.
                      Ответить
                    • >однополярного постоянного напряжения
                      Что, простите?

                      Я не касался проводов, я только руку поднес, и это был не удар током, а именно ожог.
                      Ответить
                      • > не удар током, а именно ожог
                        А это скорее всего из-за довольно высокой частоты инвертора - от постоянки удар, от 50гц ощутимо трясет, а от килогерца и выше просто жжется.
                        Ответить
                        • Я же написал, проводов не касался.

                          От 9вольт, кстати, можно миниожог (химический?) получить.
                          Ответить
                          • > Я же написал, проводов не касался.
                            А при 600в (если верить инканусу) и не надо касаться голых проводов... 600в пробивают чуть больше полумиллиметра воздуха. Видимо изоляция на той детальке была слишком тонкой, вот тебя и зацепило пробоем.
                            Ответить
                            • Зависит от влажности воздуха, тащемта.
                              Ответить
                              • <Оффтоп>А мне в детстве нравилось выдирать "присоску" из кинескопа старого ч\б телека, подносить ее к металлическому шасси того же телека, и смотреть на красивые синие разряды...</Оффтоп>
                                Ответить
                                • Разряды высокочастотных тесла-катушек выглядят красивее.
                                  Ответить
                                • >>подносить ее к металлическому шасси того же телека
                                  Ваш покорный слуга выдрал сей выпрямитель целиком из телика, нарадовался и тут же сжег, подав искру из присоски на корпус одного из транзисторов (
                                  Ответить
                          • >>От 9вольт, кстати, можно миниожог (химический?) получить.
                            Унылый троллинг.
                            Ответить
                            • А ты «Крону» лизать пробовал?
                              Ответить
                              • Ты что! Все, кто пробовал ее лизать, умерли от химического миниожога!
                                Ответить
                                • Среди ублюдков шёл артист
                                  С «Кроною» в зубах мёртвый программист...
                                  Ответить
                                  • Крикнул он "хой!",
                                    Челюсть долой,
                                    Крону он тащил с собой.
                                    Ответить
                                    • Артист при жизни весёлым был
                                      И ударить током он всех любил.
                                      Ответить
                                • > Ты что! Все, кто пробовал ее лизать, умерли от химического миниожога!
                                  Мы об этом никогда не узнаем. Они так и не дошли до больницы. Зато те кто выжили - попали в статистику.
                                  Ответить
                                  • оо. в тред зашли как минимум три гейдевщика, раз поняли шутку.
                                    Ответить
                                    • Как минимум два гейдевщика. Меня просто последнее предложение порадовало.
                                      P. S. А что там на гейдеве было?
                                      Ответить
                                • Это кстати тоже миниожог имхо, язык на кислоту реагирует.
                                  Ответить
                                  • Ток от батарейки вызывает опосредованное раздражение некоторых рецепторов, поэтому и ощущается такой неприятный, кислый вкус.
                                    Ответить
                                    • Самое приколькое - положить под и на язык по монете и подключить 9 вольт.
                                      Ответить
                              • Химический ожог могут вызвать только химические вещества - кислоты, щелочи, белый фосфор, 6-фтористый уран, и тп. дикости.
                                Ответить
                              • У меня не было денег, чтобы ее купить.
                                Поэтому я всегда полизывал самодельный выпрямитель.
                                Ответить
                            • Не унылый, если два контакта приложить в мокрому телу и подержать, остается небольшое повреждение кожи, которое пару дней проходит.
                              Ответить
            • >TotalCommander поставить, видимо, не судьба...
              Да уж.
              Ответить
          • Зависает, блять, жопоблокнот, который грузить файл в оперативку, когда для этого есть файл подкачки: - globalalloc и virtualalloc - есть разница в написании? Если кто не видит, пусть очки протрет.
            Ответить
            • >когда для этого есть файл подкачки:
              Для этого хранят в памяти только показываемый кусок файла, или что-то еще мутят (mmap). А дурачки, использующие блокнот не по назначению, плачут и жрут кактус.
              Ответить
              • Я не плачу и не жру кактус, ибо notepad ++

                [trollface.jpg]
                Ответить
                • >Я не плачу и не жру кактус,
                  >notepad ++
                  /0
                  Ответить
                  • пятая версия хоть и устаревшая но самая безглючная.
                    Попробуй!..
                    Ответить
                    • У меня 6.5, но он всё недалеко от блокнота ушёл в плане открытия файлов. Не верю, что там можно открыть 0.5Мб картинку, не сказав "сука, б*я, открывай"
                      Ответить
                      • Блин, 0.5мб (да даже и 5 и 10), емнип, преспокойно открывалось в блокноте... Еще один несчастный владелец целерона 600?
                        Ответить
                        • > Еще один несчастный владелец целерона 600?
                          Нет.
                          Но если в файле мало переводов строки (как в картинке), начинается сущий ад. Конечно, это может даже быстрее, чем некоторые *.doc в LibreOffice открываются, но по сравнению с исходниками в 50-100кб - невыносимая мука.
                          Таки bormand изменил своё мнение и рекомендует определять тип картинок в notepad++?
                          Ответить
                          • > Таки bormand изменил своё мнение и рекомендует определять тип картинок в notepad++?
                            А куда деваться? file же на винде изкоробки не стоит...
                            Ответить
                            • да так ведь мышку сломать можно открывать кококонсолечку, чтобы запустить твоё филе! что за мракобѣсы опять тут собрались!!
                              Ответить
                        • Хуй там, у меня даже текстовик на 600 кил тормозил.
                          Ответить
                      • Jpg, 15MB, меньше секунды. Jpg, 21MB, меньше секунды. Jpg, 49MB, около секунды. И, наконец, Иванов - Явление мессии, jpg, 217MB, около четырёх секунд. Чяднт?
                        Ответить
                        • > jpg, 217MB
                          O_o
                          Ответить
                        • Хм, открыл папку с файлами с фотоаппарата
                          jpg, 1.7Мб, менее секунды, 12 тысяч строк
                          mov, 95.2Мб, секунды три, 854 тысячи строк
                          полунетбук с core i3 и диском 5400 об/мин

                          Мда, прошу прощения, в этих файлах слишком много строк. Просто я под впечатлением был: в последний раз открывал JSON с данными по ГК - 74Мб и ни одного переноса строки. Эта хрень открывается долгие секунды и минуты и заставляет компьютер задуматься, если нажмёшь не ту кнопку.
                          Ответить
                          • В выгрузке ФИАС есть замечательный файл AS_HOUSE_всякаяфигня.xml. Весит он 8 гиг, и в нем нету ни одного перевода строки...

                            Отличный полигон для испытания потоковых парсеров и заливалок в СУБД ;)
                            Ответить
                            • Спасибо за наводку! А то я, как дурак, убивал редакторы дампом Википедии, в котором между переводами строк всего-то мегабайт. ФАР, кстати, дамп Википедии открывал на редактирование, но при попытке поиска с заменой вылетал. А sed справился.
                              Ответить
                              • Кстати синий слонёнок съел эту базу и не подавился. На довольно дохлом компе запросы типа "покажи номера домов на улице Х города Н" отрабатывают за считанные миллисекунды. Вот, что индекс животворящий делает!
                                Ответить
                  • А вы какой блокнот юзаете?
                    Ответить
        • > вызвать ошибки в работе всевозможных спамеров/хрумеров
          Это на чем же их надо писать, чтобы они от этого ломались?

          Большинство адекватных графических библиотек вполне так автодетектят формат картинок по контенту, и смотрят на эти попытки как на говно :)
          Ответить
          • http://programmers.meximas.com/

            вот сегодня нашел. Даже js может.
            Ответить
          • Очень интригует. А можно названия пары штук? Я вам спасибо скажу.
            Ответить
      • и почему ж не по миме?
        Ответить
        • 1. Файл может быть локальным.
          2. Сервер (или браузер, когда постит файлы через форму) может возвращать бессмыслицу типа application/octet-stream.
          Ответить
          • > Файл может быть локальным.
            В пингвиноси файлы тоже могут быть локальными, но кого это ебет волнует? :)

            > бессмыслицу типа application/octet-stream
            Ну если они даже для картинок не могут адекватно определить mime тип - втопку такие браузеры\сервера.
            Ответить
            • 1. Жду пример кода на пхп, который будет определять миме-тип локального файла.

              2. В некоторых случаях выбирать не приходится:
              а) нужно забрать изображение с чужого кривого сервера;
              б) нужно пофиксить проблему, не заставляя пользователя обновлять браузер.
              Ответить
              • http://www.php.net/manual/ru/function.finfo-file.php - не то?
                Ответить
                • Принято. Если я правильно понял, то это аналог уже упомянутой команды file, т. е. более универсальный путь, чем getimagesize, поскольку детектирует большее количество типов файлов.

                  Но с другой стороны, finfo_file обладает недостатками:
                  1. Навязывает лишние вызовы (finfo_open, finfo_close).
                  2. Зависит от наличия файла magic.mime.
                  3. У getimagesize есть приятный бонус в виде возвращения размера изображения.

                  P.S. Если размер не нужен, то можно посмотреть exif_imagetype.
                  Ответить
              • > нужно забрать изображение с чужого кривого сервера;
                Дык оно при любом mime типе заберется. Ну разве что браузер его может не показать, но скачать то можно в любом случае.

                > нужно пофиксить проблему, не заставляя пользователя обновлять браузер.
                А mime тип, который отправляет браузер, вроде бы из пыхи и не достать никак. Вот и остается смотреть на сам файл, который пыха выложила во временную папку. А тут все сводится к случаю с локальным файлом.
                Ответить
                • 1. Заберётся всегда. Но может возникнуть проблема на этапе:
                  //Создаём новое изображение из старого // gif png jpg

                  2. Что отображает массив $_FILES?
                  Ответить
                  • А, я наврал, все-таки в $_FILES есть mime тип, переданный браузером:
                    The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.

                    > Но может возникнуть проблема на этапе
                    А тут уже очередное мудачество PHP: нет функции, которая загружала бы рисунок любого известного пыхе типа (или я просто не могу ее найти), а есть только fromjpg, frompng и т.п.. Была бы такая функция - проблемы бы не было.
                    Ответить
                    • Да, набор функций для одного и того же - это пыхомудачество.
                      Ответить
                    • Функция есть: http://php.net/manual/en/function.imagecreatefromstring.php
                      Но грузить графический файл целиком в переменную, чтобы потом передать его содержимое функции — не меньшее мудачество.

                      На самом деле решение проблемы — отказаться наконец-то от уёбищной GD и перейти на Image Magick, но её нет на хостингах.
                      Ответить
                      • ее нет на хостингах -> пыхеры не могут ее юзать -> пыхеры ее не юзают -> пыхерам она не нужна -> ее нет на хостингах

                        Порочный пыхокруг.
                        Ответить
      • применять функцию getimageSIZE для того что бы узнать тип файла, наверное такое возможно только в пхп.
        Ответить
    • >throw new Exception
      Свои типы исключений пыхари еще делать не научились?
      Ответить
    • А я правильно понял, что регулярку мы обсуждать не будем?
      Ответить
      • А че ее обсуждать?
        Ответить
        • Чтобы ты спросил.
          Ответить
          • Ну теперь то все довольны?)
            Ответить
            • Я недоволен! Говно же: http://ideone.com/M7mI4k
              Ответить
              • скобочки около или убери и радуйся
                Ответить
              • /[.](JPG)|(jpg)|(jpeg)|(JPEG)$/

                /\.jpe?g$/i
                Ответить
                • Можно я тоже вброшу, я недавно начал учить регуллярки:
                  \.[jJ][pP][eE]{0,1}[gG]$
                  // соответствует ли extension jpeg ?
                  Ответить
                  • да, соответствует

                    смотри, флаг i вырубает регистр
                    поэтому
                    /\.jpe{0,1}g$/i

                    а {0,1} это ?

                    Поэтому приходим к

                    /\.jpe?g$/i
                    Ответить
                    • возбуждает.
                      Ответить
                      • решай кроссворд
                        http://uzer.com.ua/cross/
                        Ответить
                        • Издеваешься, да?
                          Ответить
                          • нет. я решил в тот же день, как начал регулярки учить. собственно больше одного дня учить и не требуется
                            Ответить
                            • Как его решать, хоть? Что нужно делать?
                              Ответить
                              • на против строки есть регулярка. строка должна матчится регуляркой
                                Ответить
                                • Не, что-то я его не одупляю, уже глаза болят. Потом посмотрю.
                                  Ответить
                                  • В хабропосте 206858 обсуждалось http://regex.alf.nu/
                                    По-моему, это более уместно, если хочется оттачивать навык работы с регулярными выражениями.
                                    Анальный кроссворд Кегдана - не что иное, как попытка поиметь мозг. Это всё равно, что предлагать судоку ребёнку, изучающему цифры, или в учебник по китайскому языку поместить математические задачи только потому, что сформулированы они на китайском. Для общего развития и тренировки ума полезно, но не нужно.
                                    Ответить
                                    • а там ответы есть?

                                      Имхо это сложнее.
                                      Ответить
                                      • > а там ответы есть?
                                        Ответов нет, разве что можно почитать мнения людей на хабре. К тому же, там много заданий, которые не парсятся регулярками, где верного ответа в общем случае нет, а есть только хитрость тренирующегося. Например, в задании про числа (по-моему, кратные трём) кто-то с хабра выделил в регулярке характерные последовательности для чисел из примера вместо написания честной регулярки (которой скорее всего не существует).

                                        > Имхо это сложнее.
                                        Если выводить невыводимые регулярки, то это бесконечно сложно; если особо не задротствовать и в некоторых случаях не матчить всё, то терпимо.
                                        Мне лично тот кроссворд показался какой-то невыносимой мукой, я минут 40 посидел, штук 15-20 букв и понял, что я его никогда не закончу. Всё же, это для любителей задач для развития ума, а мне лень.

                                        Скоро окончательно отупею и стану жквери-программистом-копипастером.
                                        Ответить
                                        • Ну я поковырялся, несколько штук решил, но большая часть...

                                          Вот честно, если бы меня кто то попросил помочь с такой регуляркой я бы ему сказал, что он не понял сути регулярок)

                                          А вообще интересная вещь, но точно не для новичков.

                                          А кроссворд прививает автоматизм. Если такой решить то проблемы типа - я перепутал [ ] и () сразу отпадают
                                          Ответить
                                          • > но большая часть...
                                            > я бы ему сказал, что он не понял сути регулярок
                                            Готовит программиста-теоретика к суровой реальной жизни и реальным задачам, отучает от нагромождения слоёв абстракций :)
                                            Т. е. вместо многолетних раздумий о том, как можно заматчить все простые числа, человек напишет регулярку ограниченного их набора, поскольку во-первых, инт - до пары миллиардов только, а во-вторых, он делает сайт для школьников, которым простые числа более 1000 нужны как козе баян.

                                            Кроссворд я бы отправил в качестве задания на олимпиаду по математике. А вот если regex.alf.nu не подходит для новичков, то лучше вспомнить ссылку борманда. Она уж идеально подходит, примеры там для регулярок адекватные и, что важно, думать не надо.
                                            Ответить
                                            • Ну я то не новичок. 10 решил, остальные в процессе
                                              Ответить
                                              • >>> А вообще интересная вещь, но точно не для новичков.
                                                >> А вот если regex.alf.nu не подходит для новичков, то лучше вспомнить ссылку борманда
                                                > Ну я то не новичок.
                                                Я думал, мы об абстрактных новичках говорили, а не переходили на личности :)
                                                Ответить
                                                • ))) я просто подумал что ты в мой огород камень кинул) Сорри)
                                                  Ответить
                    • >jpe?g
                      jpeg?
                      Ответить
              • if (preg_match('/[.](PNG)|(png)$/', $x)) {


                trollface.PnG

                [Trollface.jpg]
                Ответить

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