Какие символы должны быть экранированы для предотвращения (My) SQL-инъекций?

Я использую функцию API MySQL

mysql_real_escape_string()

В соответствии с документацией он избегает следующих символов:

\0
\n
\r
\
'
"
\Z

Теперь я просмотрел библиотеку безопасности OWASP.org ESAPI, а в порту Python был следующий код (http://code.google.com/p/owasp-esapi-python/source/browse/esapi/codecs/mysql.py):

        """
        Encodes a character for MySQL.
        """
        lookup = {
        0x00 : "\\0",
        0x08 : "\\b",
        0x09 : "\\t",
        0x0a : "\\n",
        0x0d : "\\r",
        0x1a : "\\Z",
        0x22 : '\\"',
        0x25 : "\\%",
        0x27 : "\\'",
        0x5c : "\\\\",
        0x5f : "\\_",
        }

Теперь мне интересно, нужны ли все эти персонажи для экранирования. Я понимаю, почему существуют% и _, они являются метасимволами в LIKE-операторе, но я не могу просто понять, почему они добавили символы backspace и tabul (\ b\t)? Есть ли проблема с безопасностью, если вы выполняете запрос:

SELECT a FROM b WHERE c = '...user input ...';

Где пользовательский ввод содержит табуляторы или обратные символы?

Мой вопрос здесь: Почему они включили \b\t в библиотеку безопасности ESAPI? Есть ли ситуации, когда вам может понадобиться избежать этих символов?

Ответы

Ответ 1

Справочная страница MySQL для строк:

  • \0 Символ ASCII NUL (0x00).
  • \' Символ одиночной кавычки ( "'" ).
  • \" Символ двойной кавычки ( """ ).
  • \b Символ обратного пробела.
  • \n Символ новой строки (linefeed).
  • \r Символ возврата каретки.
  • \t Символ табуляции.
  • \Z ASCII 26 (Control-Z). См. Примечание, следующее за таблицей.
  • \\ Символ обратной косой черты ( "\" ).
  • \% Символ "%". См. Примечание, следующее за таблицей.
  • \_ Символ "_". См. Примечание, следующее за таблицей.

Ответ 2

Догадка о символе backspace: представьте, что я пришлю вам электронное письмо "Привет, вот запрос на обновление вашей базы данных по вашему желанию" и прикрепленный текстовый файл с

INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);

Вы катали файл, видите, все в порядке, и просто подключите файл к MySQL. Однако вы не знали, что я положил

DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b

до ЗАЯВЛЕНИЯ INSERT, которое вы не видели, потому что на консольном выводе резервные копии перезаписывали его. Bamm!

Просто догадайтесь.

Изменить (не выдерживает):

alt text

Ответ 3

Черный список (идентификация плохих символов) никогда не будет таким, если у вас есть другие варианты.

Вам нужно использовать объединение белых списков и, что более важно, привязки связанных параметров.

Хотя этот конкретный ответ имеет фокус PHP, он по-прежнему помогает многим и поможет объяснить, что просто запуск строки через фильтр char не работает во многих случаях. Пожалуйста, см. Do htmlspecialchars и mysql_real_escape_string сохраняют мой код PHP безопасным от инъекций?

Ответ 4

Где пользовательский ввод содержит табуляторы или обратные символы?

Весьма примечательно то, что до сих пор большинство пользователей считают, что он пользовательский ввод должен быть экранирован, а такое экранирование " предотвращает инъекции". p >

Ответ 5

Решение Java:

public static String filter( String s ) {
    StringBuffer buffer = new StringBuffer();
    int i;

    for( byte b : s.getBytes() ) {
        i = (int) b;

        switch( i ) {
            case  9 : buffer.append( "    " ); break;
            case 10 : buffer.append( "\\n"  ); break;
            case 13 : buffer.append( "\\r"  ); break;
            case 34 : buffer.append( "\\\"" ); break;
            case 39 : buffer.append( "\\'"  ); break;
            case 92 : buffer.append( "\\"   );

            if( i > 31 && i < 127 ) buffer.append( new String( new byte[] { b } ) );
        }
    }

    return buffer.toString();
}

Ответ 6

не удалось удалить только одну цитату из пользовательского ввода?

например: $input =~ s/\'|\"//g;