有没有办法隐藏/保护/混淆MS SQL存储过程?
答案 0 :(得分:10)
如果它的功能非常先进,我可以模糊地理解混淆代码,但我认为混淆你的SQL可能不值得麻烦。
无论如何,我在这里看到的很多SQL都是标准的混淆。
答案 1 :(得分:10)
如果你必须隐藏它,那么“WITH ENCRYPTION”条款怎么样?
答案 2 :(得分:6)
请参阅CREATE PROCEDURE语句的ENCRYPTION选项。
答案 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存储过程中,并使用专业混淆产品对该程序集进行模糊处理。
答案 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访问权限。