Mic*_*nel 4 c architecture dll plugins design-decisions
介绍:
我目前正在开发一个C/C++文档分类器软件,我将使用朴素贝叶斯模型进行分类.但是我希望用户使用他们想要的任何算法(或者我将来想要的),因此我将体系结构中的算法部分分离为一个插件,该插件将附加到主应用程序@ app启动.因此,任何用户都可以将自己的算法编写为插件,并将其与我的应用程序一起使用.
问题陈述:
我打算开发这种方法的方法是让用户想要使用的每个算法都被制作成DLL文件并放入特定的目录中.一开始,我的应用程序将搜索该目录中的所有DLL并加载它们.
我的问题:
(1)如果将恶意代码作为DLL(并且具有插件框架规定的相同功能)并将其放入我的插件目录中该怎么办?在这种情况下,我的应用程序会认为它是一个插件并选择它并调用其功能,因此恶意代码可以轻松地降低我的整个应用程序(在最坏的情况下可能使我的应用程序作为恶意代码启动器!!!) .
(2)使用DLL是实现插件设计模式的唯一方法吗?(不仅因为害怕恶意插件,而且出于好奇心这是一个普遍的问题:))
(3)我认为很多软件都是用插件模型编写的,可扩展性如果是这样,他们如何防御这种攻击呢?
(4)一般来说,您如何看待我决定使用插件模型进行扩展(您认为我应该考虑其他任何替代方案吗?)
谢谢
-MicroKernel :)
不要担心恶意插件.如果有人设法将恶意DLL隐藏到该文件夹中,他们可能也有权直接执行内容.
作为DLL的替代方案,您可以连接像Python或Lua这样的脚本语言,并允许脚本化插件.但也许在这种情况下你需要编译代码的速度?
有关嵌入Python的信息,请参阅此处.这个过程并不是很困难.您可以静态链接到解释器,因此用户无需在其系统上安装Python.但是,任何非内置模块都需要随应用程序一起提供.
见1.他们没有.
使用插件模型听起来像一个很好的解决方案,前提是缺乏可扩展性在这一点上确实是一个问题.如果事实证明实际需要它,那么对当前模型进行硬编码可能会更容易,并在以后添加插件界面.它很容易添加,但一旦人们开始使用它很难删除.
恶意代码并不是 DLL 的唯一问题。即使是善意的 DLL 也可能包含一个错误,该错误可能会导致整个应用程序崩溃或逐渐泄漏内存。
用高级语言加载模块会在一定程度上降低风险。例如,如果您想了解嵌入 Python,请参阅此处的文档。
另一种方法是在单独的进程中启动插件。它确实需要您付出更多的努力来实施,但它更安全。Google 的 Chrome 网络浏览器使用单独的进程方法,并且他们有一个描述该架构的文档。
基本思想是为插件编写者提供一个库,其中包含与主应用程序通信的所有逻辑。这样,插件作者就有了他们使用的 API,就像他们编写 DLL 一样。维基百科有一个很好的进程间通信(IPC)方法列表。