首页 > 编程知识 正文

如何预防账号密码泄露等安全问题发生,您的密码已泄露,请采取措施保护帐号安全

时间:2023-05-04 06:38:40 阅读:219062 作者:3421

    我个人对黑客和网络安全比较感兴趣,时常关注这方面的新闻。我们知道这些安全问题都是软件程序有Bug导致的,例如CSDN的数据库泄露事件、携程泄露用户银行卡信息事件、电商网站被用户篡改购买支付金额等等。

    在软件项目开发时,安全一直是一个比较容易忽略的问题,但这也会导致很严重的损失,所以我们在软件开发时必要对安全问题引起重视,防患未然,构建安全软件。

    我们今天一起讨论一下软件开发中的安全问题。

安全问题本质是技术风险

    安全问题本质上是一种技术风险,没发生问题的时候大家一切平安,一旦发生问题就会有严重的影响。所以对待安全问题,我们可以借鉴对风险管理的方法来改进软件的安全问题,也就是风险识别、风险量化、应对计划和风险监控。

    我们做风险管理的时候,首重之重就是识别风险和对风险的量化,对于安全问题,我们要思考一下,软件项目中安全问题的主要来源是什么?

第一类:恶意输入

大多我们熟知的软件安全问题都属于此类型,就是黑客通过恶意输入,然后绕过软件限制对系统进行攻击和破坏

    像SQL注入,就是黑客把SQL命令输入到软件的输入框或网页的URL查询参数,欺骗服务器,执行恶意的SQL命令,这种可以绕过密码验证,登录管理员账号,或者删除数据库数据,甚至控制服务器,当成肉鸡对网络发起泛洪攻击。

    还有像XSS攻击,将恶意代码通过外部参数或者用户输入的方式植入网页中,获取用户的Cookie等敏感信息、盗用管理员权限,甚至非法转账。

    上面的问题都可以归结为恶意输入导致的,应对恶意输入的问题,最简单有效的方式就是对用户输入数据进行严格的检查校验和格式化。

第二类:假冒身份

    很多程序对于用户身份检验比较弱,会导致黑客假冒用户身份做出超越权限的事情。

比如有的网站把后台入口隐藏起来,不做权限控制,导致黑客猜到地址后就可以进入后台操作。

    还有的游戏后台不做验证,直接接收传入的数据,导致伪造游戏用户发送数据破坏游戏公平。

    这类问题应对策略就是对用户的身份做验证,尤其是涉及敏感权限的操作,甚而做两重验证。

第三类:数据泄露

    很多软件数据库都存储了用户的敏感信息,比如用户账号密码信用卡信息或者服务器的敏感信息,比如数据库连接字符串、登录账号密码,这些数据是有被泄露风险的。

    一些软件甚至会把服务器上的敏感信息打包到程序中,要知道程序会被反编译从而导致敏感数据泄露,携程泄露用户银行卡信息事件就是因为把用户信用卡信息记录在日志中,日志泄露导致用户信用卡也被泄露,造成盗刷等等严重问题。

    还有CSDN,对用户密码铭文存储到数据库中,数据库泄露之后,用户密码也跟着泄露,而且现在大多数用户都习惯于使用统一的密码,导致一起泄露。

    所以,对于软件来说,我们不能假设数据存储是安全的,而是要考虑到数据是有泄漏的可能,提前做好预防措施,对敏感数据加密。

如何预防软件中的安全问题

    在风险管理中,对风险识别和量化后,接下来就是要制定应对计划了。

    很多开发人员觉得安全问题,只要在软件开发完成后,测试阶段做一个安全测试就可以了,但这种做法完全把安全问题留到了最后环节,是很难达到对安全问题进行高质量管控的。为什么呢?

    一方面对于安全测试来说,很难覆盖到所有可能存在的场景,会出现疏漏,另一方面,如果测试阶段发现安全问题,可能需要修改很多代码,甚至架构要重新设计,成本代价太高。

    很显然,应对安全问题,最好的方式就是整个生命周期都做到重视安全问题。

需求阶段

    需求是软件项目的源头,在确定需求,做产品设计的时候,不仅要考虑到功能上的需求,同时还要考虑到安全方面的要求,这样我们在设计架构的时候,不会轻易遗漏安全方面的架构设计。

    需求阶段,涉及用户输入的内容,需要考虑到可能的恶意输入,做出针对性的预防措施;对于涉及用户权限的,要求有身份的验证,甚至一些安全要求极高的,可以在需求商就要求做双重验证;对于有敏感数据的,需求商要对数据进行加密。

    举例,用户登录功能,安全方面的需求,我们可以考虑到如下功能:

登录网页使用Https或者在传输密码时加密;增加图形校验码,避免恶意攻击;密码失败次数过多,应该锁定用户一段时间;记录用户登录IP;

我们在需求阶段就提出了安全性的需求,设计、实现和测试时自然不会遗漏掉安全方面的内容,从源头上就让大家有了安全方面的意识。

设计阶段

    做设计架构时,我们就要把安全加入到设计目标中,有了这个设计目标,我们自然能找到很多安全相关的解决方案。

    为了保障在设计时就考虑好安全方面的问题,我们在做架构设计方案评审时,也需要增加安全方面的评审,确保有安全方面的考虑,确保技术方案切实可行。

    在架构设计领域,我们也有了业界公认的好的安全相关的设计原则,比如攻击面最小化、权限最小化、纵深防御等。

攻击面最小化

攻击面指程序被用户直接访问到的部分,比如API、网站等,而攻击面最小化的设计原则,就是尽量减少暴露黑客可能发现并试图利用的攻击面数量。举例来说,你的数据库应该关闭外网访问,避免黑客直接攻击数据库导致数据泄露,还有对于复杂的多网站业务系统,实行单点认证,就可以让所有业务都在一个地方登录,这一个地方做到足够安全了,那所有的网站的登陆都是相对安全的。

权限最小化

权限最小化的设计原则就是对于系统的用户、文件访问、进程运行等,给予其能拥有的最小权限,这样可以保证一个应用程序或者网站被攻击、破解,将损害讲到最低。

以前在部署Asp.Net程序时,运行Asp.Net程序是单独一个用户,此用户拥有的权限只能是运行程序目录,不能超出其目录范围,这样即使用户上传了恶意木马文件,也只能控制着一个目录,避免进一步的损失。

纵深防御

纵深防御的设计原则,指的是从不同的维度去实施安全保护措施,从而缓解被攻击的风险。纵深防御的核心是从不同的层面、不同的角度对系统做出整体的解决方案。

    我们知道国内中小电商,一半以上早年都在犯过一个错误,就是电商的交易和支付系统之间流程是这样的,我买一台显示器1500,把钱交给支付系统,支付请求是从用户侧浏览器发出的,用户不可见,但是攻击者实际上可以修改这个数据,把浏览器提交的数据改为1,支付系统返回OK,表示收到款项,交易系统看到支付成功了,就跳到安排发货,用户就1元买到显示器了。

    从系统的整体角度考虑,显然不仅要校验交易有没有成功,还要校验交易的金额是否匹配。

开发阶段

    在编码规范时我们要多用户输入数据进行校验;涉及权限的操作,要检查用户权限;对于敏感数据要进行加密处理;对于用户的操作,要有日志记录;不能在日志中记录敏感信息等等。要有代码审查,及时发现代码中的安全问题。增加安全相关的自动化测试,和CI集成。

测试阶段

    测试阶段,除了功能测试以外,还要增加对安全性方面的测试,除了增加相应的测试用例,还可以借助一些安全测试工具。

上线维护

    上线部署时,不部署源代码,只对编译后程序部署;删除Debug文件。对服务器进行安全设置,严格限制端口,只保留必须的端口;只对少数服务器开放服务;开启操作日志;对访问目录设置最小的权限;

如果真的出现了安全问题怎么办?

    安全问题就像程序的Bug一样,没有谁能保证绝对的安全,风险管理的最后一步风险监控说的有道理,我们必须做好Plan B,出现问题马上应对,将损失降到最低。

    首先,设立应急的流程,出现安全问题了,根据流程,找到第一责任人,立即解决问题回复生产,避免进一步损失。

    其次,要分析程序的漏洞,通过分析日志,找出漏洞

    最后,总结原因,从错误中吸取教训,看问题是在哪个环节导致的,必要的话,改进开发流程,避免类似的安全问题再次发生。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。