В любом случае, чтобы прекратить получать потенциальную многобайтовую строку символов - PullRequest
1 голос
/ 02 февраля 2012

За это отличная откровенная статья , написанная сек. Эксперт , я становлюсь довольно подозрительным к входящим строкам - из-за того, что mysql_real_escape_string может быть обманут ...

Проблема строго связана с многобайтовыми наборами символов, такими как GBK. Если пользовательский ввод не является многобайтовым вводом, то никаких проблем, никаких проблем там нет, так как mysql_real_escape_string будет достаточно хорош для внедрения SQL-кода - при условии, что вы правильно выполняете базовые проверки типов данных.

Я не говорю, что многобайтовые - это зло ... но если вам не приходится иметь дело с многобайтовыми ситуациями, тогда не надо. Придерживайтесь utf-8, если это работает для вас, и просто оставайтесь в utf-8 все время ... Но вопрос в том, как? Потому что именно пользователь запускает процесс, отправляя вам строку не в формате utf-8 и, возможно, многобайтовую строку, такую ​​как GBK ...

Как вы можете быть уверены, что сможете успешно и надежно отклонить этот пользовательский ввод? Из того, что я читаю / изучаю, невозможно узнать, в каком наборе символов находится входящая строка пользователя. Тогда что?

Другими словами, как убедиться, что вы работаете с пользовательскими строками utf-8? Я спрашиваю об этом, потому что все функции фильтра / очистки PHP предназначены для работы с вводом utf-8, они не знают, как работать с многобайтовыми данными? Как отмечается в статье, измерения защиты становятся причиной отказа.

ооо, пожалуйста, не говорите просто использовать готовые заявления ... уже в курсе этого превосходного варианта.

1 Ответ

2 голосов
/ 02 февраля 2012

Эта отличная статья, которая открыла глаза, была написана почти десять лет назад и стала немного устаревшей.
С тех пор все немного улучшилось.
PHP получил функцию для управления mysql_real_escape_string () и создания ее на самом деле"с учетом текущего набора символов соединения", как говорится в документации.

Проблема строго связана не с многобайтовыми наборами символов, такими как GBK, а с набором символов неправильное толкование .Итак, вы просто должны сказать mysql, с каким набором символов вы работаете.И поэтому нет никакого смысла обнаруживать многобайтовые строки вообще.

Итак, просто установите правильный набор символов, используя mysql_set_charset(), и вы будете в безопасности.

Вот небольшая демонстрация, которую я написал по теме .

Также имейте в виду, что не каждая многобайтовая кодировка уязвима.UTF-8 довольно безопасен.В противном случае мы перенесли бы миллионы инъекций сегодня.

...