写这篇文章是因为最近在产品登陆受权页面上,到底如何返回错误提示引起的一些思考,调研后作下总结。php
登陆和受权在如今的互联网产品中属于最经常使用必备的模块,在互联网安全形势严峻的今天,其重要性更是不言而喻。如何处理好这个部分,关系到产品在用户内心的信誉。关于登陆受权的安全性涉及方方面面,本文重点讨论的场景是:当登陆或受权失败时,应该如何返回给用户错误提示。安全
场景具体描述为:app
用户进入登陆页面,输入手机号,点击发送短信验证码;用户收到短信验证码后,输入验证码,点击登陆;校验信息成功,给予用户受权,失败则给予错误提示。less
问题1:测试
当用户输入手机号后,点击发送验证码时,若是用户不存在或者不该被受权时,是否应该直接提示错误信息,如:用户不存在,未注册,手机号已被占用,已绑定等。spa
问题2:支付宝
当用户收到短信验证码已经超时,输入过时验证码或者没有点击发送验证码,直接输入错误验证码时,是否应该提示:验证码无效,验证码未发送等。get
综合的讲,就是是否应当在登陆或受权页面给予用户详细的错误提示。产品
首先我去看下主流App是如何作的,调研的有:支付宝,京东,微博,中国移动,摩拜,ofo,首先在手机上退出登陆,而后使用短信验证码进行登陆,没有短信登陆的,使用短信找回密码功能测试。结果是it
问题1:
支付宝,京东,微博将手机号输入页面和短信验证码页面分离,而且校验了用户手机号是否存在,不存在给予提示。而中国移动,摩拜,ofo,手机号输入和短信验证码在同一页面,没有校验用户手机号是否存在,而是直接提示短信发送成功。
问题2:
支付宝,京东,微博,中国移动,摩拜,ofo,全部App在短信验证码超时或未发送验证码时,提示信息不包含验证码无效,验证码未发送等信息,而只是提示:验证码错误。错误提示与正常状况下已发送验证码且验证码在有效期时,用户输入错误验证码的提示相同。
缘由是什么呢?这么作的目的是为何呢?我到OWASP找到了答案。其中两段描述:
An application should respond with a generic error message regardless of whether the user ID or password was incorrect. It should also give no indication to the status of an existing account.
The correct response does not indicate if the user ID or password is the incorrect parameter and hence inferring a valid user ID.
也就是说登陆受权操做的结果,不该该包含或者隐含帐户的状态或者处理逻辑的状态这些信息,而是应该返回一个统一的错误提示,这样作的目的是为了尽可能避免受到破解攻击,攻击者能够利用上你返回的任何附加信息,对帐户进行破解。经过用户手机号验证用户是否存在,会存在泄露用户隐私及系统帐户信息的风险,好比攻击者能够经过枚举,查出系统内所有注册手机号。以上实例是从短信验证码角度考虑的,因为短信验证码存在有效期,其实自己安全性仍是较高,当系统使用用户密码时,采起的策略就必须更加严谨。