【发布时间】: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