Альтернатива mysql real escape string без подключения к БД

Я хотел бы, чтобы функция вела себя как mysql_real_escape_string без подключения к базе данных, поскольку иногда мне нужно выполнить сухое тестирование без подключения к БД. mysql_escape_string устарел и поэтому нежелателен. Некоторые из моих выводов:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

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.