Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在使asp:Button控件不可见,以确保用户赢得';你不能点击它吗?_C#_Asp.net_Security_Webforms_Authorization - Fatal编程技术网

C# 正在使asp:Button控件不可见,以确保用户赢得';你不能点击它吗?

C# 正在使asp:Button控件不可见,以确保用户赢得';你不能点击它吗?,c#,asp.net,security,webforms,authorization,C#,Asp.net,Security,Webforms,Authorization,我正在制作一个简单的网站,列出某个文件夹中的文件。如果用户具有管理员权限,则用户可以通过单击“删除”按钮删除文件 在.aspx文件中,我有以下代码: <asp:Button runat="server" Text="Delete" OnCommand="FileList_Delete" CommandArgument='<%#Eval("FilePath")%>' Visible='<%CurrentUserIsAdmin()%>' />

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

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

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

我的问题是:如果用户修改网页客户端以单击此不可见按钮,我是否可以确保此方法对已知代码攻击是安全的?或者我必须在代码隐藏中采取预防措施并验证用户在按钮单击事件中的权限吗?

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

你必须这样想。用户从未看到任何asp代码或无法处理它。他们只接收html。通过查看html并查看生成的内容,可以进一步确保这一点

所以在这方面你是安全的

我的问题是:如果用户修改网页客户端以单击此不可见按钮,我是否可以确保此方法对已知代码攻击是安全的?或者我必须在CodeBehind中采取预防措施,并在button clicked事件中验证用户权限

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

您还可以从代码隐藏中添加一个按钮,如下所示(假设您将此按钮放入名为pnlButtons的面板中):

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


希望这能有所帮助。

是的,只要不关闭默认的WebForms安全功能,将按钮的
Visible
属性设置为false就足以防止其
单击
命令
事件被引发

您可以通过临时向.aspx添加一个始终可见的
元素,并使用与呈现的
相同的
名称来轻松测试这一点,以了解更多信息
  • 必须启用ASP.NET事件验证(默认情况下为启用)。因此,不要通过向
    @Page
    指令或Web.config添加
    来关闭它
  • 永远不要通过向
    @Page
    指令添加
    EnableViewStateMac=“False”
    或向Web.config添加
    来禁用视图状态验证。还有做其他肮脏的事情
  • 如果选择从标准按钮控件派生自定义按钮服务器控件,请确保将该属性添加到派生类
  • 如果选择从头开始创建自定义按钮服务器控件,请在适当的位置调用和

  • 仅当visible为true时,才应渲染按钮。否则它根本就不包括在内。这需要更多的工作,更容易出错,也不安全。用户无法单击不可见的按钮。它没有在页面中包含按钮并使用CSS不显示它,而是实际上根本不向客户端发送按钮的代码。Servy,-为什么要向客户端发送按钮,然后通过CSS禁用它?-如何使静态(页面上)的东西比在客户端不知道的情况下在服务器端动态地制作东西更安全?我真的很好奇,好像我会遵循你的逻辑,然后我一直在基于一个完全的前提编程,然后需要改变我的习惯。你不会想通过CSS禁用它,我从来没有说过你会。我说过,在ASP中使其不可见并不是这样做,而是实际上不渲染它。在ASP中将其设置为静态意味着您不需要在每次回发时重新创建它,在预渲染阶段添加任何单击处理程序,并且您可以使用标记而不是代码编写HTML。要正确地调用动态添加的按钮的处理程序,很容易无法完全正确地完成所有操作。这两种方法都是安全的,所以你应该使用更简单的方法。我明白你的意思。如果我错了,请纠正我:如果您的页面上有一组按钮,并且您只想控制谁单击了什么,那么您描述的方式就是这样做的方式。然而,如果你有一个完全动态的页面,你不知道前面会有多少控件,那么你会怎么做?(例如,我说的是显示文件并为每个文件指定一个按钮以删除特定文件)请原谅我的编辑,因为我无法习惯按Shift+Enter键进入新行。不,这不是最好的方式。最好的方法是将所有按钮放在标记中,并根据谁拥有什么权限设置可见性。它简单得多,也不容易出错。这种方法不必要地给程序增加了大量额外的工作和脆弱性。如果使用类似Fiddler的东西来篡改请求,使其看起来像回发是由不可见的按钮引起的,会发生什么?我希望事件验证或其他服务器端进程能够捕获它,但我现在无法测试。啊,我还没有遇到fiddler。我也会调查的。谢谢你的安全提示!需要明确的是,控件的
    Visible
    属性不能用于“防止其
    单击
    命令引发事件”。声称它确实有点误导。从一般安全性的角度来看,认识到控件的“不可见性”(不呈现)本身并不会阻止有效的
    POST
    触发事件处理程序(在服务器上运行代码),即使启用了安全功能,这一点也很重要。根据您的具体情况,这可能还是一个问题,也可能不是。@OskarLindberg:您能提供一个例子来支持您的建议吗
    <input type="submit" name="ctl00$ctl00$MainContent$LocalMainContent$FileList$ctrl0$ctl17" value="Delete" />
    
    Button btnDeleteList = new Button();
    btnDeleteList.Text = "Delete List";
    btnDeleteList.Click += btnDeleteList_Click;
    pnlButtons.Controls.Add(btnDeleteList);
    
    <input type="submit"
           name="ctl00$ctl00$MainContent$LocalMainContent$FileList$ctrl0$ctl17"
           value="Fake Delete" />