Как обфускать SQL Sprocs?

Есть ли способ скрыть / защитить / обфускать хранимые процедуры MS SQL?

Я могу смутно понять обфускационный код, если он чрезвычайно продвинут в том, что он делает, но я думаю, что запутывание вашего SQL может не стоить того хлопот.

Во всяком случае, многие из SQL, которые я видел вокруг здесь, запутываются как стандарт.

Если вы должны скрыть это, как насчет положения «WITH ENCRYPTION»?

http://blog.sqlauthority.com/2007/07/01/sql-server-explanation-of-with-encryption-clause-for-stored-procedure-and-user-defined-functions/

См. Параметр ENCRYPTION для инструкции CREATE PROCEDURE.

http://msdn.microsoft.com/en-us/library/ms187926.aspx

Нет. По крайней мере, не так, чтобы это было невозможно. SQL Server 2000 «WITH ENCRYPTION» можно отменить, чтобы получить исходный текст. Псевдокод и сценарий T-SQL, который иллюстрирует это, можно найти здесь: http://education.sqlfarms.com/education/ShowPost.aspx?PostID=783

Примечание. Я не пробовал это с SQL 2005 или выше, но я предполагаю, что он так же уязвим. Как утверждают документы MSDN:

ENCRYPTION Указывает, что SQL Server преобразует исходный текст инструкции CREATE PROCEDURE в обфускационный формат.

Акцент мой.

Легко обратимый, если вы знаете, но пугаете большинство людей, ковыряющих код. hex кодирует логику sproc, а затем выполняется с EXEC (@hexEncodedString).
см. этот пост .

При создании хранимой процедуры вы можете использовать предложение ENCRYPTION.

Это будет полагаться на то, что не оставит исходный SQL на машине клиента.

См. Здесь для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/ms187926(SQL.90).aspx

Один из вариантов заключается в размещении только чувствительных частей хранимой процедуры в хранимой процедуре CLR и обфускации этой сборки с использованием профессионального продукта обфускации.

http://msdn.microsoft.com/en-us/library/ms131094.aspx

Старая почта, я знаю. Но я пришел от поиска «Почему я должен запутывать SQL?» Я просто установил бесплатный продукт под названием ApexSQL Refactor (без аффилиации), который предлагает компонент обфускации.

Он предлагает несколько различных вариантов для упрощения чтения вашего кода. Я не был уверен, почему мне нужна такая функция, поскольку другие отметили возможность шифрования ваших хранимых процедур. Во всяком случае, это пример вывода, который он может вернуть из своей функции обфускации.

CrEAtE Procedure spInsertOrUpdateProduct @ProductNumber nVarChar(25), @ListPrice Money aS IF exIsTS(selECt * FROm Production.Product WHere ProductNumber=@ProductNumber AnD ListPrice>1000) uPdatE Production. Product sET ListPrice=(ListPrice-100) where ProductNumber= @ProductNumber elsE INSerT intO Production.Product(ProductNumber, ListPrice) SelECT @ProductNumber,@ListPrice GO SElEct * fRoM Production.Product gO iNsERT iNTo Production.UnitMeasure( UnitMeasureCode,Name,ModifiedDate) vAlUeS(N'FT2',N'Square Feet', '20080923'); Go 

Вы всегда можете написать обычный код на C # (или VB) и сохранить его за пределами базы данных в DLL.

Тогда вам не нужно беспокоиться о запутывании вашего SQL.

Если вы действительно беспокоитесь о том, что кто-то попадает в БД и видит источник процедуры, то, как сказал С. Лотт, вы можете перенести процедуру на C #. Я бы порекомендовал LINQ.

Тем не менее, сама база данных должна, вероятно, быть защищена от людей, обращающихся к коду для процедур, которых не должно быть. Вы можете ограничить права пользователя или группы, чтобы иметь только EXECUTE доступ к proc, если это необходимо.