【问题标题】:Are there browsers that don't support maxlength?是否有不支持 maxlength 的浏览器?
【发布时间】:2011-08-01 18:54:57
【问题描述】:

我公司的网站上有一个竞赛报名页面。为了参加比赛,您需要创建一个登录名,该登录名只是一封电子邮件和一个 4 位数的密码。这是 PIN 字段:

<input type="password" name="contest_pin" id="contest_pin" maxlength="4" />

当用户提交表单时,该帐户会在我们的数据库中创建,然后他们会收到一封包含他们创建的电子邮件地址和 PIN 码的电子邮件(我已复制到该电子邮件)。

问题出在:在我测试过的所有浏览器(Mac 上的 Safari/Chrome/Firefox、Linux 上的 Chrome/Firefox、Windows 上的 IE7/8/9)中,我无法在该 PIN 字段中输入超过 4 位数字。然而,我收到的几封电子邮件显示,用户创建了一个超过 4 个字符的 pin。

这怎么可能?是否有不支持 maxlength 的浏览器?我没有在 Opera 或任何移动浏览器上测试过。如果他们的密码长于 4 位数字,这不是什么大不了的事;数据库将接受更多。我只是想知道他们是如何设法绕过 maxlength 的。

编辑添加

有太多的答案基本上都在说同样的话,我无法单独回复所有这些。我知道我应该始终对任何重要的事情进行服务器端验证,并且我们确实有 PHP 代码来清理我们的数据,如果它非常重要,我也会让 PHP 代码强制执行 4 位限制。它们只有 4 个字符对我们来说并不重要,所以我没有强制执行。我只是想知道为什么 maxlength 属性没有做它的设计,这是防止用户输入超过一定数量的字符。对于那些建议使用恶意脚本或 Firebug 的人,我可以 100% 确定情况并非如此。只有我们网站的注册用户(仅限于非常具体的企业会员列表)才能进入竞赛条目页面,我可以保证该列表上的大约 100 人中没有一个人会故意试图规避输入类型属性。

【问题讨论】:

  • 与我在这里遇到的问题完全相同,我知道 max-length 很容易规避,但对于那些不想克服任何障碍的用户来说呢?我唯一能想到的就是克里斯所说的,那就是在某些浏览器上复制和粘贴时不起作用。只有一个例子是 IE,如果你在文本区域有属性 maxlength,那么你可以在里面粘贴超过 maxlength 的文本。输入不是这种情况。但可能在其他浏览器上。我不知道为什么人们会在别针上粘贴。如果你知道它是怎么发生的,请告诉我。
  • 当您添加了 type="number" 属性时,maxlength="x" 在 MAC 上不起作用(尝试使用 chrome 和 firefox):)
  • @MindaugasBernatavičius,那是因为您需要为type=number 使用maxminrange 属性。
  • 这是一个很好的问题。我们有一个内部站点(因此没有机器人或恶意用户可以绕过maxlength),我需要 maxlength 以方便工作。例如,一个特定的数据库字段设置为最大长度 100(即字符变化 (100))。所以maxlength=100 设置在输入元素上。 然而,有时输入元素允许103101个字符溜过,后端抛出异常。这是烦恼。我想知道为什么有时允许输入长度超过最大长度几个额外的字符;看起来像一个错误。
  • 我刚刚发现了 INPUT 元素的问题,它在数据库后端允许比 maxlength 略多一点。 maxlength attribute “指定最大字符数(在 Unicode 代码点中)”。因此,例如,如果输入了单个 2 字节 Unicode 代码点(例如乘号 (\u00D7)),则对于输入的最大长度将计为 1,而对于数据库字符长度则计为 2 (假设 SQL_ASCII 编码)。

标签: html webforms maxlength


【解决方案1】:

我相信每个浏览器都支持它,这里有几个链接供参考:

Maxlength | SitePointReference

Maxlength | W3 Schools

显然有办法解决这个问题 - 您应该确保您始终有足够的服务器端验证,因为客户端本身通常是不够的。

【讨论】:

  • 请注意:w3schools 通常被认为是编程/Web 开发相关信息的低于标准资源。在别处验证这些信息总是一个好主意。
【解决方案2】:

一般来说,尝试在客户端执行用户输入的规则是一个坏主意。我有一次经验,我们将一些工作外包给了一些程序员,他们清理用户输入的想法是让用户在任何给定字段中输入的字符不能超过 10 个。一个快速的萤火虫更改,哦,看,我可以通过一些最小的 SQL 注入来删除服务器的数据库。

如果我是你,我会使用将用户信息添加到数据库的任何脚本检查最大长度,如果用户输入超过指定的最大长度,则返回表单验证错误。

【讨论】:

    【解决方案3】:

    我收到的几封电子邮件表明,用户创建了超过 4 个字符的 pin。

    这怎么可能?是否有不支持 maxlength 的浏览器?

    我会调查与这些用户活动相关的 USER_AGENT 和 REFERER 标头。也许恶意用户以编程方式提交表单以绕过浏览器限制,只是为了检查您的外围防御。如果是这样,您应该在那里看到一些模式。

    无论如何,抛开这些有根据的猜测,maxlength 不应被视为保护输入的一种手段。任何客户端都不受您的控制,它的存在只是为了使用户界面更直观、更具交互性。您应该始终检查服务器上的所有内容。在这种情况下,PIN 由 4 位数字组成,否则拒绝输入。黄金法则是将所有用户输入视为恶意输入,并在服务器上对其进行彻底验证。

    【讨论】:

      【解决方案4】:

      所有浏览器都支持最大长度。但是,可以使用 DOM 方法或例如使用 Firefox 的 Web 开发人员工具栏轻松删除/更改此属性。

      【讨论】:

        【解决方案5】:

        这是您仍然应该验证服务器端的类型,即使客户端几乎总是支持它。绕过最大长度很容易——Firefox 开发者工具栏包含一个“删除最大长度”选项,或者可以很容易地手动编辑请求。我几乎认为在过去你可以通过简单地使用剪切和粘贴来在其中一个浏览器中获得最大长度(例如,浏览器不会让你输入更多字符,但如果你粘贴一个超过 5 个字符的值会全部输入),虽然我不记得具体是在哪个浏览器上看到的...

        【讨论】:

          【解决方案6】:

          它们很可能是读取字段名称并根据这些请求创建 GET 和 POST 请求的机器人,而不是像普通人类用户那样使用 HTML 表单。

          这就是为什么客户端验证表单永远不足以确保数据正确的原因。客户端验证很好,因为它可以响应最终用户,但它无法防止不良数据到达您的服务器门口。

          例如,假设我在表单中有一个输入字段,其操作是 GET。我的输入字段的最大长度为 4。当我按下提交时,我看到 URL 以 ?field=1234 结尾。没有什么能阻止我将该 URL 更新为 ?field=123456789 并按 Enter。类似的事情可以通过 POST 操作完成,但需要一个工具来完成。

          【讨论】:

          • 我也可以使用 firebug 之类的工具,编辑网站的 html 来移除 maxlength。
          • 不仅是机器人,我相信在旧版浏览器中可以粘贴更长的文本来绕过 maxlength 属性。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-05
          • 2011-12-12
          • 2011-11-13
          • 2011-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多