【发布时间】:2009-01-07 16:03:40
【问题描述】:
有没有办法隐藏/保护/混淆 MS SQL 存储过程?
【问题讨论】:
标签: sql stored-procedures obfuscation
有没有办法隐藏/保护/混淆 MS SQL 存储过程?
【问题讨论】:
标签: sql stored-procedures obfuscation
如果混淆代码的功能非常先进,我可以模糊地理解它,但我认为混淆你的 SQL 可能不值得麻烦。
不管怎样,我在这里看到的很多 SQL 都被混淆为标准。
【讨论】:
【讨论】:
请参阅 CREATE PROCEDURE 语句的 ENCRYPTION 选项。
【讨论】:
没有。至少,不是以不可逆转的方式。 SQL Server 2000 的“WITH ENCRYPTION”可以反向获取原始明文。说明这一点的伪代码和 T-SQL 脚本在这里: http://education.sqlfarms.com/education/ShowPost.aspx?PostID=783
注意:我没有在 SQL 2005 或更高版本上尝试过,但我猜它同样容易受到攻击。正如 MSDN 文档所述:
加密 表示 SQL Server 会将 CREATE PROCEDURE 语句的原始文本转换为混淆格式。
重点是我的。
【讨论】:
一种选择是仅将存储过程的敏感部分放在 CLR 存储过程中,并使用专业的混淆产品对该程序集进行混淆。
【讨论】:
如果你知道的话,很容易可逆,但对大多数浏览代码的人来说是可怕的。
十六进制编码您的存储过程逻辑,然后使用 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。
【讨论】:
如果您真的担心有人进入数据库并查看该过程的源代码,那么正如 S. Lott 所说,您可以将该过程移植到 C#。我会推荐 LINQ。
但是,数据库本身可能应该受到保护,以防止人们访问不应该访问的过程的代码。如果需要,您可以将用户或组的权限限制为仅对 proc 具有 EXECUTE 访问权限。
【讨论】: