实现插件框架的最佳方式——DLL是唯一的方式(C/C+;+;项目)吗?

实现插件框架的最佳方式——DLL是唯一的方式(C/C+;+;项目)吗?,c,architecture,dll,plugins,design-decisions,C,Architecture,Dll,Plugins,Design Decisions,简介: 我目前正在用C/C++开发一个文档分类器软件,我将使用朴素贝叶斯模型进行分类。但是我希望用户使用他们想要的任何算法(或者我将来想要的),因此我将架构中的算法部分分离为一个插件,该插件将连接到主app@app启动。因此,任何用户都可以编写自己的算法作为插件,并将其用于我的应用程序。 问题陈述: 我打算开发它的方法是将用户想要使用的每一种算法制作成一个DLL文件,并放入一个特定的目录中。在开始时,我的应用程序将搜索该目录中的所有DLL并加载它们 我的问题: (1) 如果一个恶意代码被制作成

简介:

我目前正在用C/C++开发一个文档分类器软件,我将使用朴素贝叶斯模型进行分类。但是我希望用户使用他们想要的任何算法(或者我将来想要的),因此我将架构中的算法部分分离为一个插件,该插件将连接到主app@app启动。因此,任何用户都可以编写自己的算法作为插件,并将其用于我的应用程序。

问题陈述:

我打算开发它的方法是将用户想要使用的每一种算法制作成一个DLL文件,并放入一个特定的目录中。在开始时,我的应用程序将搜索该目录中的所有DLL并加载它们

我的问题:

(1) 如果一个恶意代码被制作成DLL(并且具有插件框架强制要求的相同功能)并放入我的插件目录,该怎么办?在这种情况下,我的应用程序会认为它是一个插件,并选择它并调用它的函数,因此恶意代码可以很容易地使我的整个应用程序停止运行(在最坏的情况下,可能使我的应用程序成为恶意代码启动器!!!)

(2) 使用DLL是实现插件设计模式的唯一途径吗?(这不仅是出于对恶意插件的恐惧,也是出于好奇的一般性问题:))

(3) 我认为很多软件都是使用插件模型编写的,以实现可扩展性,如果是这样的话,它们如何抵御此类攻击

(4) 总的来说,您对我决定使用插件模型来实现可扩展性有什么看法(您认为我应该考虑其他选择吗?)

多谢各位

-微核:)

  • 不要担心恶意插件。如果有人设法将恶意DLL潜入该文件夹,他们可能还具有直接执行内容的能力

  • 作为DLL的替代方案,您可以连接Python或Lua等脚本语言,并允许使用脚本插件。但在这种情况下,您可能需要编译代码的速度

    有关嵌入,请参见。这个过程不是很困难。您可以静态链接到解释器,因此用户不需要在其系统上安装Python。但是,任何非内置模块都需要随应用程序一起提供

    但是,如果语言对您没有多大影响,那么嵌入可能会更容易,因为它是专门为该任务设计的。参见其手册的第1部分

  • 见1。他们没有

  • 使用插件模型听起来是一个很好的解决方案,前提是此时缺乏可扩展性确实是一个问题。如果事实证明确实有需求,那么硬编码当前模型并在以后添加插件接口可能会更容易。它很容易添加,但一旦人们开始使用它就很难删除

  • 如果恶意代码作为DLL生成,该怎么办

    通常,如果您不信任dll,则无法以这种或那种方式加载它

    这对于几乎任何其他语言都是正确的,即使它是被解释的

    Java和一些语言在限制用户所能做的事情上做得非常艰难,这只能是因为它们在虚拟机中运行

    所以没有。加载Dll的插件只能来自受信任的源

    使用DLL是实现插件设计模式的唯一途径吗

    您还可以在代码中嵌入一些解释器,例如GIMP允许编写插件 在python中

    但请注意,这样做的速度会慢得多,因为如果任何解释语言的性质不同。

    1)如果您的插件文件夹中存在恶意dll,您可能已经受到威胁

    2) 不,您可以从文件动态加载汇编代码,但这只是重新发明轮子,只需使用DLL

    3) Firefox扩展没有,甚至连它的javascript插件也没有。我所知道的其他一切都使用动态库中的本机代码,因此不可能保证安全性。然后Chrome又有了NaCL,它对二进制代码进行了广泛的分析,如果它不能100%确定它没有违反边界之类的,它就会拒绝,尽管我相信随着时间的推移,它们会有越来越多的漏洞

    4) 插件很好,只需将它们限制在可信任的人身上即可。或者,您可以使用LUA、Python、Java等安全语言,并将文件加载到该语言中,但仅限于不会损害您的程序或环境的API子集。

    (1)您是否可以使用操作系统安全设施防止未经授权访问搜索或加载DLL的文件夹?这应该是你的第一个方法

    否则:运行威胁分析-风险是什么,已知的攻击向量是什么,等等

    (2) 不一定。如果你需要编译的插件——这主要是性能问题、访问操作系统功能等,这是最困难的。如已经提到的,考虑脚本语言。

    (3) 通常写“为了防止恶意代码执行,限制对插件文件夹的访问”

    (4) 即使使用您还不熟悉的插件框架,也会有相当多的额外成本。它增加了以下方面的成本:

    • 核心应用程序(插件功能)
    • 插件(更高的隔离度)
    • 装置
    • 调试+诊断(仅在特定插件组合中出现的错误)
    • 管理(用户必须知道并管理插件)
    只有在

    • 安装/更新主软件比更新插件要复杂得多
    • 单个组件需要单独更新(例如,用户可以组合不同版本的插件)
    • 其他人为您的主应用程序开发插件
    (将代码移动到DLL中还有其他好处,但它们与插件本身无关)

    恶意代码