2012-01-25 20 views
7

我想限制其他应用程序使用我写的dll函数。如何确保在我的应用程序之外使用dll函数?

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

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

现在,如果我的应用程序已调用InsertInToDatabse(),并做一些其他的工作,直到这个时候,如果其他一些应用程序通过引用database.dll调用ClearDatabase(),该DATABSE将CLER out.So怎么能我限制从第三方应用程序调用这些函数?

+1

可能出现[Secure C#程序集未经授权的调用者]的副本(http://stackoverflow.com/questions/2806842/secure-c-sharp-assemblies-from-unauthorized-callers)。 [这个答案](http://stackoverflow.com/a/2807142/69809)有一些很好的见解。 – Groo

+1

问题不在于如何保护您的代码,问题在于如何保护您的数据库。 – Huusom

+0

Marcus Hansson [内部无效ClearDatabase()],GazTheDestroyer,Davide Piras ...所有人都给了你最好的建议。另外;我可以建议你,使用一个好的.net混淆器... –

回答

1

你不能阻止人们调用你的函数,但你可以自由地实现你的函数来防止这种情况。例如,您可以锁定数据库访问,以便在前一个调用完成之前阻止调用,或者您可以使用导致Clear()调用立即返回错误代码或异常的标志。

编辑:我可能误解了这个问题。如果你永远不需要第三方代码来调用你的函数,那么就像Marcus所说的那样使用内部(和/或InternalsVisibleTo)。

1

如果我没有记错,internal关键字就是针对这些类型的情况。

编辑:正如评论所说,如果class Aassembly 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 
+0

不,内部阻止从其他程序集调用该方法,并且如果他有两个程序集应用程序(如他提到的dll和一个exe),则exe不能调用类库的内部方法。 –

+1

那么,有ILMerge。但你是对的,我应该编辑我的答案! –

2

如果您的DLL是一个类库的实际配置文件将客户端应用程序的一个(或web.config中app.exe.config),并在那里只授权的应用程序将具有正确的连接字符串,包括用户名,密码,数据库服务器和数据库名

现在,即使未经授权的应用程序也会被阻止以您正在查找的方式调用您的dll的方法,但如果这些不好的应用程序通过了解连接字符串而直接访问数据库,它们仍然可能会陷入混乱。

这会说,事实上,只要配置在你的dll外面,你不应该担心,因为只有授权的应用程序才会访问正确的数据库。

如果这种方法仍然不能满足你,那么你应该使用像CAS这样的安全检查,它允许你指定哪个类或程序集可以调用某个方法,所以即使你的dll被其他应用程序所引用,工作。要注意的是在.NET 4中(你的问题标记吧)整个安全层已经改变,从旧版本的.NET Framework的工作方式不同,检查这篇文章的详细信息:http://msdn.microsoft.com/en-us/library/dd233103.aspx

0

你可以使用内部访问在你想保护的方法上(而不是公开的),然后将你的项目标记为朋友组装。这与您允许单元测试项目访问内部方法的方式相同。

下面是从MSDN's Friend Assemblies article说明...

明确指定的朋友可以访问好友(Visual Basic)或内部(C#)类型和成员只有组件。例如,如果程序集B是集A和装配C引用了程序集B的朋友,C不具有A.

1

访问朋友(Visual Basic)或内部(C#)类型马库斯提到你可以使用internal关键字。然后,如果您使用强大的程序集名称,则将InternalsVisibleToAttribute应用于您的类库,并带有应用程序程序集的程序集名称和公钥。

MSDN link

0

如果你问有关安全: 另一种方法是使客户端传递的参数,如密码或例如加密的连接字符串。

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

+0

从您的标题和标签,它的一个安全问题,但我添加额外的信息,因为你的问题似乎推断两个应用程序正在使用DLL。 – Paul

相关问题