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