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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    // https://vk.com/login?u=2&to=YWxfZmVlZC5waHA-
    $ echo YWxfZmVlZC5waHA- | base64 -d
    al_feed.phpbase64: invalid input
    
    $ echo -n al_feed.php | base64
    YWxfZmVlZC5waHA=

    Олимпиадники даже base64 умудрились пропатчить

    Запостил: Fike, 17 Октября 2020

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

    • Держу пари, что символ равенства запрещен потому что иначе парсер query string ломается
      Ответить
      • Удобно. Не нужно ничего нигде дополнительно кодировать-декодировать.
        Ответить
      • К слову, эти символы равенства можно было вообще выбросить. Сам допишешь в нужном количестве когда декодить будешь, это же просто паддинг до 4.

        З.Ы. А ещё они плюсик и слеш на что-то другое должны были заменить. На подчёркивание, наверное?
        Ответить
      • О как, в RFC на бейс64 есть параграф про url'ы. Там предлагают юзать - и _ вместо + и /. Ну и дропнуть паддинг. Собственно на ютубе так и сделано в адресах роликов.

        Так что олимпиадники таки соснули.
        Ответить
    • Base64 по нестандартному алфавиту — в вебе обычное дело.
      Ответить
      • что не делает его использование оправданным
        Ответить
        • Ну %3D в адресной строке всё-таки подбешивают.
          Ответить
          • Ашь трисёт.
            Ответить
          • так может тогда действительно убирать паддинг или хотя бы не засовывать одиннадцать символов (al_feed.php) шестнадцатью (YWxfZmVlZC5waHA=)? я вообще не очень понимаю зачем в вебе в пользовательских параметрах байтовые штуки.
            Ответить
            • В байтовых штуках может лежать жсон или вообще структура, а кодирование 4:3 гораздо лучше подходит для экономии места, чем процентное. Вообще все ещё есть браузеры, в которых длина урла ограничена 2000 символов
              Ответить
              • вы тут что, олимпиадников защищаете что ли?
                Ответить
                • ну ты сказал, что не очень понимаешь
                  а нахрена олимпиадники кодируют funcii.php в урле я хз
                  Ответить
                  • Судя по названию параметра — это для редиректа на страницу, с которой юзер решил залогиниться. В общем-то всё правильно сделали: дико бесит, когда для просмотра какой-то страницы требуют войти на сайт, а после входа редиректят на главную. Поубивал бы уебанов, которые так делают.

                    Хотя, конечно, 2020-й год на дворе, могли бы и простое модальное окошко для логина сделать.
                    Ответить
                    • > дико бесит, когда для просмотра какой-то страницы требуют войти на сайт, а после входа редиректят на главную. Поубивал бы уебанов, которые так делают.

                      - в последние дни Страйкеру икается всё чаще)
                      Ответить
                  • я и сейчас не понимаю, что это может быть за гет-запрос, который не влезет в 2кб
                    Ответить
                    • те самые дополнительные условия (квери параметры), которые тебе лень преобразовывать в ебаную цепочку из филдов, эскейпя и анэскейпя это говно
                      и если филды ещё сами по себе не планарные, а с вложенными внутри полями (написал же выше - структура), ты можешь в какой-то момент плюнуть на это и просто заебенить base64 из, например, плотно сериализованного жсона (без претти отступов), а сервер на своей стороне так же тупо десериализовывает и хуяк, у него готовый жсон-объект

                      ещё условием, конечно, является то, что тебе нужен именно GET, а не POST

                      как пример - ты выбираешь из системы данные по куче критериев, с фильтром и строк и колонок, с пажинацией и сложной сортировкой, и результат вполне может быть прокеширован и нжинксом, и клиентом, и между ними - ты же не просто так гет тут захотел
                      Ответить
                      • камон, мой основный профиль работы - это эластиксерч. ни разу не видел чтобы на приложение прилетало что-то длинее сотен трёх символов в query string, внутри оно уже конечно строит полноценную эластик-кверю, которая уходит через POST, но детали имплементации апи нас уже не интересуют.

                        > которые тебе лень преобразовывать в ебаную цепочку из филдов, эскейпя и анэскейпя это говно

                        камон, в общем случае просто разово прогнать их все через анэскейпер, и вообще наплевать, что там внутри

                        > как пример - ты выбираешь из системы данные по куче критериев, с фильтром и строк и колонок, с пажинацией и сложной сортировкой, и результат вполне может быть прокеширован и нжинксом

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

                          > просто разово прогнать их все через анэскейпер, и вообще наплевать, что там внутри
                          нихуя не просто, ты предлагаешь из объекта, понятного и клиенту и серверу, сделать вторую (де) сериализацию в плоский список кей-велью, где ещё подобосраться с массивами, и в общем случае руками писать маппинг из объекта в ключ плоского списка, тогда, когда можно тупо высрать бейз64, который самостоятельно охуенен и пролезает в качестве любого квери параметра, а на стороне сервера раскроется обратно именно в то, что отправлял клиент, а не то, как написал десериализацию программист на сервере

                          я удивлен, почему ты так отстаиваешь, что "КАМОН ТАК НЕЛЬЗЯ ДЕЛАТЬ"
                          продолжай кипятить ?q1.v1=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1 %82 ты молодец
                          Ответить
                          • > ты предлагаешь из объекта

                            где ты в списке пар ключ=значение увидел объект?

                            > я удивлен, почему ты так отстаиваешь, что "КАМОН ТАК НЕЛЬЗЯ ДЕЛАТЬ"

                            потому что если вы жлобитесь на пару байтов, то жмите уж пожалуйста гзипом, а не занимайтесь всякой хуйней
                            Ответить
                            • > потому что если вы жлобитесь на пару байтов, то жмите уж пожалуйста гзипом, а не занимайтесь всякой хуйней
                              Приведи реальный пример того, кто тут предлагает использовать «base64» для экономии байтов.
                              Ответить
                              • > В байтовых штуках может лежать жсон или вообще структура, а кодирование 4:3 гораздо лучше подходит для экономии места, чем процентное. Вообще все ещё есть браузеры, в которых длина урла ограничена 2000 символов
                                Ответить
                                • ну и?
                                  как гзипом жать GET url HTTP/1.1 ?
                                  Ответить
                                  • ?forward-to=gzip(address), а не ?forward-to=base64(address)

                                    мы тут query string обсуждаем, а ты то про объекты, то про протокол
                                    Ответить
                                    • > ?forward-to=gzip(address)
                                      О, а я даже так делал. Не в уебе, правда, но зожимать сообщение гзипом приходилось. А полученную бинарушню переводил в аскаушню через «base64», ага.
                                      Ответить
                                    • gzip(address) это бинарщина, если что, вдруг ты не знал
                                      так что тебе надо base64(gzip(address)), например, НУ ИЛИ «WCT»!

                                      и гзип на клиенте это уже не так тривиально, как бейз64
                                      даже анскильный питух, не найдя нативной поддержки в своем языке, сможет написать base64encode/decode строк за 50, а гзип - нет

                                      и ещё раз, массивы, структуры - всё это жопоболь, если ты собрался это всё переводить в квери параметры, а русские слова, спецсимволы приводят к кодированию 3:1 (для кодирования 1 двухбайтной utf-8 русской буквы надо 6 символов в урл заебенить)

                                      зачем страдать, если у тебя и так уже нечитаемое неисправляемое говнище в урле, для трансформации в которую и из которой которой надо реально ЕЩЁ 2 раза код написать, когда base64encode в, например, жс делается в однострочник
                                      Ответить
                                      • > base64(gzip(address))

                                        Всё равно с выдуманной и никому нахуй не нужной задачей экономии справляется лучше, ну напиши на коленке примитивный LZW, если хочешь.

                                        > и ещё раз, массивы, структуры -

                                        Ни имеют никакого отношения к тому, что мы сейчас обсуждаем, я хуй знает откуды ты их взял и нахуя ты их суешь в query string и как однократное детерминированное преобразование мешает чему-то там. С массивами, кстати, никаких проблем нет, никто не запрещает параметру повторяться.

                                        > (для кодирования 1 двухбайтной utf-8 русской буквы надо 6 символов в урл заебенить)

                                        А что, бейз64 в отличие от вышеприведенного вносит какую-то экономию при кодировании двух байт по сравнению с одним байтом? Давай тогда сразу какие-нибудь трёхбайтовые эмодзи возьмем, шоб пропорции остались теми же и никакой смысловой нагрузки это не несло, но выглядело устрашающе.

                                        > даже анскильный питух, не найдя нативной поддержки в своем языке, сможет написать base64encode/decode строк за 50, а гзип - нет

                                        При чем тут это? На кой хуй при написании приложения мы должны думать об анскильном петухе? Лучше подумать о пользователях, которые уже привыкли к этому формату и способны набрать decode url или даже восстановить смысл, если там большая часть в ASCII

                                        > зачем страдать

                                        Не знаю, это к вам вопрос, вы же зачем-то городите какую-то хуйню вокруг ?forward-to=https://vk.com/porno
                                        Ответить
                                        • > о пользователях

                                          Пользователи не лезут своими лапками в URL'ы. Они их дословно копируют или кликают. И ни о каком base64 и decode_url они не знают.
                                          Ответить
                                        • > городите какую-то хуйню вокруг ?forward-to=https://vk.com/porno
                                          Как бы ты решил задачу «сформировать URL, в котором параметром 'forward_to' указать путь текущей страницы»?
                                          Ответить
                                          • Я тупо urlencode делал, лень было думать.
                                            Ответить
                                          • БЕЗ оборачивания данных в base64 и прочую поеботу
                                            Ответить
                                            • Ну ладно, не буду тогда ходить вокруг и около: тебе в любом случае придётся как-то сериализовывать этот параметр. И между «urlencode» и «base64» не будет практически никакой разницы (конкретно в этом случае) — кроме того, что «base64» для «Юникода» будет короче.
                                              Ответить
                                              • нет, в случае percent-encoding за меня это сделают браузер и фреймворк (предположу, что с современными браузерами даже последнее не обязательно)
                                                Ответить
                                        • >> Лучше подумать о пользователях, которые уже привыкли к этому формату и способны набрать decode url

                                          Приведи реальный пример, когда тебе по работе требовалось набирать «decode url».
                                          Ответить
                                        • какой багор

                                          > Ни имеют никакого отношения к тому, что мы сейчас обсуждаем
                                          нихуясе не имеют
                                          >> В байтовых штуках может лежать жсон или вообще структура, а кодирование 4:3 гораздо лучше подходит для экономии места, чем процентное.

                                          {
                                            "filters": { "col1": "Посмотри как прекрасен*", "col3": "#foo:bar+#baz:pitux", "col15": ">= 2020-01-01"},
                                            "order": [ {"col1":"asc"}, {"col2":"desc"} ],
                                            "pagination": {"by": 30, "from": 1652}
                                          }


                                          сделай красиво на квери параметрах
                                          потом оценим сколько времени займет кинуть это через бейз64 и сколько шансов обосраться там и там
                                          раз уж ты поднял вопрос о том, что не надо думать об анскильных питухах

                                          > А что, бейз64 в отличие от вышеприведенного вносит какую-то экономию при кодировании двух байт по сравнению с одним байтом?
                                          ты не поверишь, но ё= превратится в 4 символа в бейз64, а в urlencode — в 9
                                          Ответить
                                          • а) мы говорим про пары ключ=значение. что там лежит - вообще похуй, нам интересно только сколько там ASCII и сколько не ASCII.
                                            б) нахуя ты кладешь жсон в query string?
                                            в) у тебя все значения параметров длиной либо в один, либо в два байта?
                                            Ответить
                                            • я и предлагаю тебе не класть жсон, а класть ключ=значение
                                              пример необходимой семантики, которую надо закодировать, я тебе показал
                                              надеюсь, что там написано, понятно без комментариев
                                              напиши наиболее близкий, соответствующий аналог на квери параметрах
                                              Ответить
                                              • > я и предлагаю тебе не класть жсон, а класть ключ=значение

                                                а я тебе не про твой последний ответ, а про ту хуйню, что ты пытаешься мне доказать про base64, обосновывая это тем, что в query string откуда-то появляются объекты

                                                > напиши наиболее близкий, соответствующий аналог на квери параметрах

                                                filter=field-a:wildcard:Посмотри как прекрасен*
                                                filter=field-b:term:#foo:bar+#baz:pitux
                                                filter=field-c:gte:2020-01-01
                                                sort=field-a:asc
                                                sort=field-b:desc
                                                size=30
                                                offset=1652
                                                Ответить
                                                • теперь что делать? парсить регуляркой по двоеточию? как-то эксейпить двоеточие, если оно попалось не в третьем терме? специальные вещи типа wildcard, gte объявлять секретными ключевыми словами и писать внутренний документ об этом, чтобы на стороне бекенда чувак сделал именно то, как ты решил?
                                                  Ответить
                                                  • > теперь что делать? парсить регуляркой по двоеточию?

                                                    дядь, тебе не надоело придумывать абсурдные вещи, чтобы выйти победителем в споре?
                                                    первые два двоеточия отделяют колонку и тип фильтра от значения. а можно и действительно эскейпить - точно так же, как ты будешь эскейпить двойную кавычку в своем json и будешь переводить юникодные символы в \uXXXX, потому что не все парсеры умеют читать чистый юникод, и работают-то строго говоря прямо спеке

                                                    > специальные вещи типа wildcard, gte объявлять секретными ключевыми словами и писать внутренний документ об этом

                                                    а в твоем примере что, вот эти подзапросы уйдут в базу в исходном виде? нет, ты точно так же будешь парсить >= {date} в оператор и значение, это такой же dsl, как у меня, только у тебя он гораздо сложней. и да, конкретно эти три примера так и называются в том же самом эластике, поэтому в твоем примере можно их скармливать напрямую вообще без зазрения.

                                                    в общем, позволю тебе дальше оптизировать приложения под анскильных петухов.
                                                    Ответить
                                                    • > как ты будешь эскейпить двойную кавычку в своем json
                                                      в том-то и дело, что Я - не буду, валидный жсон и так содержит всё что надо, чтобы быть валидным, меня это не ебёт, если там что-то и будет заэскейплено, значит, так тому и быть, если выбранный сериализатор решит, что юникод надо срать через \u, ну и пусть срёт, ему виднее - никто не собирается оперировать представлением жсона, я хочу лишь, чтобы бекенд получил валидный _объект в итоге_

                                                      если яндекс будет через протобуф вместо жсона срать, это будет так же адекватно

                                                      > в том же самом эластике
                                                      исходя из логичного предположения, что 101% бекендов в мире это эластик, я признаю, надо сразу всегда и везде писать как в эластике теперь

                                                      > позволю тебе дальше
                                                      я это предложил ещё 4 часа назад!
                                                      Ответить
                    • Длинные урлы на фронте - способ сохранить данные между юзерами и сессиями - например, кидают ссылки на джиру с вшитыми квери потом их браузер запоминает и все счастливы
                      Ответить
    • https://vk.com/login?u=2&to=al_watan.php
      Ответить

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