Какие символы должны быть экранированы для предотвращения (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;