在 Webforms 页面中使用全局变量时的安全考虑?

Security consideration when using Global Variables in Webforms Pages?

我有一个 webforms 应用程序,我声明了几个全局变量如下:

public partial class Default : System.Web.UI.Page
{
   protected string testvar;
}

这个变量被多个函数用来共享值和进行操作。 我想知道在使用这样的全局变量时,这是否会增加任何安全问题(用户可以直接访问它吗?或者值可以被任何用户操纵吗?)这个值是否在用户之间共享?

我尝试在此处查找多个资源,但无法找到可以解决此方法安全方面问题的资源。

谢谢!

局部变量,甚至全局变量都不会持久存在。如果他们在测试期间,那么你只是幸运。我认为没有任何安全问题,但这些值超出范围。

事实上,在 post-back 完成后,任何本地变量甚至全局范围内的变量也会超出范围,后台代码运行,然后页面被发送回客户端.那时,Web 服务器几乎不会保持该网页加载到服务器端。 Web 服务器就在那里 - 等待任何用户点击按钮 - 它们都可以在不同的网页上。

因此,如果您需要保留值,那么您真的必须使用 session()。

Session() 是全局范围的,但仅限于给定的用户。

然而,即使使用 sesison(),您也经常需要小心。假设您有一个带有网格视图的页面 - select 要买的房子。您单击一行,获取 PK 行值,将其推送到会话中,然后 jump-navagate 到显示有关该房屋的详细信息的页面。在假设并使用带有 PK id 的 sesison() 的下一页上编写代码时要小心。

为什么?

好吧,因为用户可能有两个正在运行的兄弟副本,甚至打开了多个选项卡。如果第一个网格视图上有两个选项卡,那么用户在查看当前房屋时可能会转到另一个选项卡(具有网格视图),现在 select 一个不同的房屋。您现在打开了两个页面,但是会话(PK 值)现在是单击的最后一个网格行。如果您随后返回到另一页并点击购买房子 - 该代码使用 session()??

您买错了房子 - 因为 session() 对那个用户来说是全局的。

有 is/are 大量关于如何处理此问题的文章 - 其中大部分都非常丑陋。

我做什么? 我采用这个编码规则:

我使用会话将值传递到下一页,但在第一页加载时(不是 isPostBack),我然后将少数值传输到 ViewState。这样,新页面的所有代码和操作都基于 ViewState 而不是 session()。

结果呢?好吧,现在用户可以打开 5 或 2 个浏览器选项卡,我的代码将继续工作。

总而言之:

全局(通常是静态的)变量,对所有用户都是全局的——因此我建议不要使用它们。如果它们不是静态的(常量),那么这些值也不会保持它们的值——它们可能会保持一段时间,但如果你开始编写假定这一点的代码,那么当你的网站投入生产时有很多用户——你发现它不起作用。

会话()

Session 很棒,很安全,而且通常不需要在 URL 中使用丑陋的参数。它们对一个用户来说是全局的。但如前所述,请注意,如果该用户打开多个选项卡,或打开其浏览器的多个副本 - 甚至打开该网站的不同浏览器?他们都为一个用户共享同一个会话()。

视图状态: 查看状态是每页 - 并且仅限于该页面。它们在第一页加载时是 100% re-created。这里唯一的警告是什么?不要将太多或大的对象加载到 ViewState 中,因为视图状态存储在浏览器中 - 并且每次 post 返回。那么,如果您加载带有大量数据或变量的视图状态呢?然后这将使网页的操作膨胀,因为每个按钮点击等都必须传递并保持并保持视图状态作为该网页的一部分。

那么,一个好的设计模式,可以让您编写不会互相踩脚趾的应用程序吗?

使用会话传递值 - 效果很好,但您不能为此目的使用视图状态。在第一页加载时 - 尽可能快地传输该页面操作所需和想要的 session() 值。这样,所有页面操作都不会绑定到 session() 变量,如前所述,这对一个用户来说是全局的。视图状态实际上只对一个网页是全局的——它实际上不关心一个用户。

因此,不要将会话用于任何属于您代码隐藏页面中的一个页面的变量或值。但是,当然,使用 session() 将值传递到您的代码跳转到的下一页 - 但随后遵循上述规则并将此类会话值移动到 ViewState 以继续操作给定页面。

但是,尝试使用全局内存变量?不 - 甚至不要尝试 - 它根本行不通 - 一点也行不通。