登录业务中存在的安全问题

背景:
          在互联网网站中,用户注册,登录几乎是每个网站的标配功能。在一般人看来一个小小的登录业务表面上看起来很简单 ,大概过程是这样的:用户在前台页面输入用户名和密码,然后后台web服务器拿到用户输入信息,在数据库里根据用户名和密码匹配一下,有数据返回,表示用户的账号和密码匹配成功,跳转到相关页面;没有则返回登录错误提示用户。这个小小的业务流程看似很简单,但是因为涉及到用户账号和密码这类关键性用户数据,常常成为黑客的攻击点。比如:csdn被人拖库,密码报出明文存储,小米网站爆出泄漏用户登录信息(小米技术人比较牛,密码泄漏后,做了两件事情,第一承认用户账号泄漏,第二泄漏后叫用户别怕,因为加密存储了密码,黑客拿到的是加密后的密码)。京东,支付宝等大的互联网网站等也有暴露过相关泄漏用户账号黑客事件。
   
          由于程序员的开发技术水平参差不齐,项目进度,或者压根就没安全意识等因素,导致编写的用户注册,登录功能存在很大的安全风险。安全小菜鸟在这里罗列一二,以备不时之需。


遇到的安全问题:
1、 拖库
          由于程序中存在sql注入漏洞,在客户端输入信息时,用户恶意输入一些sql语句,导致数据库里的用户信息被黑客窃取(有兴趣的同学可以上网搜搜怎样进行sql注入攻击,进行拖库),然后用户的账号信息就被黑客拿到,然后黑客就可以干很多事情了。

应对措施:
          对存入数据库中的密码,进行加密存储。有些技术人员为了省事,直接用“原始密码”MD5加密后存储。 MD5虽然不能解密,但是原始值MD5加密后的值是不变,根据这些特性可以通过碰撞检测,字典表等猜出用户的密码。即根据字符串的组合,MD5加密后,生成加密值,存入MD5库;然后根据泄漏网站的密码从MD5库里一查,什么都有了。现在都有网站提供“MD5解密”功能,原理猜测估计是根据碰撞检测。
原始密码用MD5加密不能用那用什么了?
加盐存储:用户的密码+盐(固定格式的随机字符串)然后在用md5加密或者相应的hash函数进行加密;加密后的字符串和固定格式的随机字符串需要保存关联存入库里;下次用户登录时,使用密码+盐,再调用相应的加密算法,算出加密后的值和库里的密码值是否相同,如果相同则登录成功,否则登录失败。

盐:可以使用注册时间+用户名等,有网上专家建议使用“基于加密的伪随机数生成器”来生成盐,见http://blog.jobbole.com/61872/

好处
1、增加原始加密字符串的长度,黑客在碰撞长字符串时花费更多的时间(理论上来说还是可以破解不过破解所花费的和获得利益就需要黑客评估了)
2、增加了破解难度,如果盐值不随机,而采用固定盐值,或者短盐值,黑客也可以通过“猜测的密码”+短盐值,加密后,快速对比泄漏的密码,而获得原始密码。

除了从技术上解决完,还要加强线上安全扫描或者安全代码审查。

2、 客户端无限制登录
           有些登录接口,在登录多少失败时,没有任何限制,这样就造成了黑客可以无限制调用登录接口,达到暴力破解的目的。

应对措施:加验证码。验证码也有可能被高明的黑客破解。
如果不行;加用户名登录错误次数检验;或者ip登录次数限制。

3、 Cookie被盗,xss攻击
          大多数互联网应用,都用cookie来标示用户登录信息,如果cookie被黑客盗用,也就等于用户登录的令牌已经被黑客窃取,然后用户在自己的浏览器里种入cookie,冒充用户已经登录。盗取cookie一般是用xss攻击,即在页面上提交信息的字段
里加入一段恶意的js脚本,其它用户在浏览信息时,执行这段恶意的脚步,然后把浏览信息用户的cookie发到黑客服务器里,然后黑客就可以冒充被黑用户了。

应对措施:
          对于用户可控输入的信息,进行展现,都做html编码。
          设置httpOnly属性,防止客户端脚本访问cookie

4、 httpOnly突破,中间人攻击
         设置httpOnly,或者做xss脚步处理,cookie信息就安全了吗?
no,客户端和服务端的http通信,在整个网络传输时,是明天传输,中间人可以控制路由器等网络设备,抓取这些网络设备上的数据,由于明文传输,一分析,什么都出来。

应对措施:设置secure属性,cookie只能在https 下发送到服务端,所有的http通信都加密,即使中间人截取到网络通信数据,也无法解密出数据。

相关推荐