#sql #sql-server #sql-server-2008 #tsql
#sql #sql-сервер #sql-server-2008 #tsql
Вопрос:
Есть ли возможность написать запрос на удаление внутри предложения Where.
Пример:
Select ID,Name From MyTable Where ID IN(Delete From MyTable)
Возможно, это безумие, но позвольте мне объяснить мою ситуацию. В нашем инструменте создания отчетов мы поддерживаем ввод запроса SQL where.
Мы будем использовать наш собственный запрос предложения Select и From и объединять входные данные пользовательского запроса where.
Пример:
Select ID,Name From MyTable Where ("Query typed by user")
Здесь пользователь может ввести любой фильтр запроса where..
Если он вводит как ID= 100, наш окончательный запрос становится таким
Select ID,Name From MyTable Where (ID=100)
Один из наших клиентов спросил нас, что произойдет, если кто-нибудь введет запрос на удаление в качестве фильтра запроса where. он чувствует, что это может быть безопасность hole..so мы испробовали такую возможность в нашей среде разработки. Но sql возвращает ошибку для следующего запроса.
Select ID,Name From MyTable Where ID IN(Delete From MyTable)
Итак, наконец, мой вопрос в том, есть ли какая-либо другая возможность написать запрос на удаление внутри предложения Where или предложения Select.. Если это возможно, как я могу его ограничить?
Комментарии:
1. ДА! Если они вводят свой запрос как что-то вроде «;GO; УДАЛИТЬ ИЗ MyTable». Существует много вариантов этого, поэтому вам действительно нужно изучить способы остановки SQL-инъекции. Самый простой способ избежать этого — параметризовать ваш запрос и передать пользовательский текст в качестве параметра.
2. Да, это очень опасно. Они могли бы поставить что-то вроде 1 = 1; удалить из таблицы. Поисковая sql-инъекция.
3. Это SQL-инъекция, и вы не должны позволять пользователю вводить любой запрос, который он / она хочет. Что делать, если запрос, который они добавляют, таков
ID=100); DELETE FROM MyTable;
?
Ответ №1:
ДА. Они могут выполнить удаление. Они могут вводить:
1 = 1; DELETE FROM MY_TABLE;
Или даже хуже в некотором смысле (поскольку у вас должны быть резервные копии).:
1 = 0 UNION SELECT SOCIAL_SECURITY_NUMBER, CREDIT_CARD_NUMBER, OTHER_SENSITIVE_DATA FROM MY_SENSITIVE_TABLE;
Теперь, в вашем случае, его сложно проверить. Обычно, если вы просто передаете значение для фильтрации, вы можете использовать параметризованный sql, чтобы сохранить себя. Однако вам также необходимо разрешить пользователю выбирать столбец. В подобных случаях обычно мы используем выпадающий список, позволяющий пользователю выбрать предопределенный список столбцов, а затем проверить имя столбца на стороне сервера. Мы предоставляем пользователю текстовое поле для ввода соответствующего значения, а затем параметризуем его.
Ответ №2:
Это не совсем возможно. Но он может сделать что-то вроде этого :
Select ID,Name From MyTable Where (ID=100); (DELETE FROM MyTable Where 1 = 1)
используя ID=100); (DELETE FROM MyTable Where 1 = 1
вместо ID=100
Ответ №3:
Я полагаю, что ваш клиент говорит о внедрении SQL, если вы использовали соответствующие методы для блокирования выполнения других запросов после выполнения вашего оператора select, тогда у вас не должно возникнуть проблем с тем, чтобы позволить им вводить все, что вы хотите. По моему опыту, нет способа удалить что-либо, когда вы выполняете оператор select . Просто убедитесь, что у вас есть символы завершения запроса, чтобы они не написали что-то вроде следующего.
select column1,column2, from myTable where ID in (1,2); delete from my table
это было бы обоснованным беспокойством со стороны вашего клиента, если вы не предпринимаете надлежащих шагов для предотвращения внедрения sql.
У вас может быть, что ваш инструмент SQL reporting tool просто не имеет разрешения на обновление или удаление, а просто имеет разрешение на чтение. Тем не менее, это зависит от вас, ребята, справитесь ли вы со своей безопасностью sql-инъекций.