通过将GET请求数据特定绑定到页面模型属性,可以引入哪些类型的安全漏洞?

gaa*_*kam 1 security asp.net-core asp.net-core-2.0

我正在阅读有关ASP .NET Core和Razor Pages的教程.

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

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

出于安全原因,您必须选择将GET请求数据绑定到页面模型属性.在将映射映射到属性之前验证用户输入.在处理依赖于查询字符串或路由值的方案时,选择此行为非常有用.

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

(强调我的)来源:ASP.NET核心中的Razor页面简介§编写基本表单

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

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

然而现在我正在读取用POST做X很好但是小心,不要肆无忌惮地使用GET,你必须选择加入并加以警告,采取预防措施!

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

Mar*_*eur 5

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

如果您只想显示值,则根本不需要使用绑定.只需将其设为模型的公共属性并直接引用它({Model.PropertyName})即可.

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

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

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

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