云时代架构--阅读笔记03
安全意识十原则(一)
我是软件工程的学生,精力主要集中在业务开发中、功能实现中,较少的注意软件的安全意识,在校的我们所做的项目还比较小型,如果针对工作后,公司项目的业务实现,我们只是简单做一下扫描和渗透,很少在在代码和逻辑层面做深入的分析,这样一旦出错,会发生比较严重的后果,所以安全还是要做好,首先我们必须一点一滴的建立起必要的安全意识。
下面是作者根据自身经验总结的偏产品技术的安全意识十原则:
- 安全问题是木桶效应
整个系统的安全程度取决于木桶最短的那块板。黑客往往喜欢找边缘化的子站点或非核心逻辑进行攻破,这些模块或站点往往是由初级程序员打造,有的甚至还不是主站统一的技术架构,总体上会防备薄弱。黑客能够攻破任意站点进去到内网,就有种种可能。针对这点,我们需要做的是对于安全的排查,需要全面覆盖,除非子站在部署上用户体系上彻底隔离。
2、开发层面:不要信任客户端的任何东西
对于HTTP协议,不管是头里面的东西(来源、客户端类型、Cookie)还是正文里面的东西,任何数据都是可以伪造的。我们往往会觉得Get的东西暴露在浏览器地址上,里面的参数不安全,Post过来的数据因为不暴露就安全,然后会信任Cookie中的数据做一些权限控制,会用头里面的一些数据做一些安全性控制。我们需要从根子里面有这个意识所有客户端的东西可以用但不能不经过判断直接相信。例如:登录后的UserID应该是保存在服务端的,我们根据SessionID在服务端获得的,我们需要全面排查代码,不允许在Controller的方法里存在类似于用户ID这样的字段。
3、开发层面:数据就是数据代码就是代码。
对于客户端过来的任何信息应该都只是数据,应该很少会让客户端来告诉服务端执行的代码。第一客户端过来的数据需要让它当成数据来处理,不管是Encoding一下也好,SQL参数化(Mybatis的$和#问题)也好都是这个方面的措施(从前到后一路数据都以数据的身份在程序中流转),第二从数据库里出来的东西也只能是数据不能让它变为HTML或JS代码,也需要Encoding一次再在客户端上呈现。我们应该从根源上去让数据只可能成为数据。
4、开发层面:用户看不到不等于黑客看不到
随着前后端的分离,现在很多请求都是AJAX请求,AJAX请求会有几方面的安全疏漏:
①逻辑分散而明确。(方法名称的易理解性)
②容易觉得AJAX请求是前端程序发起的而忽略权限问题
③服务端返回了过多的数据,这是比较危险的事情,因为有一些内部的字段会返回出去。
④服务端返回的数据列对应了数据库实际的列,相当于暴露了表结构,对于以后各种API的尝试和注入极端危险。
⑤一些敏感的数据也直接返回给客户端了,虽然客户端不会展现出来,但是对于黑客来说根本不在于用户看得到看不到这些数据。
这就要求我们在做设计的时候尽可能仔细审视AJAX的接口的权限、数据开放性和脱敏等问题。
原文章: https://mp.weixin.qq.com/s/gd-XqGGh08o-vWFZSR0RJg?tdsourcetag=s_pctim_aiomsg