1

我试图记住我在学校里简短地教过的关于在 winforms 之间安全传递数据的课程。

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

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

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

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

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

4

2 回答 2

3

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

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

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

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

最后,如果您静态存储所有数据,这意味着您将永远无法拥有多个表单实例。从逻辑的角度来看,您将编写的大多数表单都不应该要求应用程序中的表单不超过一个。如果他们的数据仅限于他们,那么创建第二个表单就没有任何问题。如果所有数据都是静态的,那么表单最终会因为这些数据而相互争斗。

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

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

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

于 2013-10-11T14:09:00.260 回答
1

我通常在你的情况下在 program.cs 中声明我的变量,并从任何地方作为 Program.xxx 访问它。但你需要一种非公开的方式来达到一个变量......

啊哈,另一种方法如下。当您从另一个表单创建表单时。为第二种形式编写一个重载的构造函数,并将参数传递给该构造函数。喜欢:

Form2 frm = new Form2(myParameter);
于 2013-10-11T13:45:42.937 回答