"PHP" / Говнокод #24522 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 roskomgovno, (Updated )

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

    • Ну так нормально же: при ООП ссылку на соединение передаём в $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-wrap: break-word;


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

                        w3schools утверждает что примерно с IE 5.5 все умеют, так что примерно после 2002 года нет особого смысла что-то там рвать на сервере
                        Ответить
                          • Вдруг у кого-то в 2008-м была Чикага с IE 4.0?
                            Ответить
                            • У программиста могла быть только Daytona, зачем ему ламерская Чикага?
                              Ответить
                              • NT 3.5? Это какое-то прыщеговно с собственной консолью. Она мои досовские драйвера не подхватывает, в отличие от Чикаги. И выглядит, как 3.x. Где кнопка "Пуск", в которой всё есть? Я не обязан пердолиться!
                                Ответить
                                  • В 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 году.
                                            Ответить
                                          • Не поэтому ли в IE долгое время не было вкладок? Вкладки в нём появились в седьмой версии, т. е. в 2006 году.
                                            Ответить
                                            • Вкладки это не совсем MDI: ты не двигаешь вкладки внутри браузера) Я думаю что табы он попёр со всяких опер и файрфоксов, но я не знаю.
                                              Ответить
                                          • Значит, в 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

                          А тут не всё хорошо. Хром научился переносить по слогам недавно, да и то только на Андроиде.
                          Ответить
                            • В базе caniuse отсутствует IE древнее 6-й версии, поэтому более старые нужно самому проверять или искать информацию в других источниках. Зато в caniuse есть ссылки на W3C, на MDN, на документацию по IE и по Вебкиту (вкладка Resources).
                              Ответить
    • З.Ы. Зачем они вообще оставили обе функции? Побоялись, что пыхоёбы зассут юзать conn->escape_string($str) без real? Или функция без real и на самом деле не смотрит на кодировку?
      Ответить
    • Оно использует настройки текущего соединения (кодировку текста и т. п.), поэтому его нельзя сделать статиком.
      Ответить
        • Теперь понял, в чём вопрос. Я не заметил, что в вопросе отсутствует _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-файла.
                      Ответить
                  • Даже больше скажу:
                    PHP_FALIAS(mysqli_execute, mysqli_stmt_execute,arginfo_mysqli_only_statement)
                    PHP_FALIAS(mysqli_escape_string,mysqli_real_escape_string,arginfo_mysqli_query)
                    PHP_FALIAS(mysqli_set_opt,mysqli_options,NULL)
                    PHP_FALIAS(autocommit, mysqli_autocommit, arginfo_class_mysqli_autocommit)
                    PHP_FALIAS(begin_transaction, mysqli_begin_transaction, arginfo_class_mysqli_begin_transaction)
                    PHP_FALIAS(change_user,mysqli_change_user, arginfo_class_mysqli_change_user)
                    PHP_FALIAS(character_set_name, mysqli_character_set_name, arginfo_mysqli_no_params)
                    PHP_FALIAS(close, mysqli_close, arginfo_mysqli_no_params)
                    PHP_FALIAS(commit, mysqli_commit, arginfo_class_mysqli_commit)
                    PHP_FALIAS(connect, mysqli_connect, arginfo_mysqli_connect)
                    PHP_FALIAS(dump_debug_info, mysqli_dump_debug_info, arginfo_mysqli_no_params)
                    PHP_FALIAS(debug, mysqli_debug, arginfo_mysqli_debug)
                    PHP_FALIAS(get_charset, mysqli_get_charset, arginfo_mysqli_no_params)
                    PHP_FALIAS(get_client_info, mysqli_get_client_info, arginfo_mysqli_no_params)
                    PHP_FALIAS(get_connection_stats, mysqli_get_connection_stats, arginfo_mysqli_no_params)
                    PHP_FALIAS(get_server_info, mysqli_get_server_info, arginfo_mysqli_no_params)
                    PHP_FALIAS(get_warnings, mysqli_get_warnings, arginfo_mysqli_no_params)
                    PHP_FALIAS(init,mysqli_init_method, arginfo_mysqli_no_params)
                    PHP_FALIAS(kill,mysqli_kill, arginfo_class_mysqli_kill)
                    PHP_FALIAS(multi_query, mysqli_multi_query, arginfo_class_mysqli_multi_query)
                    PHP_FALIAS(__construct, mysqli_link_construct, arginfo_mysqli_connect)
                    PHP_FALIAS(more_results, mysqli_more_results, arginfo_mysqli_no_params)
                    PHP_FALIAS(next_result, mysqli_next_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(options, mysqli_options, arginfo_class_mysqli_options)
                    PHP_FALIAS(ping, mysqli_ping, arginfo_mysqli_no_params)
                    PHP_FALIAS(prepare, mysqli_prepare, arginfo_class_mysqli_prepare)
                    PHP_FALIAS(query, mysqli_query, arginfo_class_mysqli_query)
                    PHP_FALIAS(real_connect, mysqli_real_connect, arginfo_class_mysqli_real_connect)
                    PHP_FALIAS(real_escape_string, mysqli_real_escape_string, arginfo_class_mysqli_real_escape_string)
                    PHP_FALIAS(reap_async_query, mysqli_reap_async_query, arginfo_mysqli_no_params)
                    PHP_FALIAS(escape_string, mysqli_real_escape_string, arginfo_class_mysqli_real_escape_string)
                    PHP_FALIAS(real_query, mysqli_real_query, arginfo_class_mysqli_real_query)
                    PHP_FALIAS(release_savepoint, mysqli_release_savepoint, arginfo_class_mysqli_release_savepoint)
                    PHP_FALIAS(rollback, mysqli_rollback, arginfo_class_mysqli_rollback)
                    PHP_FALIAS(savepoint, mysqli_savepoint, arginfo_class_mysqli_savepoint)
                    PHP_FALIAS(select_db,mysqli_select_db, arginfo_class_mysqli_select_db)
                    PHP_FALIAS(set_charset, mysqli_set_charset, arginfo_class_mysqli_set_charset)
                    PHP_FALIAS(set_opt, mysqli_options, arginfo_class_mysqli_options)
                    PHP_FALIAS(ssl_set, mysqli_ssl_set, arginfo_class_mysqli_ssl_set)
                    PHP_FALIAS(stat, mysqli_stat, arginfo_mysqli_no_params)
                    PHP_FALIAS(stmt_init, mysqli_stmt_init, arginfo_mysqli_no_params)
                    PHP_FALIAS(store_result, mysqli_store_result, arginfo_class_store_result)
                    PHP_FALIAS(thread_safe, mysqli_thread_safe, arginfo_mysqli_no_params)
                    PHP_FALIAS(use_result, mysqli_use_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(refresh,mysqli_refresh, arginfo_class_mysqli_refresh)
                    PHP_FALIAS(__construct, mysqli_result_construct, NULL)
                    PHP_FALIAS(close, mysqli_free_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(free, mysqli_free_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(data_seek, mysqli_data_seek, arginfo_class_mysqli_data_seek)
                    PHP_FALIAS(fetch_field, mysqli_fetch_field, arginfo_mysqli_no_params)
                    PHP_FALIAS(fetch_fields, mysqli_fetch_fields, arginfo_mysqli_no_params)
                    PHP_FALIAS(fetch_field_direct, mysqli_fetch_field_direct, arginfo_class_mysqli_result_and_fieldnr)
                    PHP_FALIAS(fetch_all, mysqli_fetch_all, arginfo_class_mysqli_fetch_array)
                    PHP_FALIAS(fetch_array, mysqli_fetch_array, arginfo_class_mysqli_fetch_array)
                    PHP_FALIAS(fetch_assoc, mysqli_fetch_assoc, arginfo_mysqli_no_params)
                    PHP_FALIAS(fetch_object,mysqli_fetch_object, arginfo_class_mysqli_fetch_object)
                    PHP_FALIAS(fetch_row, mysqli_fetch_row, arginfo_mysqli_no_params)
                    PHP_FALIAS(field_seek, mysqli_field_seek, arginfo_class_mysqli_result_and_fieldnr)
                    PHP_FALIAS(free_result, mysqli_free_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(__construct, mysqli_stmt_construct, NULL)
                    PHP_FALIAS(attr_get, mysqli_stmt_attr_get, arginfo_class_mysqli_stmt_attr_get)
                    PHP_FALIAS(attr_set,mysqli_stmt_attr_set, arginfo_class_mysqli_stmt_attr_set)
                    PHP_FALIAS(bind_param,mysqli_stmt_bind_param, arginfo_class_mysqli_stmt_bind_param)
                    PHP_FALIAS(bind_result,mysqli_stmt_bind_result, arginfo_class_mysqli_stmt_bind_result)
                    PHP_FALIAS(close, mysqli_stmt_close, arginfo_mysqli_no_params)
                    PHP_FALIAS(data_seek, mysqli_stmt_data_seek, arginfo_class_mysqli_data_seek)
                    PHP_FALIAS(execute, mysqli_stmt_execute, arginfo_mysqli_no_params)
                    PHP_FALIAS(fetch, mysqli_stmt_fetch, arginfo_mysqli_no_params)
                    PHP_FALIAS(get_warnings, mysqli_stmt_get_warnings,arginfo_mysqli_no_params)
                    PHP_FALIAS(result_metadata, mysqli_stmt_result_metadata, arginfo_mysqli_no_params)
                    PHP_FALIAS(more_results, mysqli_stmt_more_results, arginfo_mysqli_no_params)
                    PHP_FALIAS(next_result, mysqli_stmt_next_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(num_rows, mysqli_stmt_num_rows, arginfo_mysqli_no_params)
                    PHP_FALIAS(send_long_data, mysqli_stmt_send_long_data, arginfo_class_mysqli_stmt_send_long_data)
                    PHP_FALIAS(free_result, mysqli_stmt_free_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(reset, mysqli_stmt_reset, arginfo_mysqli_no_params)
                    PHP_FALIAS(prepare, mysqli_stmt_prepare, arginfo_class_mysqli_prepare)
                    PHP_FALIAS(store_result, mysqli_stmt_store_result, arginfo_mysqli_no_params)
                    PHP_FALIAS(get_result, mysqli_stmt_get_result, arginfo_mysqli_no_params)
                    Ответить
                  • Короче:
                    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.
                  Ответить
            • > чтобы пыхари не зассали юзать

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8