4.1 实验#1:oricity网站轨迹名采用不同验证规则
缺陷标题 oricity网站上传轨迹和编辑线路时,轨迹名称采用了不同的验证规则。
测试平台与浏览器 Windows 7+IE 9或Chrome 32.0。
测试步骤
(1)打开oricity网站http://www.oricity.com/。
(2)登录,单击“户外轨迹”,再单击“上传轨迹”。
(3)按要求填写内容,单击“上传轨迹”按钮(如果不填写轨迹名称,将不能保存,如图4-1所示)。
(4)上传成功后单击“返回列表”进入上传的轨迹帖子;单击“编辑线路”按钮,将路线名称置为空并存盘。
(5)查看保存结果页面。
图4-1 上传轨迹时提示轨迹名称不能为空
期望结果 保存失败,提示轨迹名称不能为空。
实际结果 保存成功且轨迹名称为空,如图4-2所示。
图4-2 编辑线路时将轨迹名称设为空保存成功
专家点评
这是典型的输入有效性规则校验问题。本例在创建的时候有检验控制,避免了不符合预期;但是修改时忘记使用同样的方法去校验,就出现了这样的问题。
类似这样的缺陷场景有许多:
(1)创建用户时,要求密码至少8位,并且不能全是数字;但是创建完成后,用户修改密码时可以把密码改成只有一位数字。
(2)创建相册时,要求相册名不能为空;但是创建成功后,修改相册名可以设为空。
对于这样的验证,除了创建与修改时验证规则要保持一致外,同一个系统不同页面中出现的同一个元素的验证也要相同。
例如,对于电子邮件地址的合法性判断,通常在不同模块由不同的验证方法去判断,导致在一个页面能注册成功,到另一个页面又提醒这是非法邮箱。
另外,对于规则的验证,不仅要做简单的JavaScript客户端校验,还要做相同的服务器端校验,因为客户端的JavaScript校验是可以被工具绕行的,攻击者篡改数据后,就可以直接往服务器端发送请求,提交后台数据库。只有服务器端的校验才能真正保证数据符合预定规则。在更新数据库前进行服务器端的审查,只有通过审查才能保存,这样就杜绝了攻击者利用客户端脆弱的输入有效性验证进行各种攻击。