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

时间:2014-06-05 14:47:23

标签: c# asp.net security webforms authorization

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

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

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

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

按钮呈现如下:

<input type="submit" name="ctl00$ctl00$MainContent$LocalMainContent$FileList$ctrl0$ctl17" value="Delete" />

我的问题是:如果用户修改网页客户端旨在点击此隐藏按钮,我可以确定此方法是否可以抵御已知代码攻击?或者我是否必须在代码隐藏中采取预防措施,并在点击按钮的事件中验证用户的权利?

3 个答案:

答案 0 :(得分:5)

是的,将按钮的Visible属性设置为false足以阻止其ClickCommand事件被提升,只要你不# 39;关闭默认的WebForms安全功能

您可以通过向.aspx临时添加始终可见的<input>元素并使用与呈现的name相同的<asp:Button>来轻松测试:

<input type="submit"
       name="ctl00$ctl00$MainContent$LocalMainContent$FileList$ctrl0$ctl17"
       value="Fake Delete" />

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

重要说明:

  • 请勿在{{1​​}}块内将按钮的Visible属性设置为false,因为攻击者可能会绕过该检查。有关详细信息,请参阅this answer
  • 必须启用ASP.NET事件验证(默认情况下)。因此,请不要将if (!IsPostBack)添加到EnableEventValidation="False"指令或@Page添加到Web.config。
  • 从未 永远 通过将<pages enableEventValidation="false" />添加到EnableViewStateMac="False"指令或@Page添加到Web.config来禁用视图状态验证。 This would allow an attacker to tamper with the hidden __EVENTVALIDATION field并做其他讨厌的事情。
  • 如果您从标准Button控件中选择派生自定义Button服务器控件,请确保将[SupportsEventValidation]属性添加到派生类中。
  • 如果您选择从头开始创建自定义按钮服务器控件,请在相应位置调用RegisterForEventValidationValidateEvent

答案 1 :(得分:1)

他们根本看不到按钮,甚至“接收”它。您的服务器不会生成发送给此人的任何按钮代码。

你必须这样想。用户永远不会看到任何asp代码或能够处理它。他们只收到HTML。您可以通过查看html并查看已生成的内容来进一步确保这一点。

所以在这方面你是安全的。

答案 2 :(得分:-3)

  

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

我个人也会在click事件中添加另一段代码。验证该点击来自有权点击该按钮的用户。

你还可以做的是在代码后面添加一个按钮(假设你把这个按钮放到一个名为pnlButtons的面板中):

Button btnDeleteList = new Button();
btnDeleteList.Text = "Delete List";
btnDeleteList.Click += btnDeleteList_Click;
pnlButtons.Controls.Add(btnDeleteList);

换句话说,如果用户是管理员 - 添加按钮,如果用户不是管理员 - 请不要添加。在这种情况下,您不必使用可见性。

希望这会有所帮助。