我正在努力记住我在学校里简单教授的关于安全地在winforms之间传递数据的课程。
我的导师称之为 pipelining ,虽然我不确定这是正确的术语还是仅仅是他自己的名字。他说他的方法比公布数据的最简单方法更安全,所以一切都可以访问它。他说这样做更安全,因为他的方法阻止了从外部程序或不相关的表单和流程访问数据,他称赞它是良好的编程习惯。
我的编程基础当时非常薄弱。我对他告诉我的内容缺乏更深刻的理解,而且只是在重复他的步骤。没有任何概念来结合他的教导,我很容易忘记他的方法。
现在,我更擅长做我想做的事情,我希望在一个简单的Q& A中建立一个最安全,最安全的方式来在winforms之间共享数据。也就是说,一种保持数据安全的方法,可以从表格A到表格B,或表格B,C,D ......等我指定它,但不泄漏以任何方式出去。
要指定,我希望在同一个应用程序中的表单之间共享数据。也许有一天我会尝试在进程之间共享数据,但是现在我只关心表单。
为了提供更具体的示例,我尝试将名称versionNumber
和lastEditDate
的简单字符串从Main
表单传递给About
表单,知识为此允许我有一堆静态变量,我只需要在代码的一个位置进行更改,这可以传递给我想要的任何形式。但我希望有一种安全的方法来做到这一点,以防万一通过全局定义在表单之间传递数据被视为不良做法或不安全。
答案 0 :(得分:3)
所以你给出了很多公共静态数据的原因并不正确。对其他进程访问信息的恶意企图并不安全。无论你做什么,它都在内存中,所以恶意进程(具有足够的权限)无论如何都可以 获取它,但无论如何它们都可能有点困难。还有什么。如果您拥有具有该级别权限的恶意进程/用户,那么您已经失去了战斗力;他们已经可以做任何他们想做的事。
将所有数据存储在公共静态字段中的问题仅仅是有效开发的问题,而不是实际安全性问题。当数据可以随时在整个程序的任何地方进行修改时,很难理解程序在任何一个时间点发生的事情,这会让错误真的难以追踪因为几乎在代码中的任何地方都可能存在问题,所以它会让新开发人员很难进入项目,因为他们不能只打开一两个类并理解它们,他们需要理解整个应用程序因为您的应用程序中的高度耦合,能够正确地推断任何一个部分发生的事情。
您应该通过保持数据更加本地化来努力减少应用程序中各种模块的耦合。这允许开发人员查看单个模块(无论是表单,用户控件,某个工作者类等),只需要在他们面前理解该类,而无需了解整个应用程序中的每个单点。这也涉及相同的变量。
当您从多个线程访问公共静态变量时,您还需要非常关注线程问题,因为您几乎肯定会在winform应用程序中需要多个线程。
最后,如果您静态存储所有数据,则意味着您将永远无法拥有多个表单实例。从逻辑角度来看,您要编写的大多数表单都不应该要求在应用程序中永远不会有多个表单。如果他们的数据只是本地化,那么创建第二个表单没有任何问题。如果所有数据都是静态的,那么表格将最终在这些数据上相互争斗。
至于如何实现这一点,这里的主要目标应该是保持数据范围尽可能狭窄(这是您通常应该在所有类型的编程中努力的事情),而不允许在他们不需要访问的地方。
您所描述的案例是一个相当简单的问题需要解决。如果表单正在创建另一个需要构建数据的表单,如果该数据必需使用该其他表单,则只需在构造函数中为该数据创建参数。然后,创建它的表单(或其他任何内容)可以传入所需的数据。如果不需要数据,或者在构造时不需要数据,则另一个选项是具有允许该表单的“所有者”传递所需数据的属性。这样做并不比创建公共静态字段复杂得多;它只是创建一个公共的非静态属性。
现在这个数据不是静态的,你知道,不是从任何地方访问,而是从“拥有”该表单的特定实例的任何人那里提供该信息。您正在限制可以访问数据的位置以及需要它的位置,而不是“无处不在”。
答案 1 :(得分:1)
我通常在你的情况下在program.cs中声明我的变量,并从Program.xxx的任何地方到达它。但是你需要一种非公开的方式来获取变量...
Ahhaaa,另一种方式如下。从另一个表单创建表单时。为第二种形式写一个重载的构造函数,并将参数传递给该构造函数。像:
Form2 frm = new Form2(myParameter);