Альтернатива 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 81

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-injection. Это невозможно исправить на стороне сервера. Лучшим решением для приложений является использование экранирования с учетом набора символов, предлагаемого функцией, такой как 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-mode=NO_BACKSLASH_ESCAPES или путем установки sql-mode=NO_BACKSLASH_ESCAPES в файле опций сервера (например, my.CNF или My.Ини, в зависимости от вашей системы). (Ошибка#8378, CVE-2006-2753)

Смотрите также ошибку#8303.