【问题标题】:Can a client get to a button click event programmatically if the button is not rendered? [duplicate]如果未呈现按钮,客户端能否以编程方式获取按钮单击事件? [复制]
【发布时间】:2015-10-26 21:18:52
【问题描述】:

这是在 ASP.NET Web 表单中,我在屏幕上有一个保存按钮。当我最初加载页面时,在某些情况下,不会呈现保存按钮。

button1.visible = false

在我的按钮点击事件中,我有这个

public void button1_click(Object sender, EventArgs e)
{
    SaveData();
}

防止用户被保存的唯一安全措施是是否呈现保存按钮。

在 MVC 中,只需使用我自己修改的请求向服务器发出 HTTP POST 即可访问保存按钮操作方法。

在 ASP.NET Web 表单中,我有点困惑,因为它依赖于回发的加密 ViewState。我还需要将此安全性添加到 button1_click 事件吗?如果是这样,那么您能告诉我客户端如何在按钮不可见的情况下向服务器发起回发以达到按钮单击事件吗?

【问题讨论】:

  • 绝对是一个有趣的问题。尽管无论任何答案,我都可能会选择“假设请求可以被欺骗并始终检查授权”。安全性应该总是在处理请求时发生,而不是在向用户提供请求选项时发生。后者只是用户体验,而不是安全性。
  • @david - 是的。我更感兴趣的是如何潜在地利用它
  • 这是“微不足道的”,正如你在 MVC 中所说的,只有当你未能实现基本的安全功能时,ASP.NET Web 窗体也是如此。它绝对可能被利用(除非你依赖很多“如果和但是”。)

标签: c# asp.net webforms viewstate


【解决方案1】:

https://stackoverflow.com/a/24064375/279911

根据this answer on another question,只要您设置了相关的安全设置,如果未呈现按钮,似乎就不可能到达按钮单击事件。

是的,将按钮的 Visible 属性设置为 false 就足以防止 它的 Click 和 Command 事件不会被引发,只要你不 关闭默认的 ASP.NET 安全功能。

【讨论】:

  • 我已经更新了我的original answer 并记住了一件更重要的事情。请参阅第一个要点。
  • 将可见性设置为 false 并不会阻止引发事件。如果您已经捕获了一个有效的视图状态并且没有捕获然后重新发布请求,那么这些事件当然会触发。讨论变得混乱,但根据我对原始问题的解释,在这种情况下将迈克尔斯的答案视为正确是错误的。
  • 这里要承认的关键是渲染或不渲染实际按钮不是安全问题。这是一个 UI 决定。 (而且服务端依赖发布的数据来解释客户端的“状态”,请求的有效性以及接下来要做什么。之前的响应中向客户端发出了什么数据是无关紧要的。)不应该认为作为其他安全措施的替代品,甚至与之相关。
  • @OskarLindberg - 是的。但在这种情况下,单击事件将使用一个视图状态,在该状态下单击该按钮是有效的。并发用户同时访问同一条记录可以达到(非恶意)相同的效果。所以是的,我同意你的观点 - 这绝对是需要对事件进行验证的原因。
  • 再一次,伙计们,这不是 VIEWSTATE,而是 EVENTVALIDATION 负责验证您的点击。不要弄乱它。您可以简单地禁用 ViewState,但在单击该按钮的情况下不会发生任何变化。
【解决方案2】:

这是 ViewState 的常见错误之一 - 它不会为您的点击事件和许多其他事情提供服务。

每次点击按钮(或复选框,如果启用了自动回发)都会引发一个表单提交到服务器。所有关于点击内容的信息都以纯文本形式包含在表单回发数据中。然后服务器解析这些数据,当你的按钮实现了 IPostBackDataHandler 时,它会引发适当的事件,比如“按钮 id 已被点击”。因此,您实际上可以更改请求正文:

D__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPD...&ctl00%24_pdContent%24txtEmail=qwe%40aeqw.ry&ctl00%24_pdContent%24btnRtnUser=Login&__EVENTVALIDATION=%2FwEWDAL424aUAQLjtYbqCAKu8qTUCQLXm%2BfNAwKk2O%2B4DgK3ypStCAL6q%2BaACgKBnvb9CQLr8ey6CALxoZvDCALFt96ABgLMorjMAwoW3zW69NNlOXygWNnB6luGVWnk

您可以在上面看到 id=ctl00__pdContent_txtEmail 的输入内容并单击 id=ctl00__pdContent_btnRtnUser 的登录按钮。

WebFormshere中关于服务器事件的更多解释。

请阅读更多关于 ViewState here 甚至更好的解释 here

【讨论】:

  • @LaoR 说了什么。您可能 - 根据您的具体情况 - 需要在您的请求中包含一个 __AntiXsrfToken cookie,但基本的一点是,您需要成功触发服务器端点击事件并让您的 button1_click 方法执行所需的所有数据都是现成的对于客户端(浏览器)。这很容易使用 Fiddler 或类似的东西进行测试。
  • 但是那些id不是在客户端吗?由于该按钮从未呈现,因此它甚至不会出现在 html 中。您将如何修改该请求正文以触发按钮单击? id 是什么?
  • @Diskdrive - 在任何 javascript 调试工具中,都可以使用正确的参数简单地调用 __doPostBack
  • @igor - 当然。但是该按钮从未在 html 中呈现。客户在他们的 dopostback 语句中引用按钮的 id 是什么?
  • stackoverflow.com/a/24064375/279911 - 实际上我认为有人已经问过这个问题,而且看起来是的,只要您设置了相关的安全设置,就不可能到达按钮点击事件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多