从事网络安全行业的一些经验分享

伴随着网络的发展,尤其是移动互联网的发展,网络服务与个人生活的联系越来越紧密。办理金融业务,生活费,获取信息等。,已经全部从线下转移到线上。一个新的时代必然到来或者已经到来,那就是万物互联的时代。与此同时,网络安全事件频繁发生,安全事件的危害也越来越大。互联网从业者需要越来越重视安全问题。在这里,我想和刚接触网络安全的开发者分享一些经验。


第一,什么是“安全”。


对于没有接触过安全的开发人员来说,一个常见的问题是:如何编写安全的代码或者制作安全的系统。为了找到答案,我们必须理解安全的定义。“安全”是一个很宽泛的概念,所以这里给出了一个很宽泛的定义:被保护对象没有被破坏、篡改、泄露,系统功能能够正常运行。你是不是糊涂了?“安全”定义中的关键问题是:需要保护的对象是什么,需要保护什么;没有明确的安全需求,就谈不上安全。比如常见的安全问题包括通信协议是否安全,数据存储是否安全等等;另外,运行环境是否安全,代码是否安全。因此,在我们想编写安全代码或实现安全系统之前,我们可以问问自己,我想保护什么。不同的安全要求,需要制定的安全保护方法也不同。如果你不知道你想要什么,你就不会得到它。


理解了安全的定义,接下来的问题是:如何知道实施的安全措施是否足够安全。安全防御和安全攻击是一个动态的博弈过程。就像抗生素和细菌一样,防御和攻击的技术也在不断升级。所以我们说没有绝对的安全,安全是成本问题。通常我们需要找到的是如何以最低的成本满足我们的安全需求的最佳实践。


二、如何从“安全”入手


孙子云“知己知彼,百战不殆”,所以看一些黑客如何攻防的书籍是个不错的选择。这些书的内容可能涉及到一些计算机的基础知识,所以这些知识也是必不可少的,否则我们只能知道而不知道为什么。黑客攻击与防御的介绍会引出计算机系统、网络、计算机体系结构、编译原理、虚拟机等一些基础知识。


黑客如何攻防是理论基础。有了理论基础,我们就能看到这个现实世界存在哪些流行的安全问题。CWE是一个常见的缺陷,其中列举了许多常见的安全缺陷。我们可以从25个最受欢迎的问题开始,这可以帮助我们在编码时避免许多安全问题。如果开发的系统是Web系统,OWASP就是一个不容错过的数据库。OWASP包含常见的Web问题和最佳实践,所以你可以找出OWASP十个最流行的问题。例如,两个列表中都提到了有几十年历史的常见问题——SQL注入。


接下来,我们可以看看行业中更好的安全实践。SEICERTCODE是一种安全编码标准,它将C、Java等语言中常见的安全问题分成几个类别,解释这些安全问题,并提供给我们一些非安全代码样本和安全代码样本。该规范是帮助我们快速理解安全问题和实践安全编码的良好起点。


3.“安全”问题的宏观分类


安全问题种类繁多,令人眼花缭乱。这些安全问题有共性吗?答案是肯定的。我们试图将安全问题分为以下几大类。


1.不受信任的输入和输出。

站在墙上,无欲则刚;如果系统不与不可信环境交互,那么系统的安全问题相对较小。大多数系统,尤其是网络系统,需要与不受信任的环境进行交互。在交互过程中,需要特别注意两个问题:输入是否合法,输出数据是否包含敏感信息。

输入数据包括但不限于用户输入的参数、传入文件、读取环境变量、相关运行时库等。如果用户输入的数据超出了程序处理的范围,可能会造成意想不到的结果。对于这些不可信的数据,我们通常可以限制输入范围,只接受我们能处理的输入。比如网站注册时对密码符号有一些限制,就是这个解决方案;我们还可以清理输入数据,删除不支持的内容。对于输出数据,我们需要注意输出内容是否包含敏感信息,如程序路径、用户名、密码、IP地址等。如果我们泄露服务器的用户名和密码,服务器上的所有信息都会被暴露。这就需要我们在程序发布前仔细检查输出。


2.程序本身有错误。


如果程序本身有错误,就会给攻击者机会;一旦程序触发了错误的逻辑,程序就可能偏离正常的运行过程,比如运行攻击者提供的程序。对于C语言,常见的程序错误包括空指针引用、内存未释放、内存释放多次、数组引用越界、返回堆栈地址、整数溢出等。这要求代码编写人员提高代码编写质量,尽量减少程序错误。就Java语言而言,C语言没有类似的内存管理问题,但也存在整数溢出、数组引用越界、引用空对象等问题。此外,Java语言还存在一些特有的问题,如运行时库函数调用不正确、类型定义错误、序列化和反序列化错误等。


3.其他错误问题。

我们将其他安全问题分为不同的类别,包括但不限于以下内容:业务设计错误:读取用户信息不需要认证。不安全的通信协议:例如,使用不安全的加密和哈希算法。被调用的库是不安全的:例如,WebServer有安全漏洞。

分享: