- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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
Что не так?
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 последовательности байтиков.
чтоли?
Для браузеров на Gecko дополнительно можно указывать hyphens: auto, чтобы слова переносились не где попало, а по слогам, но тогда в преамбуле документа нужно указывать язык (типа <html lang="ru">).
w3schools утверждает что примерно с IE 5.5 все умеют, так что примерно после 2002 года нет особого смысла что-то там рвать на сервере
как в 3.11
pёrdooling
Кнопку «Пуск» рисовал появившийся в Win95 explorer.exe, позже перекочевавший и на платформу NT.
Кстати, Windows 95 и некоторые более поздние поставлялись с progman.exe (в Win95 даже был стартовый набор grp-файлов к нему с группами в стиле Win 3.x). Можно было в автозапуске вместо explorer.exe подставить progman.exe и радоваться олдскульной оболочке.
да! не taskman, а progman
>>некоторые более поздние
чуть ли не до win2k или даже xp
некоторые заменяли explorer.exe на всякие blackbox и еще на какие-то такие штуки
но как по мне его надо сразу азменять на far.exe или ISE
Была куча альтернативных оболочек, менее популярных. Были даже какие-то футуристические с 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
Надо порыть проект ReactOS, не завалялось ли в нём чего-нибудь похожего.
В Windows 3.x (и в просто 3.x, и в NT 3.x) свёрнутые группы выглядели как ярлыки: огромная пиктограмма, под которой полное название в несколько строчек. Пиктограммы запущенных приложений же отображались на фоне за пределами окна Progman (на том месте, где сейчас рабочий стол).
В общем, одной заменой explorer на progman то поведение не вернёшь. Нужно ковырять Shell32 и ещё какую-то фигню.
Корявый проект. Проверял 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
FindNextFileW аналогичным образом чистит атрибуты.
В остальных функциях ничего интересного не нашёл.
А в 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
А тут не всё хорошо. Хром научился переносить по слогам недавно, да и то только на Андроиде.
Честно не знаю, чем они отличаются. Надо копать исходники Mysqli.
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, т. е. в оба нужно передавать ссылку на соединение.
mysqli_execute ≡ mysqli_stmt_execute
mysqli_escape_string ≡ mysqli_real_escape_string
mysqli_set_opt ≡ mysqli_options
С одной стороны, deprecated. С другой стороны, шапку зачем-то обновили до PHP Version 7.
хахахаха блядь 😀 😀
функциям с real доверия больше? 😀