Итак, я играл с моим MS SQL Server 2008 приложением, чтобы увидеть, насколько хорошо оно защищено от SQL-инъекций. Приложение позволяет пользователям создавать представления в базе данных.
Теперь рассмотрим следующее:
create view dbo.[]]; drop database foo--] as select 1 as [hi!]
Это создает представление с именем ]; drop database foo--
. Он действителен, и вы можете выбрать из него (очевидно, возвращает номер 1).
Странная вещь # 1:
В SQL Management Studio запрос SELECT [hi!] FROM [dbo].[]]; drop database foo--]
выделен красным как неправильный, утверждая, что имя объекта недопустимо. Тем не менее, он выполняет и возвращает 1.
Странная вещь # 2:
Вызов OBJECT_ID(']; drop database foo--')
возвращает NULL (что означает, что объект не существует), но следующий запрос возвращает информацию о представлении правильно:
select * from sys.objects where name = ']; drop database foo--';
Это ошибки или мне не хватает точки?