如何混淆SQL Sprocs?

时间:2009-01-07 16:03:40

标签: sql stored-procedures obfuscation

有没有办法隐藏/保护/混淆MS SQL存储过程?

10 个答案:

答案 0 :(得分:10)

如果它的功能非常先进,我可以模糊地理解混淆代码,但我认为混淆你的SQL可能不值得麻烦。

无论如何,我在这里看到的很多SQL都是标准的混淆。

答案 1 :(得分:10)

答案 2 :(得分:6)

请参阅CREATE PROCEDURE语句的ENCRYPTION选项。

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

答案 3 :(得分:4)

没有。至少,不是以不可逆转的方式。 SQL Server 2000的“WITH ENCRYPTION”可以反转以获得原始明文。伪代码和一个说明这个的T-SQL脚本在这里: http://education.sqlfarms.com/education/ShowPost.aspx?PostID=783

注意:我没有尝试使用SQL 2005或更高版本,但我的猜测是它同样容易受到攻击..正如MSDN文档所述:

  

ENCRYPTION       表示SQL Server将CREATE PROCEDURE语句的原始文本转换为模糊处理格式。

重点是我的。

答案 4 :(得分:2)

一种选择是将存储过程的敏感部分放在CLR存储过程中,并使用专业混淆产品对该程序集进行模糊处理。

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

答案 5 :(得分:2)

如果你知道但是对于大多数人来说代价都很恐怖,那就很容易逆转。 十六进制编码你的sproc逻辑然后用EXEC执行(@hexEncodedString) 见post

答案 6 :(得分:2)

老帖子,我知道。但是我从这里搜索“我为什么要混淆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

答案 7 :(得分:1)

您可以在创建存储过程时使用ENCRYPTION子句。

这将依赖于不将源SQL留在客户机器上。

有关详细信息,请参阅此处:

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

答案 8 :(得分:0)

您始终可以在C#(或VB)中编写普通代码,并将其存储在DLL中的数据库之外。

然后您不必担心混淆SQL。

答案 9 :(得分:0)

如果你真的担心有人进入数据库并看到程序的来源,那么正如S. Lott所说,你可以将程序移植到C#。我推荐LINQ。

但是,数据库本身应该受到保护,以免人们访问不应该执行的过程的代码。您可以将用户或组的权限限制为仅在需要时具有对执行的EXECUTE访问权限。