Skip to content

Latest commit

 

History

History
49 lines (29 loc) · 5.13 KB

operation_safety.md

File metadata and controls

49 lines (29 loc) · 5.13 KB

网络运营安全的思考

本文是白帽子谈web安全的思考

新规范和新架构

通常情况下这些年出的新的架构都会大幅度优化安全的风险,使用官方文档中带的那些的标准方法就能很有效避免错误.php官方在5.5之后给了password_hash方法,直接使用就可以存储代码,再比如我常用的ci框架下,就建议使用链式查询模型,这样就可以有效避免sql注入(当然还是有bug的,比如使用key-value数组下就存在漏洞).

通常使用文档下的新方法和新框架往往能避免漏洞,老的legal code就一般更新慢,就有问题,前一段时间闹得沸沸扬扬的Log4j漏洞,就是如此,在老版本java版本下这个漏洞暴露无遗,作为基础代码库的一部分,这个广泛使用的代码却没有被审视.使用高版本的jdk就可以有效解决这个问题,但是某些公司因为种种原因不愿意更新jdk,反倒是让这些问题遗祸至今.

总之系统里面的老代码尤其要小心,如果是用老版本的代码,能升级尽量升级,不能升级就要花更多精力去考察安全问题,渗透测试与漏洞多使用工具去考察

真的没办法升级么?

通常情况下我遇到的情况都是不愿意升级架构,宁可用老式的架构,理由一般都是担心哪里出现问题,实际上更多的原因我认为是害怕出现问题,升级的主管要负责,这个责任很难背上,而升级往往缺少显性的好处.责任与优点不对等,很难说服产品经理和技术主管升级.我上文提到了的Log4j漏洞,当时给的一个解决方案就是升级就可以解决,实际上由于这个问题,很多公司之前停滞了很久的升级问题都解决了

实际上如果是架构合理,有完整的测试环境,自动化测试工具,只是架构升级实际上是非常快捷的事情,当然这也是技术主管需要考虑的问题,在一开始选择合适的技术栈,docker,部署工具和自动化测试工具,文档,一个好的舒适的技术环境,反而容易推动升级.

我之前在一家公司上班的时候,一直使用老版本的php,不愿意升级,理由嘛总是没时间,没空,容易出问题,然后当我离职前,就升级到了7,最后所谓的容易出问题并没有发生.

流程与安全

实际上,通常情况下按照标准的流程走下去都不容易产生漏洞和问题,但是一旦偏离流程就容易捅娄子,一般一个需求,才能够讨论需求,到技术讨论实现,到开发,测试,安全扫描,部署,一系列流程走下来确实会时间,但是通常情况下问题也会被发现和解决.反而是紧急需求,临时上限,不走流程,往往会捅出篓子,我认为应该有的解决方法,

  • 紧急需求
  • 紧急讨论
  • 开发
  • 测试并上线

这时候不应该结束,应该在补充之前缺失的环节,比如在研究和讨论之前的上线的逻辑是否有漏洞,是否需要补充说明文档,自动化测试的代码可以再新版本补全.就算是新版本上线了,也不应该忽视他.

常用模块的开发

一个字,抄,我个人认为参考别家的产品的逻辑是非常有用的,比如在我没看<白帽子谈web安全> 最后一章节运营安全之前,我是不知道登陆会有这么多门门道道,只是有一个粗浅的猜测,

比如可以在登录的应用中检测暴力破解的尝试。检查一个账户在一段时间内的登录失败次数,或者检测某一个IP地址在一段时间内的登录行为次数。这些行为都是比较明显的暴力破解特征。暴力破解往往还借助了脚本或者扫描器,那么在检测到此类行为后,向特定客户端返回一个验证码,也可以有效地缓解暴力破解攻击。

实际上看完之后,我发现我们之前开发的登陆逻辑因为抄的某大厂和某竞品,也就没有大的安全问题.当然还有不完善的地方,比如登陆日志系统和检测系统,这个确实是有必要补全.

总之,重要的核心流程,抄是没有问题的,别人大厂和公用产品往往久经考验和设计一般不会有大的疏漏,当然在抄的时候也要考虑到别人为什么这样设计,只有这样才能提高自己

之前经常踩到的坑的审视

  • 经常使用的sql注入漏洞,尤其是自己拼接类型的sql代码,这个是注入的极有可能出现问题的地方.
  • 避免使用常用端口这个事情非常容易搞事和攻击的地方
  • 端口开放问题,这个不用说了,阿里云现在很方便开发了
  • 文件上传,之前有过直接上传到本地服务器的丑事,不过那是年轻不懂事弄着玩.还没有开发的概念,现在想来肯定不能这么干,隐患太大了.首先是现在通用的oss服务器上传图片,其次就就算是文件处理的需求也要放到使用临时目录,最好限制是文件和上传用户的权限
  • 远程调用命令,这个算是大坑了,之前开发的某个模块要使用linux的命令,现在想起来真的是超级危险,感觉当时就应该考虑用好好开会讨论换一套解决方案,或者用其他的流程处理
  • 错误暴露,这个之前遇到过,不过也是在测试环境暴露,实际上正式环境一般不会允许暴露错误代码,要在nginx那一层拦截掉错误显示