我正在制作一个简单的网站,列出某个文件夹中的文件。如果用户具有管理员权限,则用户可以通过单击“删除”按钮删除文件。
在我的.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" />
我的问题是:如果用户修改网页客户端旨在点击此隐藏按钮,我可以确定此方法是否可以抵御已知代码攻击?或者我是否必须在代码隐藏中采取预防措施,并在点击按钮的事件中验证用户的权利?
答案 0 :(得分:5)
是的,将按钮的Visible
属性设置为false足以阻止其Click
和Command
事件被提升,只要你不# 39;关闭默认的WebForms安全功能。
您可以通过向.aspx临时添加始终可见的<input>
元素并使用与呈现的name
相同的<asp:Button>
来轻松测试:
<input type="submit"
name="ctl00$ctl00$MainContent$LocalMainContent$FileList$ctrl0$ctl17"
value="Fake Delete" />
当真正的“删除”按钮不可见时,单击虚假删除按钮。你应该得到一个&#34;无效的回发或回调参数。事件验证已启用...&#34;异常。
重要说明:
Visible
属性设置为false,因为攻击者可能会绕过该检查。有关详细信息,请参阅this answer。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并做其他讨厌的事情。[SupportsEventValidation]
属性添加到派生类中。RegisterForEventValidation
和ValidateEvent
。答案 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);
换句话说,如果用户是管理员 - 添加按钮,如果用户不是管理员 - 请不要添加。在这种情况下,您不必使用可见性。
希望这会有所帮助。