所以我遇到了一个我从未真正意识到的巨大安全漏洞:
通常当我在任何控件上设置Enabled = false
时,我会认为它根本不允许我修改控件上的值。但是,当客户端删除标记disabled="disabled"
以及类aspNetDisabled
,从而发布不同的值时,ASP.NET将接受它,即使在服务器端禁用了我的控件。
示例ASPX:
<asp:TextBox ID="tbUsername" runat="server" CssClass="form-control focus-popover required" MaxLength="32" Enabled="false" Text="test" />
<asp:Button ID="bSave" runat="server" CssClass="bb btn btn-primary btn-block" Text="Submit" OnClick="bSave_Click" />
示例代码背后:
protected void bSave_Click(object sender, EventArgs e)
{
Console.Write(this.tbUsername.Text); // BREAKPOINT HERE
}
经过进一步检查后,我发现我可以设置ReadOnly = true
,无论发布什么内容,都会重置该值。但是,ReadOnly
并非所有WebControl
都提供submitdisabledcontrols="false"
。
是否有任何通用方法可以在禁用时强制重置该值?在form
上设置Enabled
无效。
顺便说一下,在读取值之前询问Enabled
是否安全,或者服务器端的客户端是否可以if(this.tbUsername.Enabled) obj.Username = this.tbUsername.Text;
更改?即stack.yaml
是否可以安全地获取数据?
答案 0 :(得分:3)
永远不要相信用户界面。
精明的用户可以随时修改您的用户界面或创建自己的用户界面。穿越电线的数据可能会在飞行中被篡改。
业务逻辑层需要验证所有数据。
我决定哪些控件可以编辑,具体取决于访问网站的用户的权限
您可以在浏览器中打开开发人员工具(例如,按IE / Edge上的F12键)并删除任何控件上的只读标志。如果您关心绕过许可系统的精明用户,那就不够了。