2012-02-01 3 views
1

Per this excellent eye-opener articleнаписанное sec. эксперт, я стал довольно подозрительным относительно входящих строк - из-за того, что mysql_real_escape_string может быть обмануто ...В любом случае, чтобы прекратить прием потенциальной многобайтовой строки символов

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

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

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

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

оооооооооооооооооооооооооооооооооооооооооооооооо!

ответ

2

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

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

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

Адрес a little demo I wrote on the topic.

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

+0

Отличный ответ! Это сделало мой день ... есть ли необходимость также следить за тем, чтобы страницы php содержали этот один вкладыш на борту? 'header ('Content-type: text/html; charset = utf-8');' или еще лучше, просто сделайте это вместо 'default_charset =" utf-8 "' в php.ini для раз и навсегда? Являются ли 'mysql_set_charset()' и 'default_charset =" utf-8 "' заботой о разных вещах? Поддерживать друг друга? Если у вас есть один, вам не нужен другой? –

+0

HTTP и SQL действительно разные вещи. HTTP-кодирование не имеет ничего общего с типиком. Вы должны настроить его, используя настройку header() или ini, чтобы сайт работал правильно, но он не повлияет на безопасность SQL вообще –