安全性是软件开发中最复杂,最广泛和最重要的考量之一。Java是具有许多内置安全性功能的开发平台,java在长期的发展过程中,已经经过了很多高强度的安全测试,并经常更新安全漏洞。并且Java生态系统还包括用于分析和报告安全性问题的各种工具。

但是,即使有了可靠的开发平台,也同样要保持警惕。应用程序开发是一项复杂的工作,漏洞会隐藏起来不易发现。程序员应该在应用程序开发的每个阶段都考虑安全性,从类级别的代码编程到API端点授权都应该被考虑在内。

以下为大家介绍的基本规则,可以为构建更安全的Java应用程序奠定良好的基础。供参考学习!

Java安全规则1:编写简单而强大的Java代码

漏洞喜欢隐藏在复杂代码中,因此在不牺牲功能的情况下使代码尽可能简单。在代码中公开尽可能少的信息,隐藏实施细节,支持可维护和安全的代码。下面三个技巧将大大有助于编写安全的Java代码:

  • 充分利用 Java的访问修饰符。为类,方法及其属性声明访问级别,可以设为private的所有内容都应该为private。
  • 避免过度使用反射和内省。在某些情况下,应该使用这种高级技术,但是在大多数情况下,您应该避免使用它们。使用反射消除了强类型化,可能会给代码引入漏洞和不稳定性。将类名与字符串进行比较容易出错,并且很容易导致名称空间冲突。
  • 始终定义尽可能小的API和接口。解耦组件并使它们在尽可能小的区域内交互。即使您的应用程序的某个区域出现漏洞,其他区域也将是安全的。

Java安全规则2:避免使用Java自带的序列化

序列化接受远程输入,并将其转换为完全赋值的对象。它省去了构造函数和访问修饰符,并允许未知数据流成为JVM中的运行代码。Java序列化从根本上来说是不安全的。

Oracle就有长期计划 从Java中删除自带的序列化功能,甲骨文公司Java平台小组的首席架构师Mark Reinhold说,Java漏洞中的三分之一或更多都涉及到序列化的问题。

尽可能避免在Java代码中使用自带的序列化/反序列化。可以考虑使用JSON或YAML之类的序列化格式,并且永远不要公开接收并作用于序列化流的不受保护的网络请求端点。

Java安全规则3:永远不要公开未加密的凭证或PII

很多的应用,当用户在浏览器中输入密码时,密码将以纯文本格式发送到您的服务器。正确的做法是:先通过单向密码对密码进行加密,然后再将其持久保存到数据库中,然后在每次与该值进行比较时再次进行加密保存。

密码规则适用于所有个人身份信息(PII):信用卡,社会保险号等。委托给您应用程序的任何个人信息都应得到最高程度的保护。

数据库中未加密的凭据或PII是一个巨大的安全漏洞,正在等待攻击者发现。同样,切勿将原始凭据写入日志,或以其他方式传输到文件或网络。密码与密钥分开保存。

Java安全规则4:使用已知和经过测试的库

尽可能使用已知的可靠库和框架。从密码哈希到REST API授权,都要谨慎的选择第三方库。对于web应用程序安全性,Spring Security已经是事实上的标准。它提供了广泛的选择和灵活性,以适应任何应用程序体系结构,并且融合了多种安全方法。

Java安全规则5:不要对外部输入抱有幻想

无论是来自用户输入表单,数据存储区还是远程API,对于任何外部输入都不要放松警惕。

SQL注入和跨站点脚本(XSS)是由于处理外部输入错误而引起的最常见攻击。每当您收到输入时,都应该对其进行检查和校验。

Java安全规则6:始终使用PreparedStatement来处理SQL参数

每当您构建一条SQL语句时,都有可能被插入一段可执行的SQL代码。始终使用java.sql.PreparedStatement类创建SQL是一个好习惯。对于NoSQL存储(如MongoDB)也存在类似的功能。绝大部分的ORM框架,都支持该功能。

Java安全规则7:不要向用户展示服务异常信息

生产中的服务异常信息可以为攻击者提供丰富的信息来源。堆栈跟踪尤其可以揭示有关您正在使用的技术及其使用方式的信息。避免向最终用户显示堆栈跟踪信息,这非常重要。

Java安全规则8:使安全性发布保持最新

通过定期检查Oracle主页以获取security-alerts确保知道可用的重要补丁程序 。每个季度,Oracle都会为Java的当前LTS(长期支持)版本提供一个自动补丁更新。问题是,只有在您购买Java支持许可证的情况下,该补丁才可用。

Java安全规则9:查找依赖库漏洞

有许多工具可以自动扫描您的代码库和依赖项是否存在漏洞。OWASP(开放式Web应用程序安全性项目)是致力于改善代码安全性的组织。OWASP的值得信赖的高质量自动代码扫描工具列表 ,包括多个面向Java的安全检查工具。

Java安全规则10:监视和记录用户活动

如果您没有积极地监视应用程序运行状态,那么即使是简单的暴力攻击也可能会成功攻陷你的app。使用监视和日志记录工具来监视应用程序的运行状况。监视可以提醒您注意到无法被解释的峰值,而日志记录可以帮助您了解攻击后出了什么问题。

Java安全规则11:当心DoS攻击

每当要执行消耗资源的的操作(例如将压缩文件解压缩)时,都应该监视资源使用量的增长。对其进行监视,并防止服务器资源过度使用,以及更多的自动化的应急响应方案。

Java安全规则12:考虑使用Java安全管理器

Java有一个安全管理器,可用于限制正在运行的进程可以访问的资源。它可以根据磁盘,内存,网络和JVM访问来隔离程序。缩小对应用程序的这些资源的过度占用,可以减少攻击可能造成的危害。

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

有效提高java编程安全性的12条黄金法则的更多相关文章

  1. [译]在Linux上的提高MySQL/MariaDB安全性的12条建议

    MySQL 是世界上最流行的开源数据库系统,而MariaDB(MySQL的一个分支)是世界上发展最快的开源数据库系统.安装MySQL服务器之后,它的默认配置是不安全的,保护它是一般数据库管理中的基本任 ...

  2. Java编程的逻辑 (12) - 函数调用的基本原理

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  3. 提高java编程质量 - (一)易变业务使用脚本语言编写

    脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...

  4. 提高java编程质量 - (四)i++ 和 ++i 探究原理

    先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...

  5. 提高java编程质量 - (二)取余用偶判断,不要用奇判断

    取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...

  6. java编程如何实现多条2017-01-16 22:28:11.0这样的时间数据,转换成Date类型Mon Jan 16 22:28:11 CST 2017这样的时间数据

    不多说,直接上干货! package zhouls.bigdata.DataFeatureSelection.sim; import java.text.ParseException; import ...

  7. java编程如何实现多条2017-08-08 22:10:00.0这样的时间数据,相差多少天?(隔24小时为相差1天,否则为0天)

    不多说,直接上干货! 这是yyyy-MM-dd HH:mm:ss.S     GetIntervalDays.java package zhouls.bigdata.DataFeatureSelect ...

  8. 提高java编程质量 - (五)switch语句break不能忘以及default不同位置的用法

    先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...

  9. 提高java编程质量 - (三)三目运算符的两个操作数类型尽量一致

    先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...

随机推荐

  1. Android中的SharedPreferences存储

    一.前言 不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的.也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把 ...

  2. mysql大表在不停机的情况下增加字段该怎么处理

    MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明. 1. 环境准备 数据库版本: 5.7.25-28(Percona 分 ...

  3. 从零开始手把手教你使用原生JS+CSS3实现幸运水果机游戏

    项目体验地址 免费视频教程 游戏介绍 幸运水果机是一款街机游戏,游戏界面由24个方格拼接成一个正方形,每个方格中都有一个不同的水果图形,方格下都有一个小灯.玩家使用游戏币选择希望押注的目标,按下开始后 ...

  4. 容器中的Java堆大小调整:快速,轻松

    在上一篇博客中,我们已经看到Java进行了改进,可以根据正在运行的环境(即物理机或容器(码头工人))识别内存.java的最初问题是,它无法弄清楚它是否在容器中运行,并且它曾经为容器运行所在的整个硬件捕 ...

  5. 拿来即用:用C+JS结构来处理JSON数据

    [面对的问题] 在物联网产品的开发过程中,对JSON格式的数据处理是一个强需求,例如亚马逊的 AWS IOT平台,设备与后台之间的通讯数据都是JSON格式,先瞄一眼大概的样子: 这是一个真实产品的通讯 ...

  6. 【论文笔记】Pyramidal Convolution: Rethinking Convolutional Neural Networks for Visual Recognition

    地址:https://arxiv.org/pdf/2006.11538.pdf github:https://github.com/iduta/pyconv 目前的卷积神经网络普遍使用3×3的卷积神经 ...

  7. CentOS 7 下安装 MySQL 8.0

    前言 本篇文章主要介绍在 CentOS 7 环境下安装 MySQL 8.0. 正文 1. 配置yum源 首先在 https://dev.mysql.com/downloads/repo/yum/ 找到 ...

  8. Swoole 绑定域名 80 端口 (Nginx 反向代理)

    启动 Swoole 的 http server,可以使用 IP + 端口 进行访问 创建 Nginx 虚拟域名 vim swotp.liuguofeng.com.conf server { liste ...

  9. python检测“无内容”图片

    思路1:通过图像熵检测,“无内容”图像熵较小,可通过设置阈值检测“无内容”图像,计算图像熵可参考:https://www.cnblogs.com/niulang/p/12195152.html 思路2 ...

  10. Python实用笔记 (17)模块

    一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块. 现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲 ...