【问题标题】:What kinds of security vulnerabilites can be instroduced by binding specifically GET request data to page model properties?通过专门将 GET 请求数据绑定到页面模型属性会引入哪些类型的安全漏洞?
【发布时间】:2018-05-15 06:05:06
【问题描述】:

我正在阅读 ASP .NET Core 和 Razor Pages 上的 tutorials。

其中一个在处理BindProperty 属性时,有一些我觉得难以理解的评论:

默认情况下,Razor 页面仅将属性与非 GET 动词绑定。 绑定到属性可以减少您必须编写的代码量。 绑定通过使用相同的属性来呈现表单字段来减少代码 (<input asp-for="Customer.Name" />) 并接受输入。

出于安全原因,您必须选择将 GET 请求数据绑定到 页面模型属性。在将其映射到之前验证用户输入 特性。选择加入此行为在解决问题时很有用 依赖查询字符串或路由值的场景。

要绑定 GET 请求的属性,请设置 [BindProperty] 属性的 SupportsGet 属性为真:[BindProperty(SupportsGet = true)]

(强调我的)来源:Introduction to Razor Pages in ASP.NET Core § Writing a basic form

我不明白。为什么在专门处理 GET 请求时需要采取额外的安全措施?

据我所知,GET 请求应该比 POST 请求更安全,而不是更安全,因为 GET 只检索数据,而 POST 将数据发送到服务器。因此,POST 请求通常需要额外的安全措施,GET 请求不需要。

然而现在我读到用 POST 做 X 很好,但要小心,不要鲁莽地用 GET 做这个,你必须选择加入并被警告,采取预防措施!

为什么需要这些警告?将 GET 请求数据绑定到页面模型属性会引入什么样的安全漏洞?为什么这些漏洞不适用于 POST 请求?

【问题讨论】:

  • 默认模型绑定适用于 POST 请求。如果您使用 GET 提交表单,则可以使用 SupportsGet 属性。除非您有令人信服的理由通过 GET 提交数据,否则我会避免这样做。
  • @MarkG ?我的理解:绑定到 GET 所做的只是让我无需显式编写代码即可显示此模型以从数据库中检索该特定实体。我明白我的理解是错误的?

标签: security asp.net-core asp.net-core-2.0


【解决方案1】:

绑定是双向模型,这意味着它绑定给定元素以进行渲染(“在此处显示此值”)和提交回(“在此处保存此值”)。例如,您将使用绑定来使用用户可以更新的值填充输入字段并返回POST。绑定句柄自动处理值。

如果你只是想显示一个值,你根本不需要使用绑定。只需将其设为模型的公共属性并直接引用 ({Model.PropertyName})。

避免[BindProperty(SupportsGet = true)] 的原因有很多,但我认为HTTP 的RFC 7231, Section 9.4 很好地涵盖了它:

URI 旨在共享而非安全,即使它们标识了安全资源。 URI 通常显示在显示器上,在打印页面时添加到模板中,并存储在各种不受保护的书签列表中。因此,在 URI 中包含敏感、可识别个人身份或有泄露风险的信息是不明智的。

服务的作者应该避免使用基于 GET 的表单来提交敏感数据,因为这些数据将被放置在请求目标中。许多现有的服务器、代理和用户代理在第三方可能看到的地方记录或显示请求目标。此类服务应改为使用基于 POST 的表单提交。

由于 Referer 标头字段告诉目标站点导致请求的上下文,它有可能揭示有关用户即时浏览历史的信息以及可能在引用资源的 URI 中找到的任何个人信息。

【讨论】:

  • “如果您只是想显示一个值,则根本不需要使用绑定。只需将其设为模型的公共属性并直接引用它即可” - 好的,但我必须明确在OnGetAsync 的参数中包含实体的ID 并调用_db.ModelName.FindAsync(id);我的想法是,投标可以让我避免这种情况。 “绑定是双向模型,这意味着它绑定给定元素以进行渲染(“在此处显示此值”)和提交回(“在此处保存此值”)。” - 但除非我调用 SaveChangesAsync,否则什么都不会被保存,我永远不会在 GET 请求中调用它
  • 您将GET 视为“从 URL 获取页面”。这里所说的是使用带有查询参数的GET 而不是 带有正文的POST 将数据写回您的系统。如果这听起来倒退,那是因为它是。这就是为什么您通常避免这样做的原因。它允许您覆盖(和滥用)HTTP 动词 GET,使其表现得像 POST。
  • 好的。知道了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多