20

我公司的网站上有一个竞赛报名页面。为了参加比赛,您需要创建一个登录名,该登录名只是一封电子邮件和一个 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% 确定情况并非如此。只有我们网站的注册用户(仅限于非常具体的企业会员列表)才能进入竞赛条目页面,

4

6 回答 6

17

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

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

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

于 2011-04-08T19:51:29.600 回答
7

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

最大长度 | 站点点参考

最大长度 | W3 学校

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

于 2011-04-08T19:51:05.850 回答
3

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

于 2011-04-08T19:56:23.143 回答
3

我收到的几封电子邮件显示用户创建了一个超过 4 个字符的图钉。

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

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

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

于 2011-04-08T19:57:31.017 回答
3

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

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

于 2011-04-08T19:58:10.190 回答
1

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

于 2011-04-08T19:56:14.490 回答