Альтернатива mysql real escape string без подключения к БД
Я хотел бы, чтобы функция вела себя как mysql_real_escape_string без подключения к базе данных, поскольку иногда мне нужно выполнить сухое тестирование без подключения к БД. mysql_escape_string устарел и поэтому нежелателен. Некоторые из моих выводов:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
4 ответов
невозможно безопасно избежать строки без подключения к БД. mysql_real_escape_string()
и подготовленные операторы нуждаются в подключении к базе данных, чтобы они могли избежать строки, используя соответствующий набор символов - в противном случае атаки SQL-инъекций по-прежнему возможны с использованием многобайтовых символов.
Если вы только тестирование, тогда вы можете также использовать mysql_escape_string()
, это не 100% гарантировано от атак SQL-инъекций, но невозможно построить что - либо более безопасное без подключение к БД.
ну, по использования mysql_real_escape_string страница ссылки на функцию: "mysql_real_escape_string () вызывает библиотечную функцию 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);
}
в прямой оппозиции к моему другому ответу, эта следующая функция, вероятно, безопасна, даже с многобайтовыми символами.
// 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-инъекции. Ошибка была на сервере, неправильно разбирая строку, экранированную с помощью функции mysql_real_escape_string () C API.
эта уязвимость была обнаружена и сообщена Джошем Беркусом и Томом Лейном в рамках межпроектное сотрудничество консорциума OSDB в области безопасности. Дополнительные сведения о SQL-инъекции см. В следующем тексте.
Обсуждение. В обработке многобайтовой кодировки обнаружено отверстие безопасности SQL-инъекции. Дыра безопасности SQL-инъекции может включать ситуацию, когда пользователь предоставил данные для вставки в базу данных, пользователь может ввести инструкции SQL в данные, которые сервер будет выполнять. Что касается этой уязвимости, когда характер используется неосознанное экранирование (например, addslashes () в PHP), можно обойти экранирование в некоторых многобайтовых наборах символов (например, SJIS, BIG5 и GBK). В результате функция, такая как addslashes (), не может предотвратить атаки SQL-инъекций. Это невозможно исправить на стороне сервера. Лучшее решение для приложений-использовать экранирование набора символов, предлагаемое такой функцией mysql_real_escape_string ().
однако была обнаружена ошибка в том, как MySQL server анализирует выходные данные mysql_real_escape_string (). В результате, даже когда была использована функция mysql_real_escape_string (), основанная на наборе символов, SQL-инъекция была возможна. Эта ошибка была исправлена.
обходные пути. Если вы не можете обновить MySQL до версии, которая включает исправление ошибки в синтаксическом анализе mysql_real_escape_string (), но запустите MySQL 5.0.1 или выше, вы можете использовать режим NO_BACKSLASH_ESCAPES SQL в качестве обходного пути. (Этот режим был введен в MySQL 5.0.1.) NO_BACKSLASH_ESCAPES включает стандартный режим совместимости SQL, где обратная косая черта не считается специальным символом. Результатом будет сбой запросов.
установить этот режим для текущего соединения, введите следующую инструкцию SQL:
SET sql_mode='NO_BACKSLASH_ESCAPES';
вы также можете установить режим глобально для всех клиентов:
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
этот режим SQL также может быть включен автоматически при запуске сервера с помощью опции командной строки --в SQL-режиме=NO_BACKSLASH_ESCAPES или параметр в SQL-режиме=NO_BACKSLASH_ESCAPES в варианте файл-сервер (например, мой.CNF или My.Ини, в зависимости от вашей системы). (Ошибка#8378, CVE-2006-2753)
см. Также ошибку#8303.