有 a - b < c 对Java安全性的思考
软件工程中,不论使用哪种开发语言,安全性一直是一个非常棘手却又重要的问题。安全性是软件开发领域永远的主题之一,而且随着互联网的蜂拥发展而带动的新技术的兴起与革命(比如近几年火起来的node.js,python,go等,甚至微软也开源后的.net Core),软件工程中的安全性更加的凸显与重要了。
那么,什么才是危险的呢?我的第一反应是注入攻击,比如SQL注入攻击。一个典型的场景是WEB应用中,用户登陆功能,根据用户输入的用户名密码获取相应的数据,那么SQL注入就应运而生,模拟用户名,密码加入特殊字符,加入恶意脚本等等手段,进而造成不了可挽回的后果。比如,正常脚本当如:
select * from userInfo where username='input_Name' and password='input_Pwd or'
那么,如果是这样的呢?
select * from userInfo where username='input_Name' and password='input_Pwdte' or 1=1 or ''
关于如何编写安全的Java代码,Sun官方给了一份指南,有兴趣的同学可以参考这篇文章,大致为:
• 静态字段
• 缩小作用域
• 公共方法和字段
• 保护包
• equals方法
• 如果可能使对象不可改变
• 不要返回指向包含敏感数据的内部数组的引用
• 不要直接存储用户提供的数组
• 序列化
• 原生函数
• 清除敏感信息
比如,DoS是一种常见的网络攻击,有人戏称为“洪水攻击”。其惯用手法是通过某种手段,比如大量的机器发送请求,将目标网站宽带和其资源耗尽,导致用户无法正常访问,甚至服务器的宕机。
而对于此类问题,如果单从服务器级别考虑,多少欠缺,我们或许需要考虑程序级别的攻击,比如Java,JVM,以及涉及到的线程方面的安全,应用程序的瑕疵等进行低成本的DoS攻击。
而在面试中,我们都会被问到安全性的问题,却大多比较多泛泛,大而广,而大多数的安全性问题都与代码安全性有关。我们回顾下Java代码的运行过程:
首先编译器把.java文件编程成.class字节码文件,然后由类加载器负责把.class文件加载到JVM,再由字节码校验进行校验,然后由Java解释器负责把该类文件解释为机器码执行。
在类加载器加载.class文件到java虚拟机的过程中,类加载器通过区分本机文件系统的类和网络系统导入的类增加安全性(不允许网络上的应用程序修改本地的数据),本机的类先被加载,一旦所有的类加载完,执行文件的内存划分就固定了,然后字节码校验器开始校验.class字节码文件,字节码校验器不检查那些可信任的编译器所产生的类文件。通过之后,java解释器材负责把类文件解释成为机器码进行执行。
// a b c 都是int类型的数值
if (a - b < c) {
// …
}
这段看似简单,没毛病的代码会引发下列问题:
如果b<0,而造成的数据溢出,你能想象出多少问题?!而对于越界的处理虽然Java底层给出了很好的解决,但是数值而造成内存问题不容小觑。
当然,过多的考虑安全性问题,势必会造成应用程序的冗余甚至疲软,这些需要视情况而定,而不可盖棺而论。
再比如,对于一段可能出现问题的代码,常用手段 try … catch(){… },那么问题来了,catch的是什么?而一般情况下,我们程序需要抓取到catch,因为要做日志处理,那么日志中不可或缺的有类似代码位置,方法名,以及错误原因等,甚至包含了敏感信息。当然,不可避免,我的建议是,尽量使用内部标识的异常信息,而返回给客户端的类似异常消息尽量少的自动返回的异常消息。
对于安全标准特别高的系统,甚至可能要求敏感信息被使用后,要立即明确再内存中销毁,以免被探测到;或者避免在发生core dump时,意外暴露。
开发和测试阶段
1. 尽量的规范化代码,可参考《阿里巴巴开发手册》
2. 尽量多的code review,避免不必要尴尬代码出现
3. 在代码check-in等环节,利用hook机制去调用规则检查工具,保证不合规范代码进入OpenJDK代码库
部署阶段
可参考JDK在加密方法的路线图
以上皆为日常开发总结,也借鉴网上大神的文章,略略整理一二,权作学习使用,当然面试能帮到不慎感动了,以后有机会再做梳理。
欢迎指点。
有 a - b < c 对Java安全性的思考的更多相关文章
- Java 8 CompletableFuture思考
Java 8 CompletableFuture思考 最近一直在用响应式编程写Java代码,用的框架大概上有WebFlux(Spring).R2dbc.Akka...一些响应式的框架. 全都是Java ...
- java安全性语言
java通过所谓的沙箱安全模型保证了其安全性,以下我们就来看看java提供的安全沙箱机制. 组成沙箱的基本组件例如以下: 1.类装载器结构: 2.class文件检验器: 3.内置于java虚拟机(及语 ...
- java安全性-引用-分层-解耦
Java不支持指针, 一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用 "特洛伊"木马等欺骗手段访问对象的私有成员 访问一个对象必须通过这个对象的引用 java ...
- 用 JAAS 和 JSSE 实现 Java 安全性
JAAS 和 JSSE 概述 JAAS 提供了一种灵活的.说明性的机制,用于对用户进行认证并验证他们访问安全资源的能力.JSSE 定义了通过安全套接字层(SSL)进行安全 Web 通信的一种全 Jav ...
- java安全性的一种简单思路
关于接口安全性的考虑.这客户端在调用接口时,将acId授权码以加密的方式(可逆加密方式)传递过来, 服务端这边接收后进行解密,然后在服务器端这边的授权名单中进行匹配,判断该授权码是否被授权,从而判断第 ...
- 关于Java 项目的思考总结
Java 项目思考总结 前言 今天是2017年3月25日,笔者已经毕业半年,工作经验一年. 正好有心思写这个总结. 持续开发 对于Java项目,我所接触的一般就是JavaWeb项目和 Java Jar ...
- Java框架的思考
目前的JAVA 企业级开发框架,我们常用的大致包括IOC AOP MVC ORM框架 1. IOC spring是一个非常棒的ico容器,其思想非常简单,用一个集合对象如MAP 来缓存对象(对象都是单 ...
- 关于java对象的思考
不可变对象和类 由不可变类创建的对象就是不可变对象,要使一个类成为不可变的,它必须满足下面的需求: 所有数据域都是私有的 没有修改器方法 没有一个访问器的方法,它会返回一个指向可变数据域的引用 看下面 ...
- 对 Kotlin 与 Java 编程语言的思考
从长远来看,排名前10的也基本上是Java.C.C++.Python.C#.VB.PHP.JavaScript.至于Kotlin的排名,11月份在编程语言仅排41名,Ratings仅有0.216%. ...
随机推荐
- JavaScript ES6 核心功能一览(转)
原文地址:Overview of JavaScript ES6 features (a.k.a ECMAScript 6 and ES2015+) 原文作者:Adrian Mejia 译文出自:掘金翻 ...
- 完整的REM布局的工作流程与规范
rem从去年的手淘双11开始火起来之后一直就想去使用,但是苦于学习途径有限,工作任务也比较繁忙导致一度延后. 那么现在对相关知识的学习与初步的项目实践之后,在这里记录一下使用rem解决各屏幕适配问题. ...
- java.util包详解
介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结 ...
- 3. Decision Tree
1. 算法流程 一般的,一颗决策树包含一个根结点.若干内部结点和若干叶结点:叶节点对应于决策结果,其他每个结点则对应于一个属性测试结果:每个结点包含的样本集合根据属性测试的结果被划分到子结点中:根结点 ...
- GDAL VS2010 win7(64位)安装、使用说明(图文解析)
一.电脑配置及安装版本 Win 7(64位机) Visual Studio 2010 GDAL 1.9.2(我也尝试了最新版GDAL1.11.0,应该同样可以用的,只是在重新配置时又选用了老一点的版本 ...
- windows本地调试安装hadoop(idea) : ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
1,本地安装hadoop https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ 下载hadoop对应版本 (我本意是想下载hadoop ...
- 使用fiddler抓手机包遇到问题
1,http://blog.csdn.net/roland_sun/article/details/30078353 2,参照上面不周,不能实现用自己ip:8888端口下载出证书 解决办法,先从fid ...
- 【优化】Filddler用于移动端
Fiddler是一个非常强大的Web调试工具,它能捕获所有客户端和服务器的http和https请求,我们可以对请求监视.设置断点,也能修改输入输出数据,这些特性使得Fiddler成为广大web开发者的 ...
- Android4.0 Launcher 源码分析3——WorkSpace结构(滑动)
3.WorkSpace结构(滑动) 桌面的左右滑动功能主要是在PagedView类中实现的,而WorkSpace是PagedView类的子类,所以会继承PagedView中的方法.当我们的手指点击Wo ...
- 《垃圾回收的算法与实现》——增量式垃圾回收与RC Immix算法
增量式垃圾回收 为了控制最大暂停时间,通过逐渐推进垃圾回收即垃圾回收与mutator交替执行. 三色标记算法 以标记-清除算法为例使用三色标记算法. 利用降低吞吐量来缩短最大停顿时间. 基础 将GC中 ...