[closed] Валидация ввода пользователя для предотвращения SQL-инъекций
SELECT * FROM table WHERE field = '%s';
Объясните мне, что нужно, кроме фильтра на одинарные кавычки.
гугл
гугл!да, гугл
В питоне наверное дела обстоят также.
Строка может содержать одинарные кавычки
В данном случае используется sqlite, а сам запрос не подходит под стандартный тип, для которого есть автоматические проверки.
О! Спасибо, что сказал, возьму на заметку. А то я обычно либо так пихал, либо делал обычный Statement и потом пихал через ResultSet.
Если ты пользуешься этим интерфейсом, то строка не проходит через СУБДшный парсер запросов, поэтому все равно содержит она кавычки или нет.
Я примерно представляю, о чем ты говоришь, примерно так у меня и сделано в 99% запросов. Но тут особый случай, для него пришлось непосредственно писать SQL запрос.
Если особый случай, то, наверное, можно оставить его открытым для инъекций!
Интересуют алгоритмыhttp://blog.moertel.com/articles/2006/10/18/a-type-based-sol...
труъ шняга, правда, для типизованных языков
Проэкранируй все одинарные кавычки. Будет тебе счастье.
они вроде не экранируются, а на '' (две одинарных кавычки) заменяются
нахрена? встроенные средства dbapi прекрасно всё реализуют без дырявых велосипедов в духе пхп
SQLText := Format('SELECT * FROM table WHERE field = "%s"', [
StringReplace(UserFieldValue, '''', '''''', [rfReplaceAll])]);
в теории всё так, но в жизни бывает, что от пользовательских данных зависит например имя таблицы, в которую задается запрос или какие поля выбираются. так что ничего не поделаешь, приходится строить запрос на лету, и нужна функция, которая будет проверять вводимые данные на инъекции. и вряд ли такая функция будет в стандартной библиотеке, потому что способ проверки необычный, например
$table =~ /`/ and die;
$dbh->do("insert `$table` ...");
так что ничего не поделаешь, приходится строить запрос на летуимена таблиц и имена колонок надо брать не из юзеринпута, а из своих внутренних мапов
после этого ты строишь запрос с вопросиками, и все как обычно
не надо тут панику разводить
а потом когда в таблице добавляется колонка, надо идти искать разработчика, чтобы он её в этот свой внутренний мап добавил, пересобрал программу, поставил в тестинг, подождал денек, потом выкатил, в чем смысл :-\ неужели так сложно написать проверку, что имя колонки состоит только из букв цифр и подчерка...
зато теоретически всё правильно!
а потом когда в таблице добавляется колонкаа что - колонки свтой дух что-ли добавляет?
если меняется БД, то вполне логично, что разработчик должен потом поучаствовать.
или инженер БД будет отвечать за появившиеся баги?
неужели так сложно написать проверку, что имя колонки состоит только из букв цифр и подчерка...приведи, пожалуйста, реальный use case, когда имя колонки или таблицы вводится пользователем
ps
чтобы выбирался я еще могу придумать, но тогда как раз на сервере строится map, а пользователю передаются какие-то идентификаторы из map-а, а не реальные имена колонок/таблиц.
Да "вводится" - это черезчур)
приведи, пожалуйста, реальный use case, когда имя колонки или таблицы вводится пользователемкогда ты хочешь оставить пользователю возможность вводить запросы руками, а ограничивать его встроенным генератором
Не хочется искать программиста - открываешь БД на чтение\запись всем, и вперед...
Оставить комментарий
Oper
Интересуют алгоритмы, а также готовые решения для надежной валидации вводимых пользователем данных в шаблонах запросов видаХотелось бы что-то в духе parse tree validation...
Предпочтительный язык - Python.
Спасибо.