编程技巧
全世界的技术安全威胁正在逐渐增加。 在以前,仅仅是个人信用卡号被盗之前,如今似乎几乎每天都有另一个严重违规的故事,其中披露了数百万条财务记录,例如最近的Experian发现。
编写安全代码并非易事。 为了近似防弹代码,管理人员,审计人员,工程师和架构师会想象代码的每个方面都可能出错的一切。 尽管无法预测黑客会抛出的每条不良曲线,但您必须尽一切努力减少攻击面,密封漏洞并防止潜在漏洞的后果。
在本文中,我将解释产生高度安全代码的10个主要技巧。
1)严格测试输入
攻击者需要一条进入您机器的路径,最简单的路径是通过自己的代码打开的门。 如果您的程序已连接到Internet,则有人会尝试通过这些门偷偷摸摸地经过您的东西。
懒惰的C程序员创建的缓冲区溢出就是一个容易进入软件的途径的好例子,懒惰的C程序员将接受任何字符串,直到该字符串达到最后一个字符的正式C符号零为止。
很久以前,攻击者发现他们可以任意记录数据包,并在内存和编程堆栈上进行写操作,直到他们从未发送该终止零为止。 例如,一个程序正在等待用户输入他的名字。 黑客无需输入名称,而是会编写一个超出堆栈大小的可执行命令。 如果他们对所写的内容很聪明,他们可以重写任何东西并承担控制权。
解决方案是永远不要在Internet的另一端信任该人—测试传入数据的结构和大小。 即使是不易受到缓冲区溢出攻击的环境,也必须进行测试,因为过大的输入可能会导致拒绝服务或其他各种操作问题。
数据传输语言(例如JSON和XML)无法检查数据以防止出现这些问题,因此检查是程序员必须采取的措施来保护其代码。
2)仅存储您需要的东西
在询问客户的蜗牛邮件地址之前,请问自己是否要通过邮局向他们发送一封亲身信,如果电子邮件足以用于通信,则不要存储公司或家庭住址。 额外的信息会占用磁盘空间,花费时间来处理,并成为黑客的目标。
程序员经常会像强迫性的ho积工具一样思考,存储有朝一日可能被使用的可能性最小的任何东西。 当您必须调试软件时,这种本能可能会有所帮助,但它也会留下一连串的数据供任何人查找。
数据库中的每个表和列都是必需的吗? 有疑问时,使数据库表更小,表格更短。 尝试简化一切。 客户将享受更少的时间来填写表格。
3)避免仅依靠密码
接受危险的简单密码的程序是另一个问题 。 程序员已经意识到了这个问题,但却无法找到为用户提供简单灵活的解决方案的解决方案。
一种解决方案是实施N因素身份验证,以在用户登录时抛弃他们的方式中的几个不同障碍。一个示例是向用户的电话发送带有随机数的文本消息,并要求他们键入数字以及密码。 除非用户所在区域没有手机覆盖或手机电池耗尽,否则这是一个很好的解决方案。
一些程序使事情更进一步,并且需要管理加密密钥的特殊硬件。 这些令牌通常很容易丢失,并且比电话贵。
这些类型的额外步骤或硬件不是完美的解决方案,但是它们比仅依赖密码要好得多,即使该密码在技术上具有标点符号,数字以及大小写字母的正确组合。
4)谈判要求
当开发人员在考虑项目需求时,他们必须考虑这些需求如何为日后的安全问题打开大门。 与项目经理进行讨论的正确时机是在开发开始时,您可以协商这些需求。
例如,请求的功能可能看起来很可爱,但是它会驱使您保留额外的敏感信息并提高整个程序所需的安全级别吗? 光滑的功能值得所有这些其他头痛吗?
当客户不满意您已承诺的功能时,或者需求文档仍然灵活时,那么正是时候开始保护代码以防止将来的违规行为。 开发人员必须在发现潜在安全问题时告知管理人员,并告知他们需要添加哪些类型的功能。
5)添加延迟到您的代码
许多攻击都依赖于利用漫游器无休止地反复输入信息,并使用多个查询使程序不堪重负。 有些机器人会抓取数据库,假装是用户,而其他机器人则会尝试多个潜在的密码,直到找到正确的密码为止。
为了混淆这些机器人,诀窍是增加延迟并在登录过程中逐渐增加该延迟。 在许多情况下,您不希望自己的软件高效或快速。 您希望它足够快以帮助合适的人,但是对于正在攻击的机器人来说却太慢了,无法取得很大的成就。
尝试输入每个错误的密码后,某些登录程序会使延迟加倍。 其他数据库限制了来自每个IP地址的查询数量。 某些系统故意发送电子邮件请求以减慢该过程。 一切都出于安全的考虑-人们不会观察到额外的一两秒钟,但是机器人将无聊到无效的地步。
6)使用您认为应该使用的更多加密
加密常常没有得到充分利用,因为它增加了该过程的另一步骤,并使调试更加困难。 在系统中发现错误可能很难。 当数据是一堆神秘的数字时,难度就更大了。
如果您作为开发人员无法理解,那么对于黑客来说也是一样。
所有流行的软件应用程序和主要操作系统都为您提供了加密设备上的文件夹或文件的选项。 使用此选项时,需要选择一个密码,以使您可以解锁和解密这些文件。
锁定存储个人数据的数据库可免去您担心数据库,底层操作系统以及可能在系统下运行的管理程序的麻烦
7)筑墙
对易用性的需求大于对增加安全性的需求。 人们不喜欢登录到不同的系统组件,但是将所有程序和系统连接到一个门户中可能会很危险。 一个薄弱的环节可能会损害一切。
尽管许多用户可能只需要单击一下就可以遍历系统并实现他们想要的功能,但对于授权用户而言,它越简单,对于潜入其中的攻击者而言,它就越简单。
将高度敏感的操作划分到一个单独的系统中是有意义的,用户在要使用这些功能时必须再次登录。
即使给用户带来了不便,您也应该在登录阶段和高度敏感的操作之间建立更多的隔离墙,以提供更高的总体安全性。
8)使用经过良好测试的库
加密确实很难很好地执行,即使最精心构建的代码也可能存在后门和漏洞。 避免这些潜在问题的一种方法是从经过良好测试的库中提取加密代码。
重塑经过良好测试的库通常是一个错误,但是对于加密而言,问题甚至更大。 如果您发明了自己的加密算法,则可能会在代码中引入漏洞,黑客可以利用这些漏洞。 最好使用现有库中经过测试的代码。 这些过程已经表明它们可以通过安全测试。
9)利用内部API
每个人在职业生涯的早期都学到的一个教训是将您的代码分解为模块,并通过精心设计的内部应用程序编程接口(API)进行通信。 API使程序易于相互通信和共享数据。
由于软件渗透到每个行业和产品,因此API现在成为主流。 公司根据个别项目要求开发和部署API,但总的来说,存在三种类型的API:无服务器和无代码,受管和自管。
在安全性方面 ,API使查找漏洞,修复问题和审核交互变得容易。 通常,分析部分而不是整体要容易一些,因此创建内部子模块有助于分析代码的安全性。 可以分别检查模块,然后可以合并结果以进行总体安全性审查。
API还提供了另一层安全性,因为它充当了访问数据库和服务器的通道。 只有具有API密钥的用户才能对程序进行读写访问。
10)让外部审核员对您的代码进行评论
虽然我们每个人都可以使用编辑器,但您的组织还应该投资代码审核。 这些外部审核可以识别安全漏洞(以及代码中的其他问题)并建议如何改进代码。
通常,具有更多发现安全问题经验的外部审核员将能够以更加严格和透彻的眼光审视您的代码,以寻找您和您的团队可能看不到的问题。 另外,作为局外人,他们可能会打破关系并消除内部冲突,因为它们的好处是不隶属于内部派系。
切记:安全第一
安全是至关重要的,程序员需要从一开始就考虑将其构建到其程序中。
这10个技巧是一个起点。 程序员必须不断地学习最新的安全实践。 您应该通过阅读当前出版物,参加课程或跟随博学的专家来掌握最新信息。
Internet上还有许多书籍和其他有价值的信息资源,它们解释了如何生成高度安全的代码。
在构建代码时,将安全性分配给代码可能需要采取额外的步骤,但是从长远来看,安全起来总比后悔好。
翻译自: https://www.javacodegeeks.com/2017/10/10-major-tips-safe-programming.html
编程技巧