我在公司网站上有一个竞赛入口页面。为了参加比赛,您创建一个登录名,这只是一封电子邮件和一个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个字符的图钉。
这怎么可能?是否有不支持maxlength的浏览器?我没有在Opera或任何移动浏览器上测试过。如果它们的引脚长度超过4位,那就没什么大不了的了。数据库将接受更多。我只是想知道他们是如何设法绕过maxlength的。
已添加
有太多的答案基本上对我说同样的事情来对所有人做出回应。我知道我应该总是对任何重要的事情进行服务器端验证,并且我们确实有PHP代码清理我们的数据,如果它非常重要,我也会有PHP代码强制执行4位数的限制。对我们而言,它们只有4个字符并不重要,所以我没有强制执行它。我只是想知道为什么maxlength属性没有按照它的设计去做,这会阻止用户输入超过一定数量的字符。对于那些建议使用恶意脚本或Firebug的人,我可以100%确定不是这种情况。只有我们网站的注册用户(仅限于非常具体的企业会员名单)甚至可以进入竞赛入口页面,我可以保证该名单上的大约100名参与者都不会刻意试图规避输入类型属性。
答案 0 :(得分:16)
他们很可能是机器人读取字段名称并根据这些请求创建GET和POST请求,而不是像普通人类用户那样使用HTML表单。
这就是为什么表单的客户端验证永远不足以确保数据正确。客户端验证很好,因为它对最终用户有响应,但它无法防止坏数据到达您服务器的门口。
作为一个例子,假设我在一个表单中有一个输入字段,其动作是GET。我的输入字段的maxlength是4.当我按提交时,我看到以?field=1234
结尾的URL。没有什么能阻止我将该网址更新为?field=123456789
并按Enter键。使用POST操作可以完成类似的操作,但是需要一个工具来完成它。
答案 1 :(得分:7)
答案 2 :(得分:3)
所有浏览器都支持maxlength。但是,可以使用DOM方法轻松删除/更改此属性,例如,使用Firefox的Web Developer Toolbar。
答案 3 :(得分:3)
我收到的几封电子邮件显示用户创建了一个超过4个字符的图钉。
这怎么可能?是否有不支持maxlength的浏览器?
我会调查与这些用户活动相关的USER_AGENT和REFERER标头。也许恶意用户以编程方式提交表单来规避浏览器限制,只是为了检查你的外围防御。如果是这样,你应该在那里看到一些模式。
无论如何,除了这些有根据的猜测之外,maxlength
不应被视为确保投入的手段。任何客户端都不在您的控制之下,它只是为了使用户界面更直观,更具交互性。您应该始终检查服务器上的所有内容。在这种情况下,PIN由4位数组成,否则拒绝输入。黄金法则是将所有用户输入视为恶意,并在服务器上对其进行彻底验证。
答案 4 :(得分:3)
通常,尝试为客户端执行的用户输入强制执行规则是一个坏主意。我有一个经验,我们已经将一些工作外包给一些程序员,他们清理用户输入的想法使得用户无法在任何给定的字段中输入超过10个字符。一个快速的firebug更改,哦,看,我可以通过一些最小的SQL注入删除服务器的数据库。
如果我是你,我会检查最大长度,无论脚本是否将用户信息添加到数据库,如果用户输入超过指定的最大长度,则返回表单验证错误。
答案 5 :(得分:1)
这是你应该仍然验证服务器端的类型,即使客户端几乎总是支持它。绕过maxlength非常容易 - Firefox Developer工具栏包含“删除最大长度”选项,或者可以非常容易地手动编辑请求。我几乎认为在过去你只需使用剪切和粘贴就可以在其中一个浏览器中达到最大长度(例如,浏览器不会让你输入更多的字符,但是如果你粘贴了一个超过5个字符的值,它会进入他们所有),虽然我不记得具体在哪个浏览器...