我在ASP .NET Core和Razor Pages上阅读tutorials。
其中一个,在处理BindProperty
属性时,发表评论我觉得难以理解:
默认情况下,Razor Pages仅使用非GET谓词绑定属性。 绑定到属性可以减少必须编写的代码量。 绑定通过使用相同的属性来呈现表单字段来减少代码 (
<input asp-for="Customer.Name" />
)并接受输入。出于安全原因,您必须选择将GET请求数据绑定到 页面模型属性。在映射之前验证用户输入 属性。在解决时,选择此行为非常有用 依赖于查询字符串或路由值的场景。
要在GET请求中绑定属性,请设置
[BindProperty]
属性SupportsGet
属性为true:[BindProperty(SupportsGet = true)]
(强调我的)来源:Introduction to Razor Pages in ASP.NET Core § Writing a basic form
我不明白。为什么在专门处理GET请求时需要采取额外的安全措施?
据我所知,GET请求应该比POST请求更安全,更安全,因为GET只检索数据,而POST则将数据发送到服务器。因此,POST请求通常需要额外的安全措施GET reqs不需要。
然而现在我读到了用POST做X很好但是小心翼翼,不要肆无忌惮地做GET,你必须选择加入并加以警告,采取预防措施!
为什么这些警告是必要的?将GET请求数据绑定到页面模型属性可以引入哪些安全漏洞?为什么这些漏洞不适用于POST请求?
答案 0 :(得分:5)
绑定是双向模型,这意味着它绑定给定元素以进行渲染(“在此处显示此值”)并提交回(“将值保存在那里”)。例如,您将使用绑定来填充输入字段,其值可以由用户随后更新并返回POST
。绑定句柄自动处理值。
如果您只想显示值,则根本不需要使用绑定。只需将其设为模型的公共属性并直接引用它({Model.PropertyName}
)。
避免使用[BindProperty(SupportsGet = true)]
有很多原因,但我认为HTTP的RFC 7231, Section 9.4很好地涵盖了它:
即使识别安全资源,URI也是共享的,而不是安全的。 URI通常显示在显示器上,在打印页面时添加到模板中,并存储在各种不受保护的书签列表中。因此,在敏感,个人身份识别或披露风险的URI中包含信息是不明智的。
服务的作者应该避免提交敏感数据的基于GET的表格,因为这些数据将被放置在请求目标中。许多现有服务器,代理和用户代理在第三方可见的位置记录或显示请求目标。这些服务应该使用基于POST的表单提交。
由于Referer头字段告诉目标站点有关导致请求的上下文,因此它有可能揭示有关用户的直接浏览历史记录的信息以及可能在引用资源的URI中找到的任何个人信息。