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

    −2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    Object oriented style
    string mysqli::escape_string ( string $escapestr )
    string mysqli::real_escape_string ( string $escapestr )
    
    
    Procedural style
    string mysqli_real_escape_string ( mysqli $link , string $escapestr )
    
    
    http://php.net/manual/en/mysqli.real-escape-string.php

    Запостил: roskomgovno, 20 Июля 2018

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

    • #seo: что такое ООП на самом деле
      Ответить
      • Ну так нормально же: при ООП ссылку на соединение передаём в $self, без ООП ссылку на соединение передаём первым параметром.

        Что не так?
        Ответить
        • Я прошу прощения, а как результат работы "mysqli_real_escape_string" зависит от коннекшена? о_О
          Ответить
          • Кодировка. В какой-нибудь китайской или японской пародии на UTF-8 кавычки могут быть на других местах.
            Ответить
            • Ебануться можно
              Ответить
              • Классический пример:
                https://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string

                Кодировки big5, cp932, gb2312, gbk и sjis — это мультибайтовые кодировки, как и utf-8, но несовместимые.

                В gbk некоторые многобайтовые символы могут заканчиваться на "\0x27". В utf-8 такое невозможно, там последняя часть многобайтовых цепочек заканчивается на байт с числовым значением больше 0x80.

                Подаём на вход "\xbf\x27", не указывая кодировку. mysql_escape_string, считая, что на входе кодировка latin1 или ещё какая-нибудь европейская, вставляет бэкслэш перед байтом "\x27" (код апострофа), разрывая многобайтовую последовательность. Получаем цепочку "\xbf\x5c\x27". Казалось бы, апостроф заэкранирован, но MySQL интерпретирует цепочку в кодировке gbk, поэтому "\xbf\x5c" будет одним многобайтовым символом (типа как в utf-8 русские буквы), а апостроф останется неэкранированным. А если бы мы правильно передали кодировку, то апостроф как отдельный символ не вылез бы.
                Ответить
                • Вывод: нехуй использовать прыщеуродские кодировки
                  Ответить
                  • Вывод: кодировку нужно указывать явно.

                    Говнокод разбавляет длинные слова пробелами (это сделали, чтобы нельзя было растянуть колонку, хотя на самом деле в современных браузерах (браузеры 10-летней давности сойдут за современные) это исправляется средствами CSS и без пробелов). Раньше в функцию разбавления не передавалась кодировка, и движок ГК многобайтовые последовательности utf-8 (вроде букв кириллицы, которые в utf-8 представлены двухбайтовыми цепочками) считал цепочками отдельных символов. В итоге он мог порвать любую русскую букву, в результате разрыва образовывались невалидные для utf-8 последовательности байтиков.
                    Ответить
                    • ты про
                      word-break: break-all
                      чтоли?
                      Ответить
                      • Полезнее бывает
                        word-wrap: break-word;


                        Для браузеров на Gecko дополнительно можно указывать hyphens: auto, чтобы слова переносились не где попало, а по слогам, но тогда в преамбуле документа нужно указывать язык (типа <html lang="ru">).
                        Ответить
                        • да, наверное так лучше: он тогда будет пытаться рвать слова как надо.

                          w3schools утверждает что примерно с IE 5.5 все умеют, так что примерно после 2002 года нет особого смысла что-то там рвать на сервере
                          Ответить
                          • Но настоящий сайт появился в 2008-м...
                            Ответить
                            • Ты - овен?
                              Ответить
                            • Вдруг у кого-то в 2008-м была Чикага с IE 4.0?
                              Ответить
                              • У программиста могла быть только Daytona, зачем ему ламерская Чикага?
                                Ответить
                                • NT 3.5? Это какое-то прыщеговно с собственной консолью. Она мои досовские драйвера не подхватывает, в отличие от Чикаги. И выглядит, как 3.x. Где кнопка "Пуск", в которой всё есть? Я не обязан пердолиться!
                                  Ответить
                                  • Там нет Start, там taskman или как там его
                                    как в 3.11

                                    pёrdooling
                                    Ответить
                                    • В 3.x и в NT 3.x был progman.exe — диспетчер приложений без кнопки «Пуск».

                                      Кнопку «Пуск» рисовал появившийся в Win95 explorer.exe, позже перекочевавший и на платформу NT.

                                      Кстати, Windows 95 и некоторые более поздние поставлялись с progman.exe (в Win95 даже был стартовый набор grp-файлов к нему с группами в стиле Win 3.x). Можно было в автозапуске вместо explorer.exe подставить progman.exe и радоваться олдскульной оболочке.
                                      Ответить
                                      • >>progman
                                        да! не taskman, а progman

                                        >>некоторые более поздние
                                        чуть ли не до win2k или даже xp

                                        некоторые заменяли explorer.exe на всякие blackbox и еще на какие-то такие штуки

                                        но как по мне его надо сразу азменять на far.exe или ISE
                                        Ответить
                                        • В Win2K точно был, но уже без grp-файлов из коробки, все группы программ нужно было создавать ручками с нуля. Про XP не помню, нужно у Сёмы спросить. В Висте и в семёрке уже progman отсутствует.

                                          Была куча альтернативных оболочек, менее популярных. Были даже какие-то футуристические с 3D-интерфейсом.
                                          Ответить
                                          • Вот он, родимый
                                            http://chorusofone.no-ip.org/Computerstuff/win7progman.html

                                            Забавно что на заре винды были популярны Multi Document Interfaces (прогман хороший пример). "Хвостики" этого подхода торачали вплоть до win2k где был regedt32 (в xp слилися с regedit).

                                            Я задумался: почему так?
                                            И мне ответили:
                                            > Under Windows 95 and later, applications are commonly SDI because the operating system has adopted a "document-centered" view.
                                            https://msdn.microsoft.com/en-us/library/b2kye6c4.aspx

                                            Так что замена Прогрмана на Проводник убила MDI и открыла эру SDI
                                            Ответить
                                            • Не поэтому ли в IE долгое время не было вкладок? Вкладки в нём появились в седьмой версии, т. е. в 2006 году.
                                              Ответить
                                              • Вкладки это не совсем MDI: ты не двигаешь вкладки внутри браузера) Я думаю что табы он попёр со всяких опер и файрфоксов, но я не знаю.
                                                Ответить
                                            • Не поэтому ли в IE долгое время не было вкладок? Вкладки в нём появились в седьмой версии, т. е. в 2006 году.
                                              Ответить
                                            • Значит, в XP был. Теперь нужно ещё и патчить progman.exe из XP (подменив в нём имя shell32.dll) и брать shell32.dll из старой Винды, потому что с новым shell32.dll он не запустится...

                                              Надо порыть проект ReactOS, не завалялось ли в нём чего-нибудь похожего.
                                              Ответить
                                              • Вообще про качество explorer говорит тот факт что все старые виндузятники юзают или far или total.
                                                Ответить
                                            • Кстати, начиная с Win2K свёрнутые группы в Progman выглядят некрасиво: они теперь выглядят как заголовок окна с кнопками «Закрыть» и «Развернуть» и с урезанным названием, которое невозможно прочитать.

                                              В Windows 3.x (и в просто 3.x, и в NT 3.x) свёрнутые группы выглядели как ярлыки: огромная пиктограмма, под которой полное название в несколько строчек. Пиктограммы запущенных приложений же отображались на фоне за пределами окна Progman (на том месте, где сейчас рабочий стол).

                                              В общем, одной заменой explorer на progman то поведение не вернёшь. Нужно ковырять Shell32 и ещё какую-то фигню.
                                              Ответить
                                            • >> http://chorusofone.no-ip.org/Computerstuff/win7progman.html

                                              Корявый проект. Проверял progman от Windows NT 3.1, 3.51, 4.0, 2000, XP — не хватает нескольких функций во враппере kernelwr.dll. Если пропатчить обратно (чтобы вместо kernelwr.dll использовалась системная kernel32.dll), то progman работает.

                                              Враппер для kernel32 там придумали, потому что winfile ранних выпусков использовал отменённые позже функции. Кстати, исходник winfile теперь официально открыт:
                                              https://github.com/Microsoft/winfile

                                              В нескольких файлах присутствует #ifdef PROGMAN, но исходники progman'а пока официально не открывали.
                                              Ответить
                                              • > отменённые позже функции
                                                Недокументированные?
                                                Ответить
                                                • ты пизда пиздинская
                                                  Ответить
                                                • Сейчас проверим...

                                                  Winfile из NT 3.1 и NT 3.51 пишет: «Unable to initialize background update support» — и завершается. С враппером (опубликованным https://people.ee.ethz.ch/~davidsch/ ) работает. Нужно дизассемблировать враппер и выложить сюда.

                                                  Winfile из NT 4.0, 2000, XP уже ничего подозрительного из kernel32.dll не требует.

                                                  Зато требуется древняя версия shell32.dll (от NT3.x, 4.x или 2k).

                                                  С shell32.dll от Висты:
                                                  progman 3.10: CheckEscapesA
                                                  winfile 3.10: SheShortenPathA
                                                  progman 3.51, 4.0, 2k: ExtractIconResInfoW
                                                  winfile 3.51, 4.0, XP: SheConvertPathW
                                                  progman XP: SheRemoveQuotesW
                                                  Ответить
                                                  • Нашёл кое что-интересное во враппере kernel32 (выхлоп IDA):
                                                    HANDLE __stdcall FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData)
                                                    {
                                                      HANDLE result; // eax@1
                                                      DWORD v3; // ecx@2
                                                    
                                                      result = FindFirstFileW_0(lpFileName, lpFindFileData);
                                                      if ( lpFindFileData )
                                                      {
                                                        v3 = lpFindFileData->dwFileAttributes;
                                                        BYTE1(v3) &= 0xEBu;
                                                        lpFindFileData->dwFileAttributes = v3;
                                                      }
                                                      return result;
                                                    }
                                                    FindNextFileW аналогичным образом чистит атрибуты.

                                                    В остальных функциях ничего интересного не нашёл.
                                                    Ответить
                                      • >> в Win95 даже был стартовый набор grp-файлов к нему с группами в стиле Win 3.x

                                        А в Windows NT progman хранит группы не в grp-файлах, а в реестре. Вероятно, поэтому он изначально пустой (сборщикам инсталятора лень было заполнять реестр для него).
                                        Ответить
                          • Кстати:
                            https://caniuse.com/#feat=wordwrap
                            https://caniuse.com/#feat=word-break

                            Жмём "Show All" и любуемся зелёными квадратиками. Оперу 10.10 он отметил красным, но, кажется, в ней проблем с переносами не было.

                            И напоследок:
                            https://caniuse.com/#feat=css-hyphens

                            А тут не всё хорошо. Хром научился переносить по слогам недавно, да и то только на Андроиде.
                            Ответить
                            • w3schools так отвратительно напиздели мне, хуй им за это!!
                              Ответить
                              • В базе caniuse отсутствует IE древнее 6-й версии, поэтому более старые нужно самому проверять или искать информацию в других источниках. Зато в caniuse есть ссылки на W3C, на MDN, на документацию по IE и по Вебкиту (вкладка Resources).
                                Ответить
    • mysqli::escape_string должно быть статиком!
      Ответить
      • З.Ы. Зачем они вообще оставили обе функции? Побоялись, что пыхоёбы зассут юзать conn->escape_string($str) без real? Или функция без real и на самом деле не смотрит на кодировку?
        Ответить
      • Оно использует настройки текущего соединения (кодировку текста и т. п.), поэтому его нельзя сделать статиком.
        Ответить
        • А чем оно тогда отличается от real_escape_string?
          Ответить
          • Теперь понял, в чём вопрос. Я не заметил, что в вопросе отсутствует _real_

            Честно не знаю, чем они отличаются. Надо копать исходники Mysqli.
            Ответить
            • Ну в доке разница не описана. Походу реально чтобы пыхари не зассали юзать.
              Ответить
              • Хм, лол, так вся эта хуйня с _real_ это факап самого mysql, а не PHP... У него и в сишном апи то же самое.
                Ответить
                • mysql_connect()
                  This function is deprecated. Use mysql_real_connect() instead.

                  Даже так...
                  Ответить
                  • >>This function is deprecated. Use mysql_real_connect() instead.
                    Виновата не жаба, а гадюка
                    Ответить
                • Нырнул в говно исходники.

                  Mysql:
                  http://git.php.net/?p=pecl/database/mysql.git;a=blob;f=php_mysql.c

                  Mysqli:
                  http://git.php.net/?p=php-src.git;a=blob;f=ext/mysqli/mysqli_fe.c

                  В Mysql эти функции были разными: mysql_escape_string не учитывала настройки соединения и работала в дефолтной кодировке, mysql_real_escape_string_blya_budu учитывала кодировку выбранного соединения.

                  В новом Mysqli же mysqli_escape_string сделали алиасом mysqli_real_escape_string, т. е. в оба нужно передавать ссылку на соединение.
                  Ответить
                  • То есть "_real" теперь писать не обязательно? Заебись
                    Ответить
                    • Но с _real_ на душе всё-таки спокойнее. Я бы ещё добавил realstripslashes, realurlencode, real_password_hash и т.п.
                      Ответить
                      • Нужно написать расширение real, которое к каждой функции добавляет реальный алиас. Ну или на худой конец сделать это в виде include-файла.
                        Ответить
                    • Короче:
                      mysqli_execute ≡ mysqli_stmt_execute
                      mysqli_escape_string ≡ mysqli_real_escape_string
                      mysqli_set_opt ≡ mysqli_options
                      Ответить
                  • Комментарий из исходников php_mysql.c:
                    +----------------------------------------------------------------------+
                        | PHP Version 7                                                        |
                        +----------------------------------------------------------------------+
                        | Copyright (c) 1997-2015 The PHP Group                                |
                        +----------------------------------------------------------------------+

                    С одной стороны, deprecated. С другой стороны, шапку зачем-то обновили до PHP Version 7.
                    Ответить
              • > чтобы пыхари не зассали юзать

                хахахаха блядь :D :D
                функциям с real доверия больше? :D
                Ответить
    • Еще одно доказательство того, что "ООП" не приносит никакой выгоды по сравнению с чистым "PHP"
      Ответить

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