WEB安全实践 之 实现手法(一)设计上的安全 第一节:认证

字数 2260阅读 84

*适合有一定网络(WEB)安全知识的同行阅读

实现手法(一)

1. 认证

1.1 限制访问
1.1.1 目的
针对特定的用户才能访问的资源,以及管理员角色才能进行的操作等,需要对权限有差别化地控制。

1.1.2 步骤
(1)明确基本方针(policy)
哪些资源[*1],哪些人[*2],可以进行怎样的操作。
*1 图片、文字、文件等;*2 匿名用户、注册用户、VIP用户、管理员等

(2)授权认证
基于既定的方针,会有不特定多数的人访问的站点(比如网购),是哪些人他们在页面上做了哪些操作,运营方可能需要掌握。
这时就需要实现认证的功能,比如常见的会员登录,登录后点击购买按钮等,而一旦被他人冒用,就会造成金钱等利益上的损失。
毕竟,网络上,大家都看不见对方,风险很高,只能通过站点(尤其是数据库和日志)收集到的各种信息来识别个人。

(3)方针的执行
确认了本次的访问者谁,并且判定了本次其想要进行操作的有效性[*1]之后,才允许其进行本次的操作。
*1就算确认了访问者是注册用户,但其想访问VIP用户的资源或进行相关操作,也是不被允许的

1.2 认证的种类:认证,是指核实访问者身份 时的处理
1.2.1 知识性(也包括防止注册机器人)
目前普遍使用的密码认证。
这种只有本人才知道的信息[*1],虽然很单纯,但对于确认访问者本人是非常有效的方式。
而且,在被攻击(篡改密码等)之后,可以通过找回密码或寻问秘密问题等功能[*2] ,比较容易地帮助用户恢复其认证信息。
*1需要加密,即便是技术人员也不能轻易地解密,最大程度保护用户隐私;
*2在设计及开发时,就需要做到未雨绸缪,引入这些机制

1.2.2 所有物
电子信息。
经过权威以及信用机构发行的电子类授权物。可以是在浏览器上事先安装的插件等(虚拟式),也可以是USB插入电脑等(物理式)。
而且,就算是丢失了,也可以申请重新发行,同时让原有物失效。

1.3 密码认证的设计: 密码强度
字典式攻击是最普遍的一种攻击方式。
密码的位数过少,包含自己的姓名(字母)、生日、电话号码等相对容易被猜出来的拼音数字,成功破解的可能性比较大。
当用户在注册或更改自己的信息时,提示其不合规范,强制性让其重新输入,在设计和开发时需要引入这种机制, 但不能过于复杂[*1]。
只要输入的内容不是过于简单的,就尽量不要硬性规定不能输入哪些字符[*1],不过可以根据运维需要,规定必须输入的最小长度及哪些字符。
*1不然会引起用户的不满

1.4 封锁账户:对于已注册用户,登录时的认证
1.4.1 锁定:字典式攻击的有效手段之一
(1)连续输入多次密码,均与实际密码不符合时,账户即被封锁。
(2)如果一段时期内锁定后自动解锁的现象2次以上反复发生,并且系统判定是均来自同一IP时,需要封锁IP。

1.4.2 解锁
(1)一定时间后,自动解锁
(2)强制性要求重新设置密码
(3)由运营方手动解锁[*1]
*1 安全性要求较严格的情况(银行、军事等),需要本人提交书面申请

1.5 保护密码
1.5.1 加密
一旦保存密码(以及用户名等登录所需信息)的媒介物被外泄,涉及到的用户信息可以轻易地被窥视,后果极其严重。
不过如果事前引入了加密机制,虽然不能做到100%保障密码不被破解,也至少可以极大程度地增加破解的成本,争取时间尽早发现亡羊补牢。

1.5.2 加密的技巧
对于专业黑客来说,字典式攻击是惯用手段。所以如果只对密码本身加密[*1],通过字典式攻击被破解的成本也会相对降低。
所以,用户名+密码,把这个组合作为整体来加密,甚至还可以加入电话号码或生日等做为组合体,尽可能地增加复杂度。
*1 哈希算法(Hash)是主流

1.5.3 重置密码
通过哈希算法加密后,密码内容不可逆向恢复!
所以,在设计阶段就要考虑让用户重置新密码,而非单纯地把原有密码提示给用户,也没有必要。

1.6 给用户显示错误信息的技巧
用户名或密码输入错误后无法通过认证,这时需要给用户提示相关内容。
不管是用户名错误还是密码错误,或者是两者都输入错误而导致无法通过认证,原则上只需要向用户显示固定统一的信息,而非”错哪指哪“。
不然,如果显示”用户名不正确“,”密码不正确“等信息,会给攻击者暴露出另一层信息:
A. “用户名不正确,那意味着密码应该正确”,会变相鼓励攻击者继续对用户名进行排查
B. “密码不正确,那意味着用户名应该正确”,会变相鼓励攻击者继续对密码进行排查

1.7 认证时记录日志的技巧
不能把密码写入到日志文件中保存,一旦涉及到注册及登录信息的日志文件被外泄,加密也无济于事。
A. 用户正常地登录,是直接的暴露了密码信息
B. 用户可能一时手误输错了大小写或字数错了,或者是忘记了密码而试着使用登录其它系统所用的密码(*1)
*1 这时虽然无法登录本系统,但可能间接对其它系统的个人信息产生威胁

1.8 邮件认证
1.8.1 新注册用户
注册提交时,给输入的邮箱发一封邮件,起到临时确认邮箱是否有效[*1],如果自己收不到,则证明输入有问题或邮件服务本身出了问题。
*1 用户手误输入某些字符,邮件服务已经停止,以及机器人注册使用的邮箱等无法正常收到邮件

1.8.2 已注册用户
修改提交时,与新注册时类似,先给输入的新邮箱发一封邮件,起到临时确认邮箱是否有效。

1.8.3 邮箱有效性的确认
不管新注册还是已注册后的修改,需要在临时确认用的邮件里付上激活链接,有效地阻止攻击者篡改邮箱。
A. 新注册时,点击此链接即完成正式确认,后续的系统功能即可使用
B. 修改时,也需点击此链接即完成正式确认,同时给旧邮箱发一封邮件,说明此次修改了邮箱,今后旧邮箱失效,请新邮箱

1.9 手机号认证
与邮箱认证有相似之处。
(1)给用户输入的手机号发一条短信,成为临时确认用。其中写有认证码[*1],如果自己收不到,则证明号码输入有问题[*2]。
(2)提交后,系统会提示输入收到的认证码,在规定的时间内输入认证码后再次提交即证明该手机号是用户本人在使用,完成认证。
*1 此时在系统后台保留着这个认证码;*2 也不排除手机在圈外等极少情况

推荐阅读更多精彩内容