首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考。
1、 前提
执行安全的验证机制,不仅仅要同时满足几个关键安全目标,许多的时候也需要牺牲其他目标。比如易用性、成本、还有功能。
我们需要综合考虑下面这些因素:
系统所提供功能的安全程度;
用户对不同类型的验证控制的容忍和接受程度;
支持一个不够友好的界面需要的整体成本(便捷和安全往往是一个事物的两个方向)
系统所保护的信息或者资产的价值。
2、 安全处理敏感信息
一些基本要求,写下来,以后也可以参考。
1. 使用公认的加密技术(比如SSL)保护客户端和服务器之间的所有通信;
2. 一般不需要使用特定的方案保护数据的传输;
3. 如果有条件的话,从加载登陆表单就开始用https,而不是在提交信息的时候才使用https;
4. 只能使用post方式向服务器提交敏感信息。绝不能将敏感信息放在URL参数或者cookie中;
5. 绝不能将敏感信息还给客户端,即使是重定向传参数也不行;
6. 敏感信息的存储,要做好最坏的准备。如果攻击者能够访问应用程序数据库中所有数据,也不能轻易恢复这些敏感信息的原始值,比如使用SHA-256函数。 (堡垒往往容易从内部被攻破的);
7. 一般来说,“记住我”功能应该只能记忆用户名这种非保密数据,但是现在为了进一步提高用户友好性,越来越多的密码存放在“记住我”的cookie中,于是又提升了支付密码和其他密码的重要性…
8. 定期修改密码(但是也有论文说这个无效,见仁见智吧)
9. 对一些特殊要求的新建账户发送敏感信息(批量创建用户之类),要用尽可能安全的形式传送,并设置时间限制(客户端和服务器端都要设置),要求用户在第一次登陆的时候更改密码(客户端要提示,服务器要有逻辑执行),并告诉用户删除这些敏感信息(虽然大部分情况下没用,但是万一有用呢?)
10. 如果对安全性要求足够高的地方,可以使用软键盘或者其他的可变动的方式;但是话又说回来,如果攻击者已经攻破用户的计算机,理论上来说,他就可以记录计算机上的任何事情,比如鼠标活动,HTTPS表单等各种行为。