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

    +163

    1. 1
    $model = new $_POST['form_model'];

    Краткость,
    сестра таланта,
    Yii,
    FormController,
    ...

    Запостил: BroadcastAddress, 10 Апреля 2014

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

    • Идеально!
      Ответить
    • а я и не знал, что у этой проститутки такая дырка!
      Ответить
      • А может там выше if (array_key_exists($_POST['form_model'], $allowed_models)) или какое-нибудь if (model_exists($_POST['form_model'])) ?
        Ответить
        • Хорошо если так. Если нет, то это просто... волшебно.
          Ответить
          • Волшебно было бы так:
            $controller = new $_POST['controller'];
            $controller->$_POST['action']();
            Ответить
            • Аргументы забыл.
              call_user_func_array(array(new $_POST['controller'], $_POST['action']), $_POST['args']);
              Ответить
              • А как массив пропихнуть в args?
                Ответить
                • Да, действительно, не подумал.
                  Ну, можно через eval :)
                  Ответить
                • > А как массив пропихнуть в args?
                  ?x=1&x=2 По-идее должен создать массив.
                  Ответить
                  • переопределит. только так:
                    x[]=1&x[]=2
                    Ответить
                    • Какая-то исключитльно ПХП-стайл совместимость:
                      >>> from urlparse import parse_qs
                      >>> parse_qs('x=1&x=2')
                      {'x': ['1', '2']}
                      Ответить
                      • В каком RFC эти массивы описаны? Если ни в каком - то вполне логичный уровень "совместимости" :)
                        Ответить
                        • Задался целью, но не могу найти где этот момент обсуждается. Вообще не понятно, что это за формат. Тем не менее, Дотнет, Флеш и утилиты Апачей вроде как понимают питоновский вариант (за ПХП-вариант не поручусь). Ж.квери, интересно в этом смысле, вроде вообще не умеет. Браузеры сами не парсят.
                          Я подозреваю, что формат отсюда:

                          application/x-www-form-urlencoded

                          This is the default content type. Forms submitted with this content type must be encoded as follows:

                          Control names and values are escaped. Space characters are replaced by `+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by `%HH', a percent sign and two hexadecimal digits representing the ASCII code of the character. Line breaks are represented as "CR LF" pairs (i.e., `%0D%0A').
                          The control names/values are listed in the order they appear in the document. The name is separated from the value by `=' and name/value pairs are separated from each other by `&'.

                          И на этом объяснение заканчивается.
                          Ответить
                          • Что интересно, следуя этому описанию, юникодные значения в таком виде вообще никак не послать...
                            Ответить
                            • Так их и посылают в кодировке страницы вроде как...
                              Ответить
                              • А если кодировка страницы не utf-8, а ucs-2, ucs-4, utf-16, utf-32?
                                Ответить
                              • Ну это как бы нет возможности всегда сделать. Например, не известна кодовая страница. Я видел другие вариант: с escapeMultibyte - каждый байт сериализации юникодного формата представляется как аски, а потом уже кодируется.
                                Ответить
                                • Т.е. в utf8 а потом каждый байт эксейпить? Ну так браузеры вроде по дефолту так и делают.
                                  Ответить
                                  • Ну только это все равно плохо, т.как нет гарантий, что их правильно прочитают. формат то предписывает только аски.
                                    Ответить
                                    • > формат то предписывает только аски
                                      Не совсем.

                                      RFC 3986 об этом говорит так:
                                      Percent-encoded octets (Section 2.1) may be used within a URI to represent characters outside the range of the US-ASCII coded character set if this representation is allowed by the scheme or by the protocol element in which the URI is referenced. Such a definition should specify the character encoding used to map those characters to octets prior to being percent-encoded for the URI.

                                      Т.е. сваливает указание кодировки и набора допустимых символов на более конкретные спеки.
                                      Ответить
                                    • А вот походу и ответ (из спеки HTML4):
                                      Note. The "get" method restricts form data set values to ASCII characters. Only the "post" method (with enctype="multipart/form-data") is specified to cover the entire [ISO10646] character set.

                                      Т.е. в get'е вообще соснули хуйцов, и в post'е без мультипарта тоже...
                                      Ответить
                                      • А, они в ХТМЛ5 это поменяли.

                                        В 4 нет ни слова про юникод:
                                        http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

                                        В пятом:
                                        http://www.w3.org/TR/html5/forms.html#url-encoded-form-data
                                        Просто офигительная схема :)
                                        Ответить
                                        • Web: фрактал костыля, ёба.
                                          Ответить
                                          • Так что угодно существующее приличное время и сохраняющее обратную совместимость на 90% состоит из костылей.

                                            Яркий пример х86-64. Я считаю ситуацию когда на 64 битном процессоре команда возвращающая 64битное значение кладёт его в два 32битных регистра ненормальной.
                                            Ответить
                                            • Так нехуй байтоёбствовать.
                                              Ответить
                                              • > Так нехуй байтоёбствовать.

                                                И причем тут байтоебство? Асм тут приведен только как один из примеров. Не нравится - бери за пример жабу с ее кучей легаси говна, которое ради совместимости не могут перепилить.
                                                Ответить
                                                • Даже жаба близко не имеет такого количества нелогичного пиздеца, как веб.
                                                  Ответить
                                                  • > Даже жаба близко не имеет такого количества нелогичного пиздеца, как веб.
                                                    Возможно, ты просто ещё недостаточно хорошо знаешь жабу
                                                    Ответить
                                                    • Я и веб недостаточно хорошо знаю, но того, что я узнал, уже хватило.
                                                      Ответить
                                            • >Я считаю ситуацию когда на 64 битном процессоре команда возвращающая 64битное значение кладёт его в два 32битных регистра ненормальной.
                                              А его нельзя адресовать как 64-битный регистр?
                                              Ответить
                                              • eax и ecx? Нет.

                                                приходится rcx двигать на 32 разряда влево и or'ить с rax
                                                Ответить
                                                • > приходится rcx двигать на 32 разряда влево и or'ить с rax
                                                  shld rcx, rax, 32 ; как-то так, или я туплю?
                                                  Ответить
                                                  • Не выйдет: нули в старшей половине мешают. Приходится делать так:
                                                    shl $32, %%rdx;
                                                    or %%rdx, %%rax;
                                                    И я спутал rcx и rdx.
                                                    Ответить
                                                    • > Не выйдет: нули в старшей половине мешают.
                                                      Ах да, совсем забыл про них.

                                                      Кстати, а умножение 64х64 разве медленнее, чем 32х32? Имхо если надо 64 битный результат в одном регистре - можно поюзать настоящее 64 битное умножение, предварительно растянув операнды...
                                                      Ответить
                                                      • Из двух регистров один умножением сделать?

                                                        Команда вызвавшая у меня батхёрт была rdtsc. С ней к сожалению ничего не сделать. Только последствия разгребать.
                                                        Ответить
                                                        • > Команда вызвавшая у меня батхёрт была rdtsc.
                                                          Ааа, да я думал, что ты умножал числа и получил ответ в двух регистрах. С rdtsc да, хер че сделаешь.
                                                          Ответить
                                                        • И часто ты ее вызываешь?

                                                          Вот самопальная веб-сериализация вызывает у меня "фу, блядь, фу, нахуй".
                                                          Ответить
            • почти ... if($model->save()){...}
              Ответить
        • выше там только проверка на надежность дырки ... if (isset($_POST['form_model'])){....}
          Ответить
      • Ну это не yii дыра, это дыра разработчика .. он так модель для формы выбирал ....
        Ответить
    • А можно пруф, что это именно в yii написано, а не в чьём-то коде?
      Ответить
      • Это не в самом Yii, это так чел вызывал модели в своем FormController. И весь сайт используя Yii. Отписаться сразу не было возможности ..
        Ответить

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