保护你的代码:给开发者的17个安全提示

严格的输入测试、密码、加密——安全性是任何程序员都不能忽视的特性

费德里科•卡普托

保护你的代码:给开发者的17个安全提示

网上的恐怖故事是变得更糟。首先是一些信用卡号码被盗。现在,数以百万计的财务记录被安全漏洞暴露,我们对威胁变得麻木。

编写安全代码在形成第一个循环之前就已经开始了——这不是一项简单的任务。即使是近似防弹代码,架构师、工程师、审计员和管理人员也必须尝试想象代码的每个方面可能出现的所有问题。虽然不可能预测攻击者将抛出的每一个讨厌的曲线,但您必须尽您所能减少攻击面,堵塞漏洞,并防止潜在漏洞的影响。

这里有17个提示可以生成更安全的代码。

马克西姆Kabakou

安全编程技巧1:严格测试输入

攻击者需要进入您的计算机的路径,而最简单的路径是通过代码打开的门。如果你的软件从互联网上获取信息,有人会试图偷偷地从你身边溜走。

解决方案是测试传入数据的大小和结构,信任互联网另一端的人。

通常,程序员希望提供更多的灵活性和更少的强制。对软件来说,检查每一个数据都是很耗时间的,对程序员来说也是很累人的。像XML和JSON这样的数据传输语言并不能确保数据避免这些问题。但是检查是程序员需要做的来保护他们的代码。

安全编程技巧2:存储你需要的东西,不要多存一分

在你询问客户的邮寄地址之前,问问自己是否会通过邮局给他们寄一封信。如果电子邮件就足够了,你可能需要重新考虑存储家庭或企业地址。这些信息需要时间来处理,占用磁盘空间,并且成为了信息窃贼的目标。

程序员们经常像强迫性的囤积者一样思考,把任何有可能在将来有用的东西都存起来。这种本能可能有助于调试软件,但它会留下可供任何人查找的数据踪迹。

数据库中的每个列和表都是绝对必要的吗?当有疑问时,使表单更短,数据库表更小。避免成为“数据包狂”的诱惑。

安全编程技巧3:避免过于信任密码

每个人都知道密码的问题,但没有人知道更好的解决办法。一些公司已经在使用N-factor身份验证的过程中克服了几个不同的障碍。通过锁定加密密钥的特殊硬件,可以增加更多的安全性。不过,它们很贵,甚至比手机更容易丢失。其他网站记录你登录时使用的IP地址。如果你的地址不明,他们会给你发一封礼貌的邮件,以防万一。

这些选择都不是完美的,但它们比仅仅依靠密码要好。重要的一步是认识到字符串的限制,而不管字符串的长度和组合如何。

安全编程技巧4:协商需求

构建安全代码不仅仅是在代码编辑器中发生的事情。当管理人员起草需求并与开发人员讨论它们时,每个人都应该认真考虑每个需求如何打开通向未来问题的大门。

一个特性可能很可爱,但它是否会迫使您保留额外的敏感信息,并提高各地所需的安全级别?一个光滑的特性值得为此付出额外的麻烦吗?保护您的代码不受未来破坏的正确时机是在需求文档仍然灵活且客户没有垂涎于您向他们承诺的特性时。

安全编程技巧5:在代码中添加延迟

许多攻击依靠蛮力。这可能需要几万亿次的迭代,但电脑不在乎。一些机器人通过发送数以百万计的查询来抓取数据库。另一些人则尝试数万亿个密码,直到找到正确的密码。

诀窍是逐步增加更多的延迟来迷惑这些机器人。您希望您的软件足够快,以支持正确的人,但太慢,攻击机器人完成太多。

有些登录程序会因为每个不正确的密码而将延迟加倍。一些数据库限制来自每个IP地址的查询数量。一些系统故意发送电子邮件请求,以降低你的速度。人类不会注意到额外的一两秒钟,但机器人会无聊到效率低下的地步。

安全编程技巧6:使用加密比你认为你应该使用的更多

加密常常没有得到充分利用,因为它给机器增加了又一个步骤,使调试变得更加困难。在一个系统中发现错误是很困难的;当数据是一堆难以理解的数字时,这就更困难了。

但是你无法理解的东西对攻击者也是无法理解的。在将个人数据存储到数据库之前将其锁定,这样您就不用担心数据库、底层操作系统以及某种程度上可能在底层运行的管理程序。

适当的加密量不需要减少功能。我在我的书中研究了很多不同的例子半透明的数据库这样既能提供有用的服务,又能保护个人信息。另外,额外的保护本身就是一个特点。

安全编程技巧7:建立围墙

安全性常常与易用性的要求相竞争。人们讨厌登录到系统的不同部分,但将所有内容链接到一个门户可能是危险的。没有简单的方法来决定用户导航系统并通过点击完成他们想要的操作有多容易。对合法用户越容易,对攻击者就越容易。

将最敏感的操作隔离到一个单独的系统中,并要求用户在使用该系统时再次登录,这样做是有意义的。银行可以让门户能够检查状态和存钱,但是在取款之前需要更多的身份验证。

安全编程技巧8:测试过的库——使用它们

加密很难做好,即使是最好的理论和精心构建的代码也可能有漏洞和后门。重新创建一个经过良好测试的库通常是错误的,但对于加密来说问题更大。在这个领域中,经过良好测试的库比其他的更重要。在这里选择更好的代码,不要发明自己的算法。

安全编程技巧9:使用内部api

将代码分解成模块,并通过设计良好的api执行通信,这是每个人在职业生涯早期都学过的老道理。它对于安全性甚至更有价值,因为api可以使审计交互、发现漏洞和修复问题变得更简单。模块可以单独检查,结果可以组合起来。

创建内部子模块通常也是有意义的;同样的思想也适用于模块内部。部分比整体更容易分析。

安全编程技巧10:引入外部审核员对你的代码进行批评

我们每个人都可以使用编辑器。如果企业投资于构建良好的安装基础,那么它也应该投资于代码审计。它们可以识别缺陷并生成改进代码的建议。

一般来说,更多的眼球查看代码可以发现可能发生的问题。外部人士还可以打破内部政治僵局,打破联系。他们通常不知道比内部人士更多的东西,但他们的优势是不属于内部派系。

安全编程技巧11:代码分析器是你的朋友

尽管代码分析器远不完美,也不像人类那么聪明,但它是值得的。毕竟,他们很勤奋,不会累,不会渴,不会饿,也不会无聊。

代码分析器FindBugs来自马里兰大学的工具可以找出我们不思考时所犯的常见错误。这些错误中有许多与安全性无关,但有一些可能是致命的。

安全编程技巧12:限制特权

开发人员喜欢提前考虑,给用户提供他们可能需要的所有访问权限是为未来做计划的一种简单方法。虽然让门开着有助于处理未来的杂务,并避免给用户和工作人员设置障碍,但正如第一个提示中提到的,开着的门经常是第一个被滥用的途径。一个好的原则是给代码和用户最少的权限完成工作。

如果这变成了一个令人头疼的管理问题,产生了太多对额外特权的请求,那么重新考虑数据的体系结构可能是有意义的。你保留的信息太多了吗?如果人们需要更多的访问渠道,而你却不愿意提供,那么你可能储存了太多的信息。

安全编程技巧13:模拟你的威胁

你有信用卡号码吗?那么一个普通的小偷可能是想要你的信息。你会用手机追踪人们的位置吗?危险变得更加可怕。

花点时间想想谁想要你的数据是一个有用的前兆。如果您能想象到威胁,那么您就可以在设计和实现系统时记住攻击者。它们提供了一个要避免的反用例。

重要的是要认识到没有一个列表或模型是完美的。仅仅因为威胁不是想象出来的,并不意味着你不必担心它。这只是个开始。

安全编程技巧14:信任是双向的

你很容易怀疑那些登录你网站的人,但是记住他们也应该怀疑你。你真的是银行,持有他们的钱,还是一个钓鱼网站,试图窃取他们所有的东西?

一些网站正在投资向客户证明自己。他们要求客户上传一些照片或一组文字,网站可以用来证明他们是他们所说的人。这可以让每个人都更安全。

安全编程技巧15:随时了解最新的威胁

紧跟行业潮流是绝对必要的,而《信息世界》只是报道悲剧性错误的出版物之一。好的文章可以告诉你别人做错了什么,给你一个机会像一个未经授权的小偷一样思考。

了解过去发生的事情是开始为将来可能遇到的类似攻击者(类似的攻击者也阅读相同的文章并以更恶意的方式思考它们)进行规划的好方法。一旦有了想法,你必须注意,否则攻击者会抢在你的前面。

安全编程技巧16:深入研究会有回报

每日出版是如何不踩深粪肥的第一稿。在研究人员有时间思考问题出在哪里之后,阅读他们所写的书籍和期刊文章会得到更好的教训。这些通常包括好的规则和方法来避免将来出现问题。

花些时间和金钱在书本上,通常是一种从高薪顾问那里获得知识的极其廉价的方式。一本书200或300美元的价格可能贵得离谱,但当咨询师还收取每小时500美元的费用,并坚持最少要读20小时时,情况就不一样了。

安全编程技巧17:自学

你可以注册一所当地的大学,或者在网上尝试新的免费课程。这些都是学习信息的不同方式,而这些信息往往还没有被提炼出来并以书本的形式呈现出来。教授们通常关注学术会议上的最新出版物,其中可能包括大量的脚注和指示。即使你已经知道了很多信息,旁听课程也能帮助你跟上最新的发现和出版物。

版权©2013Raybet2