漏洞喜欢隐藏在复杂性中,因此在不牺牲功能的情况下使代码尽可能简单。使用成熟的设计原则(例如DRY)(不要重复),将帮助您编写更易于查看问题的代码。
始终在代码中公开尽可能少的信息。隐藏实施细节支持可维护和安全的代码。这三个技巧将大大有助于编写安全的Java代码:
- 充分利用Java的访问修饰符。知道如何为类,方法及其属性声明不同的访问级别将大大保护代码。可以设为私有的所有内容都应该为私有的。
- 避免反射。在某些情况下,应该使用这种高级技术,但是在大多数情况下,您应该避免使用它们。使用反射消除了强类型,而强类型可能会给您的代码带来弱点和不稳定性。将类名与字符串进行比较很容易出错,并且很容易导致名称空间冲突。
- 始终定义尽可能小的API和界面。解耦组件并使它们在尽可能小的区域内交互。即使应用程序的某个区域感染了漏洞,其他区域也将是安全的。
Java安全性规则2:避免序列化
这是另一个编码技巧,但重要的是要成为一个规则。 序列化接受远程输入,并将其转换为完全赋值的对象。 它省去了构造函数和访问修饰符,并允许未知数据流成为JVM中的运行代码。 结果,Java序列化在本质上是不安全的。
尽可能避免在Java代码中进行序列化/反序列化。 相反,请考虑使用JSON或YAML之类的序列化格式。 永远不要公开接收并作用于序列化流的不受保护的网络端点。
Java安全规则#3:永远不要公开未加密的凭证
很难相信,但是这种可避免的错误会导致年复一年的痛苦。
当用户在浏览器中输入密码时,密码将以纯文本格式发送到服务器。那应该是它最后一次出现。我们必须先通过单向密码对密码进行加密,然后再将其持久保存到数据库中,然后在每次与该值进行比较时再次进行加密。
密码规则适用于所有个人身份信息:信用卡,社会保险号等。委托给应用程序的任何个人信息都应得到最高程度的保护。
数据库中未加密的凭据是一个巨大的安全漏洞,正在等待攻击者发现。同样,切勿将原始凭据写入日志,或以其他方式传输到文件或网络。要为我们的密码系统创建一个加盐的哈希并务必进行研究并使用推荐的哈希算法。
跳至规则4:始终使用库进行加密;不要自己动手。
Java安全规则4:使用已知和经过测试的库
尽可能使用已知的可靠库和框架。从密码哈希到REST API授权,这适用于整个范围。
幸运的是,Java及其生态系统对此提供了很好的支持。对于应用程序安全性,Spring Security是事实上的标准。它提供了广泛的选择范围和灵活性,以适应任何应用程序体系结构,并且融合了多种安全方法。
解决安全性的第一个本能应该是进行研究,研究最佳实践。例如,如果要使用JSON Web令牌来管理身份验证和授权,查看封装JWT的Java库,然后学习如何将其集成到Spring Security中。
Java安全性规则5:对外部输入抱有偏执
无论是来自用户输入表单,数据存储区还是远程API,都不要信任外部输入。
SQL注入和跨站点脚本(XSS)只是最常见的攻击,可能是由于错误处理外部输入而导致的。一个不为人所知的例子(其中很多例子)是“billion laughs attack(一种 denial-of-service(DoS)攻击,它主要作用于XML文档解析器。它也被称为指数实体扩展攻击,是一种名副其实的XML炸弹。该攻击通过创建一系列递归的XML定义,在内存中产生上十亿的特定字符串,从而导致DoS攻击。原理为:构造恶意的XML实体文件以耗尽服务器可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,上亿的特定字符串占用内存达到GB级,使得解析器解析非常慢,并使得可用资源耗尽,从而造成拒绝服务攻击。)”,通过这种攻击,XML实体扩展会导致拒绝服务攻击。
每当收到输入时,都应进行完整性检查和消毒。对于可能呈现给另一个工具或系统进行处理的任何事物尤其如此。例如,如果某些事情可能会成为OS命令行的参数,必须小心!
一个特殊的众所周知的实例是SQL注入,它将在下一条规则中介绍。
Java安全规则#6:始终使用准备好的语句来处理SQL参数
每当构建一条SQL语句时,都有可能插值一段可执行代码。
知道了这一点,最好始终使用java.sql.PreparedStatement类来创建SQL。对于NoSQL存储(如MongoDB)也存在类似的功能。如果您使用的是ORM层,则实现将在后台使用PreparedStatements。
Java安全规则#7:不要通过错误消息来揭示实现
生产中的错误消息可以为攻击者提供丰富的信息来源。堆栈跟踪尤其可以揭示有关您正在使用的技术及其使用方式的信息。避免向最终用户显示堆栈跟踪。
登录失败警报也属于此类别。通常接受的错误消息应为“登录失败”与“未找到该用户”或“密码错误”。为潜在的恶意用户提供尽可能少的帮助。
理想情况下,错误消息不应显示您应用程序的基础技术堆栈。保持该信息尽可能不透明。
Java安全性规则#8:使安全性发布保持最新
我们需要经常检查安全更新并将其应用到JRE和JDK。
定期检查Oracle主页上的安全警报,以确保知道可用的重要补丁程序。每个季度,Oracle都会为Java的当前LTS(长期支持)版本提供一个自动补丁更新。问题是,只有在购买Java支持许可证的情况下,该补丁才可用。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
[外链图片转存中…(img-eu8vTeiO-1710420916915)]文章来源:https://www.toymoban.com/news/detail-851081.html
本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录文章来源地址https://www.toymoban.com/news/detail-851081.html
到了这里,关于开发安全Java应用程序的13条规则((Mark)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!