我想限制其他应用程序使用我编写的dll函数。
EG。 如果我有data.dll包含两个函数。
public void InsertInToDatabse();
public void ClearDatabase();
现在如果我的应用程序调用了InsertInToDatabse()并正在做其他工作,那么直到这个时候,如果其他一些应用程序通过引用database.dll调用ClearDatabase(),那么数据库就会被删除。所以如何限制调用这些功能是否构成第三方应用?
答案 0 :(得分:2)
如果您的dll是类库,则实际配置文件将是客户端应用程序(web.config或app.exe.config)之一,并且只有授权的应用程序才能具有正确的用户名,密码,db的连接字符串服务器和数据库名称。
现在,即使未经授权的应用程序被阻止以您正在寻找的方式调用dll的方法,如果这些不良应用程序通过知道连接字符串直接访问数据库,它们仍然可能会乱七八糟。
这可以说,实际上只要配置在您的dll之外,您就不必担心,因为只有授权的应用才会访问正确的数据库。
如果这种方法仍然不能满足你,那么你应该使用CAS之类的安全检查,它允许你指定哪个类或程序集可以调用某个方法,所以即使你的dll被另一个应用程序引用它也不会工作。请注意,在.NET 4中(您在问题中标记了它)整个安全层已经更改,并且与旧的.NET Framework版本的工作方式不同,请查看本文以获取更多详细信息:http://msdn.microsoft.com/en-us/library/dd233103.aspx
答案 1 :(得分:1)
你无法阻止人们调用你的职能,但你可以自由地实施你的职能以防止这种情况发生。
例如,您可以锁定数据库访问,以便调用阻塞直到上一次调用完成,或者您可能有一个标志导致Clear()调用立即返回错误代码或异常。< / p> 编辑:我可能误解了这个问题。如果您从不希望第三方代码调用您的函数,那么请使用内部(和/或InternalsVisibleTo),如Marcus建议的那样。
答案 2 :(得分:1)
如果我没记错的话,internal
关键字就是针对这些类型的情况。
修改:如评论中所述,如果class A
位于assembly B
,则class C in assembly D
将无法访问A
。< / p>
此外,正如其他答案中所指出的,您可以(也可能应该)在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
答案 3 :(得分:1)
正如Marcus所说,您可以使用internal
关键字。然后将InternalsVisibleToAttribute
应用于您的类库,其中包含应用程序集的程序集名称和公钥,如果您使用的是强大的程序集名称。
答案 4 :(得分:0)
您可以对要保护的方法(而非公开)使用内部访问权限,然后将项目标记为Google朋友程序集。这与允许单元测试项目访问内部方法的方式相同。
以下是MSDN's Friend Assemblies article ...
的说明只有您明确指定为朋友的程序集才能访问Friend(Visual Basic)或内部(C#)类型和成员。例如,如果程序集B是程序集A的朋友,程序集C引用程序集B,则C无法访问A中的Friend(Visual Basic)或内部(C#)类型。
答案 5 :(得分:0)
如果您询问安全问题: 另一种技术是使客户端传递参数,例如密码或加密的连接字符串。
如果您通过缓存询问限制(例如,只允许每分钟调用一次此方法) - 然后查看[AspNetCacheProfile]获取服务或查看Cache.Insert以获取应用程序代码