Я бы хотел, чтобы функция работала как mysql_real_escape_string без подключения к базе данных, так как иногда мне нужно проводить сухое тестирование без подключения к базе данных. mysql_escape_string устарел и поэтому нежелателен. Некоторые из моих выводов:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
php
mysql
mysql-real-escape-string
Вьетнам
источник
источник
Ответы:
Невозможно безопасно избежать строки без подключения к БД.
mysql_real_escape_string()
и подготовленным операторам требуется соединение с базой данных, чтобы они могли экранировать строку, используя соответствующий набор символов - в противном случае атаки SQL-инъекций все еще возможны с использованием многобайтовых символов.Если вы только тестируете , то вы также можете использовать
mysql_escape_string()
, это не на 100% гарантировано от атак SQL-инъекций, но невозможно построить что-то более безопасное без подключения к БД.источник
mysql_escape_string
без подключения (все еще пытаюсь понять, почему). Поскольку эта функция устарела, мне просто интересно, как я могу ее заменить. Конечно, кажется разумным, что можно было бы указать «соответствующий набор символов» в любой функции, которая его заменяет, не открывая соединения.Что ж, согласно справочной странице функции mysql_real_escape_string : «mysql_real_escape_string () вызывает библиотечную функцию MySQL mysql_real_escape_string, которая экранирует следующие символы: \ x00, \ n, \ r, \, ',« и \ x1a ».
Имея это в виду, функция, указанная во второй опубликованной вами ссылке, должна делать именно то, что вам нужно:
function mres($value) { $search = array("\\", "\x00", "\n", "\r", "'", '"', "\x1a"); $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z"); return str_replace($search, $replace, $value); }
источник
mb_strpos()
(иmb_substr()
создавать поведение, подобноеsubstr_replace()
) для этого?В отличие от моего другого ответа, эта следующая функция, вероятно, безопасна даже с многобайтовыми символами.
// replace any non-ascii character with its hex code. function escape($value) { $return = ''; for($i = 0; $i < strlen($value); ++$i) { $char = $value[$i]; $ord = ord($char); if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126) $return .= $char; else $return .= '\\x' . dechex($ord); } return $return; }
Я надеюсь, что кто-то более осведомленный, чем я, скажет мне, почему приведенный выше код не работает ...
источник
В результате дальнейших исследований я обнаружил:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
Исправление безопасности:
При обработке многобайтового кодирования обнаружена дыра в безопасности SQL-инъекции. Ошибка была на сервере, некорректном анализе строки, экранированной с помощью функции C API mysql_real_escape_string ().
Эта уязвимость была обнаружена и сообщена Джошем Беркусом и Томом Лейном в рамках межпроектного сотрудничества консорциума OSDB в области безопасности. Дополнительные сведения о SQL-инъекции см. В следующем тексте.
Обсуждение. При обработке многобайтового кодирования обнаружена дыра в безопасности SQL-инъекций. Брешь в безопасности SQL-инъекции может включать ситуацию, при которой, когда пользователь предоставляет данные для вставки в базу данных, пользователь может вводить операторы SQL в данные, которые сервер будет выполнять. Что касается этой уязвимости, когда используется экранирование без учета набора символов (например, добавляетlashes () в PHP), можно обойти экранирование в некоторых многобайтовых наборах символов (например, SJIS, BIG5 и GBK). В результате такая функция, как addlashes (), не может предотвратить атаки с использованием SQL-инъекций. На стороне сервера исправить это невозможно. Лучшее решение для приложений - использовать экранирование с учетом набора символов, предлагаемое такой функцией, как mysql_real_escape_string ().
Однако была обнаружена ошибка в том, как сервер MySQL анализирует вывод mysql_real_escape_string (). В результате, даже когда использовалась функция mysql_real_escape_string (), поддерживающая набор символов, SQL-инъекция была возможна. Эта ошибка исправлена.
Обходные пути. Если вы не можете обновить MySQL до версии, которая включает исправление ошибки в синтаксическом анализе mysql_real_escape_string (), но запускаете MySQL 5.0.1 или выше, вы можете использовать режим SQL NO_BACKSLASH_ESCAPES в качестве обходного пути. (Этот режим был представлен в MySQL 5.0.1.) NO_BACKSLASH_ESCAPES включает стандартный режим совместимости SQL, в котором обратная косая черта не считается специальным символом. В результате запросы не будут выполнены.
Чтобы установить этот режим для текущего соединения, введите следующий оператор SQL:
SET sql_mode='NO_BACKSLASH_ESCAPES';
Вы также можете установить режим глобально для всех клиентов:
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
Этот режим SQL также можно включить автоматически при запуске сервера с помощью параметра командной строки --sql-mode = NO_BACKSLASH_ESCAPES или путем установки sql-mode = NO_BACKSLASH_ESCAPES в файле параметров сервера (например, my.cnf или my.ini , в зависимости от вашей системы). (Ошибка № 8378, CVE-2006-2753).
См. Также Ошибка № 8303.
источник
NO_BACKSLASH_ESCAPES
приводит к другим уязвимостям .