百度|开发安全Java应用程序的几大规则

百度|开发安全Java应用程序的几大规则

文章图片


安全性是软件开发中最复杂、最广泛、最重要的方面之一 。 软件安全性也经常被忽视 , 或者在开发周期结束时被过分简化为仅仅几个小的调整 。 Java是一个具有许多内置安全特性的长期开发平台 。 Java安全包经过了密集的战斗测试 , 并经常更新新的安全漏洞 , java生态系统还包括一系列用于分析和报告安全问题的工具 。
下面的基本规则为构建更安全的java应用程序提供了良好的基础 。
规则1:编写干净、强大的Java代码
漏洞喜欢隐藏在复杂性中 , 因此在不牺牲功能的情况下尽可能使代码简单 。 使用DRY(不要重复)等经验证的设计原则将帮助你编写更容易检查问题的代码 。
始终在代码中公开尽可能少的信息 。 隐藏实现细节支持既可维护又安全的代码 。
规则2:避免序列化
序列化接收远程输入并将其转换为完全赋予的对象 。 它省去了构造函数和访问修饰符 , 并允许未知数据流成为JVM中的运行代码 。 因此 , Java序列化本质上是非常不安全的 。
尽可能避免Java代码中的序列化/反序列化 。 相反 , 考虑使用JSON或YAML等序列化格式 。 永远不要公开接收序列化流并对其进行操作的未受保护的网络端点 。 这只不过是一个受欢迎的混乱垫子 。

规则3:永远不要公开未加密的凭据或PII
当用户在浏览器中输入密码时 , 密码将以明文形式发送到服务器 。 在将密码持久化到数据库之前 , 必须通过单向密码对密码进行加密 , 然后在与该值进行比较时再次进行加密 。
密码规则适用于所有个人识别信息(PII):信用卡、社会安全号码等 。 委托给你的应用程序的任何个人信息都应受到最高级别的关注 。
数据库中未加密的凭据或PII是一个巨大的安全漏洞 , 等待攻击者发现 。 同样 , 切勿将原始凭证写入日志 , 或以其他方式传输到文件或网络 。 相反 , 为你的密码创建一个盐度散列 。 请务必进行研究并使用推荐的散列算法 。
规则4:使用已知和已测试的库
尽可能使用已知、可靠的库和框架 。 这适用于从密码散列到RESTAPI授权的所有领域 。 Spring安全性是事实上的标准 。 它提供了广泛的选项和灵活性 , 以适应任何应用程序架构 , 并结合了一系列安全方法 。
处理安全问题的第一反应应该是做研究 。 研究最佳实践 , 然后研究哪个库将为你实施这些实践 。 即使使用可靠的工具 , 也很容易搞错授权和身份验证 。 确保动作缓慢 , 并仔细检查你所做的一切 。
规则5:考虑使用java安全管理器Java有一个安全管理器 , 可以用来限制正在运行的进程可以访问的资源 。 它可以在磁盘、内存、网络和JVM访问方面隔离程序 。 缩小应用程序的这些要求可以减少攻击可能造成的伤害 。 这种隔离也会带来不便 , 这就是为什么默认情况下不启用SecurityManager的原因 。
你必须自己决定 , 围绕SecurityManager的强烈意见工作是否值得为你的应用程序提供额外的保护层 。 有关Java安全管理器的语法和功能的更多信息 , 请参阅Oracle文档 。

规则6:监视和记录用户活动
如果不主动监视应用程序 , 即使是简单的暴力攻击也可能成功 。 使用监控和日志工具关注应用程序运行状况 。
如果你想确信为什么监视很重要 , 只需坐下来观察应用程序侦听端口上的TCP数据包 。 你将看到各种各样的活动 , 远远超过简单的用户交互 。 其中一些活动将是机器人和恶棍扫描漏洞 。