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