[closed] Валидация ввода пользователя для предотвращения SQL-инъекций
может так:
Объясните мне, что нужно, кроме фильтра на одинарные кавычки.
SELECT * FROM table WHERE field = '%s';
Объясните мне, что нужно, кроме фильтра на одинарные кавычки.
гугл
гугл!да, гугл
Я не знаю, как в питоне, а в Java стандартная библиотека не содержит функции, которая преобразует строку для подстановки в запрос. Вместо этого предполагается, что ты пользуешься интерфейсом PreparedStatement, который позволяет сначала передать СУБД сам запрос, а потом забиндить значения переменных. Такой способ теоретически является более правильным с точки зрения перформанса, так как например Oracle сможет повторно использовать распарсенные запросы.
В питоне наверное дела обстоят также.
В питоне наверное дела обстоят также.
Строка может содержать одинарные кавычки
В данном случае используется sqlite, а сам запрос не подходит под стандартный тип, для которого есть автоматические проверки.
О! Спасибо, что сказал, возьму на заметку. А то я обычно либо так пихал, либо делал обычный Statement и потом пихал через ResultSet.
Если ты пользуешься этим интерфейсом, то строка не проходит через СУБДшный парсер запросов, поэтому все равно содержит она кавычки или нет.
Я примерно представляю, о чем ты говоришь, примерно так у меня и сделано в 99% запросов. Но тут особый случай, для него пришлось непосредственно писать SQL запрос.
Тогда ОК!
Если особый случай, то, наверное, можно оставить его открытым для инъекций!
Если особый случай, то, наверное, можно оставить его открытым для инъекций!
Интересуют алгоритмыhttp://blog.moertel.com/articles/2006/10/18/a-type-based-sol...
труъ шняга, правда, для типизованных языков

Проэкранируй все одинарные кавычки. Будет тебе счастье.
они вроде не экранируются, а на '' (две одинарных кавычки) заменяются
нахрена? встроенные средства dbapi прекрасно всё реализуют без дырявых велосипедов в духе пхп
В SQLIte вроде бы нужно экранировать только одинарные кавычки. Вот так, например (код для дельфи)
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, когда имя колонки или таблицы вводится пользователемкогда ты хочешь оставить пользователю возможность вводить запросы руками, а ограничивать его встроенным генератором
Так а смысл защищаться тогда от sql-инъекций, если ты пользователю и так позволяешь из произвольной таблицы заселектить произвольную колонку?
Не хочется искать программиста - открываешь БД на чтение\запись всем, и вперед...
Не хочется искать программиста - открываешь БД на чтение\запись всем, и вперед...
Оставить комментарий
Oper
Интересуют алгоритмы, а также готовые решения для надежной валидации вводимых пользователем данных в шаблонах запросов видаХотелось бы что-то в духе parse tree validation...
Предпочтительный язык - Python.
Спасибо.