编写安全代码的提示

安全和数据保护正成为越来越受欢迎的话题。 我们正进入一个世界,在这个世界中,计算机系统传输/使用/处理的信息过多,任何信息泄漏都可能造成很大的麻烦。 因此,对于应用程序而言,尽可能保护客户信息并且不允许其传播非常重要。

应用程序安全性涉及很多方面,涵盖了流程,体系结构,基础结构,代码等。整个主题非常庞大且用途广泛,并且编写了一些书籍来涵盖所有可能的方面。 我将只涉及与开发人员职责相关的一小部分代码和应用程​​序体系结构。 另外,我假设读者主要在Java或类似平台上实现的Web应用程序上工作。

我不同意创建安全代码是一项艰苦的工作。 我想说的只是一些知识和纪律问题。 这是开发人员必须遵循的几条准则,以涵盖大多数应用程序安全漏洞。 当然,清单并不完整,仅涵盖了对客户数据的保护。

一律散列使用者密码
您能做的最坏的事情是不要哈希用户密码,然后将其存储为明文。 不好的事情是对它们进行编码,但这仍然很顽皮。 您不需要知道客户的密码,就可以更好地入睡。 我无法想象应用程序必须能够访问用户密码的情况,但是可以轻松想象如果有人能够访问这种宝藏会发生什么。 因此,必须对用户密码进行哈希处理,最好使用加盐哈希和良好的哈希函数(如SHA-2) 。 并且始终对网站保持怀疑态度,这些网站能够通过邮件向您发送密码。

始终加密敏感数据
如果应用程序使用敏感数据(例如,用于连接到旧版后端系统的密码或信用卡号)运行,则该密码不得采用明文形式,并且必须进行加密。 大多数数据必须仅在存储中进行加密,而有些还需要在运行时进行加密。 有人可以访问您的内存转储的可能性很小,这种机会确实很少,但是对于非常关键的数据,则不应忽略。

当然,必须使用正确的密码进行加密, AES应该可以。 唯一的问题是,对某些东西进行加密需要拥有一个秘密,而这个秘密必须是未加密的,如果攻击者将其解密,则整个系统将受到损害。 因此,必须例如通过HSM来适当地保护该秘密,或者至少必须在OS级别上使用适当的权限对其进行保护。

记录中
日志记录中不得包含与用户相关的信息或任何其他类型的敏感信息。 例如信用卡详细信息,银行详细信息,个人消息等。使用包含敏感信息的类的“ toString”实现时要格外小心。 始终牢记,原木可能掉入他人的肮脏手中。

始终使用强密码和哈希
如果可以轻易地破坏哈希或密码,则毫无意义。 因此,应用程序必须使用最佳可用集。 开发人员必须记住的另一件事是,即使最好的事情在明天也将变成垃圾。 这意味着它必须是将来更改算法的一种方法。 例如,哈希密码的开头可能带有算法名称前缀,因此,一旦有新算法可用,就可以使用它。 这是此类哈希的示例:

{SHA-1}:pOtmGeFyIsThHT6LfNE846FJAWxjmLiR

当然,旧密码将保持不变,但是总比没有好。 相似的原理适用于加密值,只是区别在于可以恢复并重新加密加密值。

目前(05.2010)可以接受的算法选择是SHA-2(用于散列)和AES(用于对称加密)。 非对称算法的选择不多, RSA是最著名且使用最广泛的示例。 除了算法外,还需要考虑哈希/密钥大小–越大,安全性越好。

使用准备好的陈述
那只是必须的。 始终使用PreparedStatement或等效语句,并且永远不要通过串联可能是SQL注入问题的原因的参数来构建SQL语句。 让数据库驱动程序考虑该问题。

向用户隐藏实施细节
无论您的用户是谁,都可以是其他系统或真实用户,您必须尽可能少地告诉他们有关系统的信息。 这些知识可以帮助攻击者识别您使用的产品或提供一些有关系统构建方式的信息。 所有这些都可以使您知道如何对应用程序进行黑客攻击。 例如,某些网站上发生的将异常堆栈跟踪打印到浏览器窗口中,几乎提供了有关库,二手产品,体系结构等的所有信息。

验证用户输入
任何来自外部的东西都必须经过验证。 任何值都必须具有边界。 最方便的存档方法是使用正则表达式。 这样可以防止XSS和相关问题。

屏蔽输出
不要信任任何东西,您自己的系统也不例外。 在将任何数据输出给客户之前,必须屏蔽掉所有无效字符。 同样,它可以成为XSS和相关攻击的基础。

验证后重新创建会话
会话ID可能已在会话固定攻击中被破坏或使用。 因此,在身份验证后使用相同的会话ID将向攻击者开放系统,因此必须重新生成它。

使用授权
您应该明确授权在每一层上使用; 否则,应用中的Kong将有太多空间。 这对于Web应用程序特别重要,因为Web应用程序有时所有授权都仅基于URL原则,这是危险的做法。

使用审核
如果有人会攻击您的系统并且您没有任何跟踪,这将很有趣。 因此,开发人员必须具有某种日志来记录系统执行的活动。 该日志不应与用于调试和故障排除的日志混淆,后者包含调试信息,可帮助开发人员查找和修复错误(尽管它们也可以包含相关信息,并且也可以用于跟踪攻击者的操作)。 另一方面,审核日志包含在执行某些活动(例如登录尝试,付款等)时引发的事件。

最后,我要提醒您的是,列表还不完整,您可以做更多的事情来保护您的应用程序。 对于那些对使应用程序更安全感兴趣的人,我建议以下链接:

  • PCI DSS 。 这更多是关于付款和保护卡详细信息,但是请不要忘记卡详细信息只是另一条信息。
  • Wikipedia应用程序安全性页面 。 有很多很好的链接供进一步阅读。
  • OWASP网站 。 通常,有关漏洞,如何避免漏洞以及Web应用程序安全性的许多信息。

参考:Stas的博客上 ,有关从我们的JCG合作伙伴 Stanislav Kobylansky 编写安全代码的一些提示

相关文章 :


翻译自: https://www.javacodegeeks.com/2012/01/hints-for-writing-secure-code.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值