Альтернатива mysql_real_escape_string, не соединяясь с DB

Они не синонимы - display: none, удаляет элемент из потока страницы и отдыха потоков страницы, как будто это не было там.

visibility: hidden скрывает элемент от представления, но не потока страницы, оставляя пространство для него на странице.

86
задан PeeHaa 3 November 2013 в 17:00
поделиться

4 ответа

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

Если вы только тестирование ,

72
ответ дан 24 November 2019 в 08:01
поделиться

В противоположность моему другому ответу, эта следующая функция, вероятно, безопасна даже с многобайтовыми символами.

// 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;
}

Я надеюсь, что кто-то более осведомленный, чем я, скажет мне, почему приведенный выше код не работает ...

25
ответ дан 24 November 2019 в 08:01
поделиться

Что ж, согласно справочной странице функции mysql_real_escape_string : «mysql_real_escape_string () вызывает библиотечную функцию MySQL mysql_real_escape_string, которая экранирует следующие символы: \ x00, \ n, \ r , \, ', "and \ x1a."

Имея это в виду, функция, указанная во второй опубликованной вами ссылке, должна делать именно то, что вам нужно:

function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}
62
ответ дан 24 November 2019 в 08:01
поделиться

В результате дальнейшего исследования я обнаружил:

http: // dev. mysql.com/doc/refman/5.1/en/news-5-1-11.html

Исправление безопасности:

В обработке многобайтового кодирования обнаружена дыра в безопасности SQL-инъекции. Ошибка была на сервере, неправильно анализируя строку, экранированную с помощью функции API mysql_real_escape_string () C.

Эта уязвимость была обнаружена и сообщена Джошем Беркусом и Томом Лейном в рамках межпроектного сотрудничества консорциума 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.

6
ответ дан 24 November 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: