Как известно, в SQL Server можно скрыть исходный текст таких объектов, как Процедуры, Функции, Представления и Триггеры. Но так ли надёжна эта защита?
Ответ: конечно же, нет(!), расшифровать эти объекты проще простого.
Для демонстрации создадим тестовую процедуру:
CREATE PROCEDURE TestProc
WITH ENCRYPTION
AS
BEGIN SELECT @@VERSION
END
Просмотреть её код обычным образом не выдет, так как текст скрыт и она помечена, как Encrypted.
Для получения исходного кода объектов в SQL Server 2000, необходимо создать процедуру procDecryptObject2000.
Здесь всё вообще не вызывает вопросов, так как зашифрованный текст объектов храниться в системной таблице syscomments в поле ctext.
Запускаем процедуру
EXECUTE dbo.procDecryptObject2000 'TestProc'
И вуаля… получаем текст нашей процедуры в открытом виде.
Как же дела обстоят в SQL Server 2005/2008? Скажем так: ни чуть не лучше! =)))
Всё отличие в том, что даже зашифрованный код не виден непосредственно ни в одном представлении каталога SQL Server. Пользователи, не имеющие доступа к системным таблицам или файлам баз данных, не смогут получить этот текст. Однако этот текст будет доступен привилегированным пользователям, которые смогут обращаться к системным таблицам либо через порт выделенного административного соединения, либо будут иметь непосредственный доступ к файлам баз данных.
Создадим процедуру procDecryptObject2005, в которой два входных параметра: схема объекта и само наименование объекта. Если запустить её в обычном режиме:
EXECUTE dbo.procDecryptObject2005 'dbo', 'TestProc'
То мы получим ошибку:
Msg 208, Level 16, State 1, Procedure procDecryptObject2005, Line 51 Invalid object name 'sys.sysobjvalues'.
Как было сказано выше, для расшифровки необходимо использовать выделенное административное соединение (DAC). Запускаем из командной строки (cmd):
А дальше вызываем нашу процедуру и получаем текст в открытом виде. ;)