制作一个asp:Button控件是否隐形足以确保用户无法点击它?

Tao*_*que 4 c# asp.net security authorization webforms

我正在制作一个简单的网站,列出某个文件夹中的文件.如果用户具有管理员权限,则用户可以通过单击"删除"按钮来删除文件.

在我的.aspx文件中,我有以下代码:

<asp:Button runat="server" Text="Delete" OnCommand="FileList_Delete"
            CommandArgument='<%#Eval("FilePath")%>' Visible='<%CurrentUserIsAdmin()%>' />
Run Code Online (Sandbox Code Playgroud)

因此,如果CurrentUserIsAdmin()返回则不会呈现按钮false.

该按钮呈现如下:

<input type="submit" name="ctl00$ctl00$MainContent$LocalMainContent$FileList$ctrl0$ctl17" value="Delete" />
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果用户修改网页客户端旨在点击这个隐形按钮,我能否确定这种方法对于已知代码攻击是安全的?或者我是否必须在代码隐藏中采取预防措施并在按钮单击事件中验证用户的权利?

Mic*_*Liu 5

是的,一个按钮的设置Visible属性设置为false,就足以防止其ClickCommand事件被提高,只要你不关闭默认的WebForms安全功能.

您可以通过临时将<input>.aspx中始终可见的元素添加到name渲染中来轻松测试<asp:Button>:

<input type="submit"
       name="ctl00$ctl00$MainContent$LocalMainContent$FileList$ctrl0$ctl17"
       value="Fake Delete" />
Run Code Online (Sandbox Code Playgroud)

当真正的删除按钮不可见时,单击虚假删除按钮.你应该得到一个"无效的回发或回调参数.事件验证已启用......"异常.

重要笔记:

  • 不要Visibleif (!IsPostBack)块中将按钮的属性设置为false,因为攻击者可能会绕过该检查.有关更多信息,请参阅此答案.
  • 必须启用ASP.NET事件验证(默认情况下是这样).所以不要通过添加EnableEventValidation="False"@Page指令或<pages enableEventValidation="false" />Web.config 来关闭它.
  • 永远永远通过添加禁用视图状态验证EnableViewStateMac="False"@Page指令,或<pages enableViewStateMac="false" />到Web.config中.这将允许攻击者篡改隐藏的__EVENTVALIDATION字段并执行其他令人讨厌的事情.
  • 如果从标准Button控件中选择派生自定义Button服务器控件,请确保将该[SupportsEventValidation]属性添加到派生类.
  • 如果您选择从头开始创建,调用自定义按钮服务器控件RegisterForEventValidation,并ValidateEvent在适当的地方.