C# 如何保护dll函数不在我的应用程序之外使用?

C# 如何保护dll函数不在我的应用程序之外使用?,c#,security,design-patterns,c#-4.0,C#,Security,Design Patterns,C# 4.0,我想限制其他应用程序使用我编写的dll函数 例如。 如果我有包含两个函数的database.dll public void InsertInToDatabse(); public void ClearDatabase(); 现在,如果我的应用程序调用了InsertIntoDatabase(),并且正在执行其他一些工作,直到现在,如果其他应用程序通过引用database.dll调用ClearDatabase(),数据库将被删除。那么,我如何限制从第三方应用程序对这些函数的调用 你不能阻止人们调用

我想限制其他应用程序使用我编写的dll函数

例如。 如果我有包含两个函数的database.dll

public void InsertInToDatabse();
public void ClearDatabase();

现在,如果我的应用程序调用了InsertIntoDatabase(),并且正在执行其他一些工作,直到现在,如果其他应用程序通过引用database.dll调用ClearDatabase(),数据库将被删除。那么,我如何限制从第三方应用程序对这些函数的调用

你不能阻止人们调用你的函数,但你可以自由地实现你的函数来防止这种情况

例如,您可以在数据库访问周围设置一个锁,以使调用阻塞,直到上一个调用完成,或者您可以设置一个标志,使Clear()调用立即返回,并显示错误代码或异常


编辑:我可能误解了这个问题。如果您永远不希望第三方代码调用您的函数,那么请按照Marcus的建议使用internal(和/或InternalsVisibleTo)。

如果我没记错的话,
internal
关键字正好适用于这些类型的情况

编辑:如评论中所述,如果
类别A
位于
程序集B
中,则程序集D中的
类别C将无法访问
A

另外,正如其他答案所指出的,您可以(也可能应该)在
ClearDatabase()
中进行某种形式的身份验证

编辑2:我刚刚意识到这些权限应该在数据库级别,这意味着如果以下用户(具有这些权限):

如果试图
删除表
,那么应用程序将抛出异常(或者不管您如何处理错误),这显然会阻止他们这样做

这并不是说您不应该将
ClearDatabase()
设置为
internal
,但如果用户(第三方正在使用的)有权
删除表
,则他/她将能够进行设置

编辑3:

The problem is not how to secure your code, the problem is how to secure your database.

– Huusom

如果dll是类库,则实际的配置文件将是客户端应用程序(web.config或app.exe.config)中的一个,其中只有授权的应用程序具有正确的连接字符串,其中包含用户名、密码、db服务器和db名称

现在,即使可以阻止未经授权的应用程序以您正在寻找的方式调用dll的方法,但如果这些坏应用程序通过了解连接字符串直接访问数据库,它们仍然可以乱来

这意味着,事实上,只要配置在dll之外,您就不必担心,因为只有经过授权的应用程序才能访问正确的数据库


如果这种方法仍然不能满足您的要求,那么您应该使用像CAS这样的安全检查,它允许您指定哪个类或程序集可以调用某个方法,这样即使您的dll被另一个应用程序引用,它也不会工作。请注意,在.NET 4中(您在问题中对其进行了标记),整个安全层已被更改,其工作方式与较旧的.NET Framework版本不同。有关更多详细信息,请参阅本文:

您可以对要保护的方法使用内部访问(而不是公共),然后将项目标记为好友程序集。这与允许单元测试项目访问内部方法的方式相同

这是来自

只有显式指定为好友的程序集才能访问好友(Visual Basic)或内部(C#)类型和成员。例如,如果程序集B是程序集a的友元,而程序集C引用程序集B,则C无权访问a中的友元(Visual Basic)或内部(C#)类型


正如马库斯所提到的,您可以使用
内部
关键字。然后使用应用程序集的assemblyname和公钥(如果使用强assemblyname),将
InternalsVisibleToAttribute
应用于类库


如果你问的是安全问题: 另一种技术是让客户端传入参数,例如密码或加密的连接字符串


如果您询问有关缓存限制的问题(例如,只允许每分钟调用一次此方法),请查看[AspNetCacheProfile]中的服务或Cache.Insert中的应用程序代码。

可能重复的。有一些很好的见解。问题不在于如何保护您的代码,而在于如何保护您的数据库。Marcus Hansson[internal void ClearDatabase()],GazTheDestroyer,Davide Piras。。。他们都给了你最好的建议。及其他;;我可以建议你,如果不能从其他应用程序中使用,请使用一个好的.net模糊器。它们仍然可以反编译,因此保护您的连接字符串或使用Web服务或WCF。否,internal阻止从其他程序集调用该方法,如果他有两个程序集应用程序,如他提到的dll和一个exe,则exe无法调用类库的内部方法。嗯,有ILMerge。但你是对的,我可能应该编辑我的答案!从你的标题和标签,这是一个安全问题,但我添加了额外的信息,因为你的问题似乎推断两个应用程序正在使用dll。
The problem is not how to secure your code, the problem is how to secure your database.

– Huusom