为什么我能够在实时站点上 "check" "disabled" 复选框并将数据成功上传到服务器

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

所以我刚刚访问了一个网站,那里有 "disabled" 复选框

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

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

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

未检查。我想,好吧,也许这只是对我来说未选中,但服务器仍会从中获取数据,就好像已选中一样。

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

为什么?

It got unchecked. I thought, well, maybe it's just for me unchecked, but server will still get data from it as if it's checked.

如果控件成功,来自表单控件的数据将仅包含在提交中:

  • 一个禁用的表单控件将不会被成功控制
  • 未选中的复选框不会是成功的控件

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

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

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

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

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

  • 删除复选框的 disabled 属性,并设置 checked 属性(这样值 发送到服务器)
  • 更改控件的状态 readonly,而不是 disabled(因为它的值将始终被发送)
  • 更改隐藏字段的 value 属性,或将其设置为可见并在其中键入(例如尝试 jQuery('input[type=hidden]').attr('type', 'text');
  • select 下拉菜单替换为具有相同 name 属性的自由文本 input,以选择不在列表中的值
  • 一次取消设置单选框组中的所有项目(人们在真实 UI 中实际做的事情,作为 "None of the above"/"Not selected yet" 的丑陋拼凑)
  • 甚至只查看页面上所有控件的名称,并使用包含所有这些名称的文本字段创建您自己的表单,并尝试使用不同的值

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