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

    +144.8

    1. 1
    2. 2
    $uploaddir = '../images/';
    $uploadfile1 	= $uploaddir . basename($_FILES['img']['name']);

    все те же индусы

    Запостил: getme, 16 Октября 2009

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

    • А что здесь не так?
      Ответить
    • Действительно :-)
      Ответить
    • Автор, поясни, что здесь не так?
      Ответить
    • ну а с каких пор $_FILES['img']['name'] возвращает полный путь до файла?
      учите матчасть!
      Ответить
      • я не пхпист.. Но насколько я понимаю - то переменная $_FILES получает информацию о своём значении от браузера - а браузеры бывают разные.. ИЕ по-моему передаёт полный путь, файрфокс, хром - только название сайта..
        Опять же.. я не php'ист.. такое наблюдал в Perl'e - на одной и той же странице с одним и тем же браузером в $q->param('img') в одном случае был полный путь, в другом название
        Ответить
      • Сам учи матчасть, basename возвращает имя файла без расширения, не учитывая полный путь.
        Ответить
        • http://ru2.php.net/basename
          <?php
          $path = "/home/httpd/html/index.php";
          $file = basename($path);         // $file is set to "index.php"
          $file = basename($path, ".php"); // $file is set to "index"
          ?>

          Так что в данном случае возвращает с расширением. Учи матчать, guest!
          Ответить
    • видимо здесь вообще никто ничего не понял, $_FILES['img']['name']
      возвращает только имя файла, basename - здесь вообще не нужен. В этом
      то и ошибка.
      Ответить
      • > basename - здесь вообще не нужен. В этом то и ошибка.

        Мде? А почему тогда на официальном сайте PHP, в официальном описании работы с аплоадом файлов, basename таки используется? Наверное, это ж-ж-ж-ж неспроста?

        http://ru2.php.net/manual/en/features.file-upload.post-method.php
        <?php
        // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
        // of $_FILES.

        $uploaddir = '/var/www/uploads/';
        $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

        (хвост поскипан)

        Из-за таких вот горе-оптимизаторов, выкидывающих "ненужные" функции, потом у людей веб-интерфейсы не работают. Резюме: код хороший, автор - говно.
        Ответить
        • ты видимо такой же индус любитель копипаста?
          ты сначала проверь, а потом пиши что-то.
          Ответить
          • во всех браузерах проверил?
            Ответить
          • кстати, сильно приколишься, если я тебе зашлю файл с именем "../../../var/pwd" или как-то так? :)
            Ответить
            • мне ты ничего не зальешь.
              Ответить
              • слепая наивность в интернетах? вставлю шланг и залью луч поноса
                Ответить
                • у тебя диарея? это очень плохо друг, лучше покажись врачу.
                  Ответить
          • > ты видимо такой же индус любитель копипаста?
            Спишем хамство на альтернативную одаренность автора.

            > ты сначала проверь, а потом пиши что-то.
            Видишь ли, в поле "name" содержится ровно то, что прислал тебе клиент. Надеяться, что клиент тебе всегда будет слать именно голое имя файла, без путей - ламеризм чистой воды. Этого факте не отменяет даже то, что ты проверил на последнем файрфоксе и опере, и у тебя все работает. :)
            Ответить
            • так ты уверен что PHP тупо берет имя файла с headers
              и подставляет его в ['name']?
              Ответить
              • > так ты уверен что PHP тупо берет имя файла с headers
                Юный обличитель сейчас будет обличать этих тупых критиканов, да? :) Не получится.

                PHP 5.2.10 - путь стрипает.
                PHP 4.1.x - не стрипает, с чем мне в свое время пришлось поиметь немало веселых часов.

                А тот, кто пишет под конкретную версию PHP, рискует поиметь многие часы геморроя при поддержке собственного кода.
                Ответить
                • ну наконецто, хоть кто -то прозрел. Алилуя!
                  загружать надо под другим именем это 2ое.
                  Ответить
                  • > загружать надо под другим именем это 2ое.
                    Ах вот оно что! Ну наконец-то пришел ты и открыл всем глаза!

                    Народ, на самом деле функция basename не нужна! Просто если пользователю не удалось загрузить файл, ему нужно просто загрузить файл под другим именем. Это же очевидно, до этого любой ламер додумается!

                    А еще пользователю желательно сменить браузер. А если это невозможно - ему нужно вручную сформировать HTTP-запрос и отослать его на сервер (делов-то!).

                    Спасибо тебе, getme, просветил так просветил. Зато мы избавимся от гадкой, никому не нужной функции basename (анафема!) и сэкономим аж 16 микросекунд процессорного времени.

                    Еще раз повторю: горе-оптимизаторов надо стрелять. Вместо того, чтобы написать надежный код (пусть и излишний в чем-то именно для данных настроек сервера), оптимизатор включает "смекалку" и убирает все проверки. Да и пофиг, что дыра на дыре - зато у него работает! Он, блин, проверял.
                    Ответить
          • Не, ну basename нужен!! (См. http://govnokod.ru/1987#comment8671)
            Ответить
    • IE вроде как шлёт C:\path\fo\file.ext, так что basename нужен
      Ответить

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