为什么我能够在活动站点上“选中”“禁用”复选框,并且数据已成功上传到服务器

Why were I able to "check" the "disabled" checkbox on the live site and the data was successfully uploaded to the server

本文关键字:数据 成功 服务器 复选框 站点 活动 禁用 为什么 选中      更新时间:2023-09-26

所以我刚刚访问了一个站点,其中有"禁用"复选框

<input type="checkbox" name="name" checked="checked" disabled="disabled">

它无法通过鼠标检查,所以我决定通过jQuery取消选中它。打开控制台并写道:

$('input[name="name"]').attr('checked', false);

它被取消了。我想,好吧,也许它只是为了我未选中,但服务器仍然会从中获取数据,就好像它被选中一样。

所以我上传了我的表单,令我惊讶的是,服务器的行为就像未选中复选框一样。

为什么?

它被取消了。我想,好吧,也许它只是为了我未选中,但服务器仍然会从中获取数据,就好像它被选中一样。

仅当表单控件成功时,表单控件中的数据才会包含在提交中:

  • 禁用的窗体控件将不会是成功的控件
  • 未选中的复选框将不是成功的控件

您刚刚将其从一个不会提交数据的状态更改为另一个不会提交数据的州。

尝试检查通过浏览器的开发人员控制台发送到服务器的确切请求,您将看到实际发送到服务器的所有参数。由于您说复选框被禁用,因此它的值根本不会发送到服务器(无论是否选中)。所以我假设它只是 UI 的一部分,它的值不在服务器上处理。

值得记住的是,浏览器呈现的表单上的字段,以及提交它们时在请求中发送到服务器的值,基本上仅通过约定进行连接。也就是说,浏览器应该做什么有严格的标准,但是一旦服务器发送了一些HTML,浏览器理论上就可以用它做它喜欢的事情。事实上,你可以直接查看HTML,并手动创建一个HTTP请求(因为它是基于文本的协议),它提交了你想要的任何数据。

这对于开发人员来说很重要,因为这意味着从用户那里收到的所有数据都是不受信任的 - 无论您如何布局UI,要求浏览器隐藏哪些字段,将只读等,用户都可以向您发送您喜欢的任何数据,并且在服务器收到后由您来检测。

因此,虽然在这种情况下您错了,但总的来说,您可以使用jQuery或浏览器的F12调试工具来操作表单上的字段。在这种情况下,它没有区别,因为即使未禁用未选中的复选框也不会发送到服务器(这种设计有时对于服务器端代码的作者来说相当烦人)。但是在其他情况下,您可以影响发送的内容:

  • 删除复选框的 disabled 属性,并设置 checked 属性(以便将值发送到服务器)
  • 更改控件的状态,该控件readonly,而不是disabled(因为它的值将始终被发送)
  • 更改隐藏字段的value属性,或将其设置为可见并在其中键入(例如,尝试jQuery('input[type=hidden]').attr('type', 'text');
  • select下拉列表换成具有相同 name 属性的自由文本input,以选择不在列表中的值
  • 一次取消设置单选框组中的所有项目(人们在实际 UI 中实际执行的操作,作为"以上都不是"/"尚未选择"的丑陋笨拙)
  • 或者甚至只查看页面上所有控件的名称,并使用具有所有这些名称的文本字段创建自己的窗体,并使用不同的值

所以不,在这种情况下你没有破解任何东西,但是是的,基本的想法是合理的。