如何保护dll函数不被我的应用程序使用?
我想限制其他应用程序使用我编写的dll函数。
例如。 如果我有data.dll包含两个函数。
public void InsertInToDatabse(); public void ClearDatabase();
现在,如果我的应用程序调用了InsertInToDatabse()并正在做其他工作,那么如果其他应用程序通过引用database.dll调用ClearDatabase(),那么数据库将被排除。那么如何限制对这些函数forms的调用第三方申请?
如果您的dll是类库,则实际配置文件将是客户端应用程序(web.config或app.exe.config)之一,并且只有授权的应用程序将具有与用户名,密码,数据库服务器和数据库的正确连接字符串名称。
现在,即使未经授权的应用程序被阻止以您正在寻找的方式调用dll的方法,如果这些不良应用程序通过知道连接字符串直接访问数据库,它们仍然可能会乱七八糟。
这可以说,实际上只要配置在你的dll之外你就不用担心,因为只有授权的应用程序才能访问正确的数据库。
如果这种方法仍然不能满足你,那么你应该使用CAS之类的安全检查,它允许你指定哪个类或程序集可以调用某个方法,所以即使你的dll被另一个应用程序引用它也行不通。 请注意,在.NET 4中(您在问题中标记了它)整个安全层已经更改,并且与旧的.NET Framework版本的工作方式不同,请查看本文以获取更多详细信息: http : //msdn.microsoft.com/en-我们/库/ dd233103.aspx
您不能阻止人们调用您的函数,但您可以自由地实现您的function以防止这种情况。
例如,您可以锁定数据库访问,以便调用阻塞直到上一次调用完成,或者您可能有一个标志导致Clear()调用立即返回错误代码或exception。
编辑:我可能误解了这个问题。 如果您从不想要第三方代码来调用您的函数,那么请使用内部(和/或InternalsVisibleTo),如Marcus建议的那样。
正如Marcus所说,你可以使用internal
关键字。 然后将InternalsVisibleToAttribute
应用于您的类库,其中包含应用程序集的程序集名称和公钥,如果您使用的是强大的程序集名称。
MSDN链接
如果我没记错的话, internal
关键字就是针对这些类型的情况。
编辑:如评论中所述,如果class A
在assembly B
,则class C in assembly D
将无法访问A
此外,正如其他答案中所指出的,您可以(并且可能应该)在ClearDatabase()
使用某种forms的身份validation。
编辑2:我突然意识到这些权限应该在数据库级别,这意味着如果以下用户(具有这些权限):
A: Insert, Update, Create
尝试Drop Table
,然后应用程序会抛出exception(或者你处理错误),这显然会阻止他们这样做。
这并不是说您不应将ClearDatabase()
设置为internal
,但如果用户(第三方正在使用)具有Drop Table
权限,那么他/她将无论如何都可以。
编辑3:
The problem is not how to secure your code, the problem is how to secure your database. – Huusom
您可以对要保护的方法(而不是公共方法)使用内部访问权限,然后将项目标记为“朋友程序集”。 这与允许unit testing项目访问内部方法的方式相同。
以下是MSDN的Friend Assemblies文章中的描述……
只有您明确指定为朋友的程序集才能访问Friend(Visual Basic)或内部(C#)类型和成员。 例如,如果程序集B是程序集A的朋友,程序集C引用程序集B,则C无法访问A中的Friend(Visual Basic)或内部(C#)类型。
如果您询问安全性:另一种技术是使客户端传入一个参数,例如密码或加密的连接字符串。
如果您通过缓存询问限制 (例如,只允许每分钟调用一次此方法) – 那么请查看[AspNetCacheProfile]获取服务或查看Cache.Insert以获取应用程序代码。