c# - 在 c# winforms 中的窗体之间传递数据的最安全方法

标签 c# winforms multiple-forms data-security

我正在努力记忆我在学校简短地学到的关于在 Winform 之间安全传递数据的类(class)。

我的导师称它为流水线,但我不确定这是正确的术语还是他自己的名字。他表示,他的方法比最简单的公开数据的方法更安全,这样任何人都可以访问它。他说这更安全,因为他的方法可以防止从外部程序或不相关的表单和流程访问数据,他称赞这是良好的编程实践。

当时我的编程基础很薄弱。我对他告诉我的内容缺乏更深入的理解,实际上只是在重复他的步骤。没有任何概念可以将他的教义联系起来,我很容易忘记他的方法。

现在,我的工作做得更好了,我想在一个简单的问答中建立在 winform 之间共享数据的最安全、最安全的方式。也就是说,一种保持数据安全可靠的方法,可以从 Form A 转到 Form B,或按我指定的 Form B、C、D...等,但不会泄漏以任何方式退出。

具体来说,我希望在同一应用程序中的表单之间共享数据。也许有一天我会尝试在进程之间共享数据,但现在我只关心表单。

举一个更具体的例子,我试图将名称 versionNumberlastEditDate 的简单字符串从 Main 表单传递到About 形式,这方面的知识让我拥有一堆静态变量,我只需要在代码的一个位置更改它们,就可以将它们传递到我想要的任何形式。但我想要一种安全的方式来执行此操作,以防万一通过全局定义在表单之间传递数据被认为是不良做法或不安全。

最佳答案

因此,您给出的仅拥有大量公共(public)静态数据的推理是不正确的。对于其他进程访问信息的恶意尝试,它或多或少是安全的。无论您做什么,它都在内存中,因此恶意进程(具有足够的特权)无论如何都可以访问它,但无论如何他们都可能会遇到一些困难还有什么。如果您有一个具有该级别权限的恶意进程/用户,那么您已经输了;他们已经可以为所欲为了。

将所有数据存储在公共(public)静态字段中的问题仅仅是有效开发的问题,而不是实际的安全问题。当可以随时从整个程序中的任何位置修改数据时,很难及时了解程序中发生的任何时间点,这使得错误真的难以追踪由于代码中几乎任何地方都可能存在问题,这使得将新开发人员引入项目变得非常困难,因为他们不能只打开一两个类并理解它们,他们需要理解整个应用程序 由于应用程序中的高耦合度,能够正确推断任何一个部分中发生的事情。

您应该通过使数据更加本地化来努力减少应用程序中各个模块的耦合。这允许开发人员查看单个模块(无论是表单、用户控件、某个工作类等)并且只需要了解他们面前的那个类,而无需了解整个应用程序中的每个点这也涉及相同的变量。

当您从多个线程访问公共(public)静态变量时,您还需要非常关注线程问题,因为您几乎肯定会在 winform 应用程序中需要多个线程。

最后,如果您静态存储所有数据,则意味着您将永远无法拥有多个表单实例。从逻辑的角度来看,您将要编写的大多数表单不应该要求应用程序中永远不会有多个表单。如果他们的数据只针对他们本地化,则创建第二种形式没有任何问题。如果所有数据都是静态的,那么表单将最终为该数据相互争斗。

至于如何实现这一点,这里的主要目标应该是尽可能缩小数据范围(这是您通常应该在所有类型的编程中努力实现的目标),同时不允许变量在不需要访问的地方。

您所描述的案例是一个非常容易解决的问题。如果一个表单正在创建另一个在构造时需要一些数据的表单,如果该数据对于使用该其他表单必不可少,则只需在构造函数中为该数据创建参数。创建它的表单(或其他任何东西)然后可以传入所需的数据。如果不需要数据,或者在构建时不需要数据,那么另一种选择是拥有允许该表单的“所有者”传递所需数据的属性。这样做并不比创建公共(public)静态字段复杂多少;它只是创建一个公共(public)非静态属性。

现在您知道该数据不是静态的,而不是从任何地方访问,该信息将从“拥有”该特定表单实例的任何人提供。您将可以访问数据的范围限制在需要它的地方,以及拥有它的地方,而不是“无处不在”。

关于c# - 在 c# winforms 中的窗体之间传递数据的最安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19319482/

相关文章:

c# - EF核心: update database error: relation "Owner" already exists

c# - 多行文本框。允许的最大行数

c# - WebForms 使用回车键提交特定表单(不点击)

c# - 在 UI 线程上运行代码但在当前线程上调用回调?

c# - .NET 中有 XML 表单生成器吗?

c# - Xml 序列化后代列表

c# - C#中不同情况下向上或向下小数舍入

c# - 自定义控件错误

popup - 通过弹出子表单 (2) 添加新子表单 (1) 记录后重新查询子表单 (1) - Access 2007

django 带有表单集的多种表单