有 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%. ...
随机推荐
- C++命令行画心形<转载>
#include <stdio.h> int main() { for (float y = 1.5f; y > -1.5f; y -= 0.1f) { for (float x = ...
- 如何优雅的调戏XSS
作者:i春秋作家——万年死宅 前言 这篇paper,我们将学习如何优雅的调戏XSS.我们会教大家一些不常用的,但很实用的XSS姿势.我们在正式进入主题之前,先来说一下,该篇paper将涉及的内容: 正 ...
- express 重新加载
1,res.location() 2. res.redirect() location()与redirect()的比较: Express的response对象,是对Node.js原生对象ServerR ...
- php curl 伪造IP来源的实例代码
来源:http://www.jb51.net/article/31694.htm curl 它不但可以模仿用户登录,还可以模仿用户IP地址哦,为伪造IP来源,本实例仅供参考哦 //伪造ip ; $i ...
- JS: RegExp(正则表达式)
RegExp (包含ES2018新特性) 注意:本次所有代码都仅在Chrome 70中进行测试 正则表达式是什么? 正则表达式是用于匹配字符串中字符组合的模式.(mdn) 简单来说,正则表达式是用来提 ...
- 【bzoj4259】 残缺的字符串 FFT
又是一道FFT套路题 思路可以参考bzoj4503,题解 我们对串S和串T中出现的*处全部赋值为0. 反正最终的差异度式子大概就是 $C[i]=\sum_{j=0}^{|T|-1}S[i+j]T[j] ...
- 从您的帐户中删除 App 及 iTunes Connect 开发人员帮助
iTunes Connect 开发人员帮助 从您的帐户中删除 App 删除您不想继续销售或提供下载,且不会再重新使用其名称的 App.如果您的 App 至少有一个获准的版本,且最新版本处于下列状态之一 ...
- AsyncTask的前世今生
先看下Java Threading Framework的类图: Callable与Runnable类似,差别在Callable具有返回值,共同点是两个都是执行体,一般都抽象为任务处理. ...
- 修改WAMPServer(Apache+PHP+MySQL一键式安装)中mysql默认空密码
Note:在EclipsePHP中配置WorkSpace时,将工作目录指到执行PHP代码的www目录下 ,便于在Eclipse下编写PHP项目 eg:D:\KelvinSoftwar ...
- java android中日期时间 问题总结
Date 类型: Date date = new Date(); // 代表获取当前系统日期和时间 System.out.println(date); 使用类的方法设置时间和日期:(通过该方法初始 ...