Альтернатива mysql_real_escape_string без подключения к базе данных

StackOverflow https://stackoverflow.com/questions/1162491

Вопрос

Я бы хотел, чтобы функция вела себя как 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

Это было полезно?

Решение

Невозможно безопасно экранировать строку без подключения к базе данных. mysql_real_escape_string() а подготовленным операторам требуется подключение к базе данных, чтобы они могли экранировать строку, используя соответствующий набор символов - в противном случае атаки с использованием SQL-инъекций все еще возможны с использованием многобайтовых символов.

Если вы только тестирование, тогда вы также можете использовать mysql_escape_string(), это не гарантирует на 100% защиту от атак SQL-инъекций, но невозможно создать что-либо более безопасное без подключения к БД.

Другие советы

Ну, в соответствии с mysql_real_escape_string_ строка mysql_real_escape_string справочная страница по функциям:"mysql_real_escape_string() вызывает библиотечную функцию MySQL mysql_real_escape_string, которая экранирует следующие символы:\x00, , , \, ', " и \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 анализирует выходные данные 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top