有没有办法隐藏/保护/混淆MS SQL存储过程?
我可以模糊地理解混淆代码,如果它的功能非常先进,但我认为混淆你的SQL可能不值得麻烦。
无论如何,我在这里看到的很多SQL都是标准的混淆。
如果你真的担心有人进入数据库并看到程序的来源,那么正如S. Lott所说,你可以将程序移植到C#。我推荐LINQ。
但是,数据库本身应该受到保护,以免人们访问不应该执行的过程的代码。您可以将用户或组的权限限制为仅在需要时具有对proc的EXECUTE访问权限。
如果你必须隐藏它,那么“WITH ENCRYPTION”条款怎么样?
请参阅CREATE PROCEDURE语句的ENCRYPTION选项。
不,至少,不是以不可逆转的方式。 SQL Server 2000的“WITH ENCRYPTION”可以反转以获得原始明文。伪代码和一个说明这一点的T-SQL脚本在这里:http://education.sqlfarms.com/education/ShowPost.aspx?PostID=783
注意:我没有尝试使用SQL 2005或更高版本,但我的猜测是它同样容易受到攻击..正如MSDN文档所述:
ENCRYPTION表示SQL Server将CREATE PROCEDURE语句的原始文本转换为模糊格式。
重点是我的。
一种选择是仅将存储过程的敏感部分放在CLR存储过程中,并使用专业混淆产品对该程序集进行模糊处理。
如果你知道但是对于大多数人来说代码都很恐怖,那就很容易逆转。十六进制编码你的sproc逻辑,然后执行EXEC(@hexEncodedString)。 看到这个post。
老帖子,我知道。但是我从这里搜索“我为什么要混淆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
您可以在创建存储过程时使用ENCRYPTION子句。
这将依赖于不将源SQL留在客户机器上。
有关详情,请参阅此处:
http://msdn.microsoft.com/en-us/library/ms187926(SQL.90).aspx
您始终可以在C#(或VB)中编写普通代码,并将其存储在DLL中的数据库外部。
然后,您不必担心混淆SQL。