java安全性编程
java的安全性编程其实也是略带了点防御性编程的意思在里面,其实java作为一门编程语言,相对C,c++,本身算比较安全的,跟C,C++这种偏底层的编程语言比,java少了显示的指针调用,少了程序上的内存释放,回收,这些统统都交给了JVM,而且在内存分配的也做了一些检测,诸如越界检测ArrayIndexOutOf,还有空指针保存NullPointerException,这一切的不同使得java的使用也变得相对简单许多,在语言自身上避免了很多不安全的可能出现。但是尽管java在编程上是安全的,但是这并不意味着程序员们可以随意的写代码了。之前某组织的一份报告表明,在最近的近千个漏洞中,有64%的漏洞都是由于编写的程序引起的。程序员假设对自己的编程习惯不够重视的,必然会为此付出代价。本篇文章我想聊聊的是在安全方面,可能会出现的几个安全漏洞,在这里我说的更多的是针对的java平台的语言,但我相信同样适用于任何一种其他语言,安全性问题都是普通存在,相同的嘛。
1.错位的信任。一个软件系统可以分为多个子系统,每个子系统有各自的访问模块,可以这么说每个子模块都有自己的受信域,但是他们自身是不能给自己赋予自己受信级别的,应该是由程序的部署者来确定,所以在这里我们说,划分好每个模块的受信域,并且保证保证每个子模块在自己的模块活动。一个好的安全设计模式其实应该是非信任解耦以及权限分离的结合。
2.注入攻击,这个太常见了,平时说的最多的恐怕就是sql注入攻击了,当组件或系统在接受外部数据源的时候,有些数据可以是恶意的数据,如果此时不加以验证处理,就会导入注入攻击。这里我们倡导的做法是(1)验证,比如说各种数值的验证,是否在给定的要求范围内(2).净化,这指的是避免敏感数据的暴露,可以通过删除特殊字符,或进行转码的形式。(3).最后是标准化和归一化。将输入的形式转化为最简单的形式,这其实是一种有损装换的过程。经历了以上过程,不要以为就可以万事无忧了,当接受到复杂的指令字符串时,当在这些字符串中存在的一个特殊字符,比如"delete , insert"等会触发动作的关键词,也必须进行处理,否则,还是会出现安全漏洞。下面是一些对此状况的解决方案:
(1).操作系统的命令解释器
(2).具体SQL兼容接口的数据库
(3).XML解释器
(4).XPath评估器
(5).基于轻量级的目录访问协议的目录服务,俗称LDAP
(6).脚本引擎
(7).正则表达式(regex)编译器
有些我们听过。有些,确实我也没有听过。
3.敏感数据泄露。敏感数据指的范围很广,我们常说的用户信息,当然就是敏感数据了,还有号码,银行账号,更别说更加机密的各种密钥了。所以在数据传输的过程中,我们一般减少对敏感数据的传输,但是真的需要此数据交互的时候,也要对这些数据进行过滤处理,在传送给非信任的组件。来张演示图:
在java里是如何做出这样操作呢,在java中,我们是通过类,接口,成员实现访问控制的。类和类成员给予尽可能低的访问权限。接口也尽量开放之允许公开访问的方法。
4.效能泄露。首先解释一下什么叫效能,效能指的是在授权中可以进行沟通而不会忘记的标识。每个java对象都有不会被遗忘的标识,所以我们自然可以联系到这些对象的引用其实就是就是这些对象的标示,也就是效能。对于那些会执行敏感操作的对象的引用来说,他们只允许他们的持有者执行这些操作的效能,就是对象引用,所以引用自身必须保证效能不能泄露给非受信代码。
5.拒绝服务。俗称dos攻击。现在还有了ddos,分布式拒绝攻击了。拒绝攻击的原因很简单,就是有些恶意程序霸占着系统不放,导致正常的程序得不到资源,最终导致系统瘫痪。资源就被无故耗尽。在<<java安全编码规范>>一书中提到了一些dos攻击的例子:
(1).请求一个大的矢量图片,如SVG文件或字体文件
(2)."ZIP"炸弹,那些经过zip,gzip压缩过的HTML文件,会因为解压而消耗巨大的资源
(3).“XML解析炸弹”,解析XML文档的时候,如果结点很多,将会迅速号费很多的内存空间
(4).过度使用磁盘空间
(5).在一个散列表中插入了多个密钥,而这些密钥的使用相同的散列码,这样会导致最差的性能O(n*n),而不是平均性能O(n)
(6).发起许多连接,服务器为每个连接分配大量的资源例如泛洪攻击。
6.最低权限原则。这点在上面提到一些方法里都或多或少的已经有所体现。java灵活的安全模型赋予应用更多的权限,这可以通过自定义安全策略来完成。特权操作应该只提供给那些最少的需要特权的代码。java的AccessController机制允许只有需要的代码可以获得权限的提升,当一个类需要改变他的权限时,可以调用AccessController的doPriviliged()方法,获得临时的特权,但是还是尽可能的少出现doPriviliged()方法,从而避免出现安全漏洞。
7.安全管理器。这里说的安全管理器,指的是java中的SecurityManager,在使用java API的时候,当出现执行违反安全策略的操作时,系统都会报出SecurityException的错误。我们在使用java编写程序的时候,使用的是系统默认的SecurityManager,当是当我们队安全的要求比较高的时候,我们鼓励更多的去实现一个自定义的安全管理器,在代码中经常想到会使用AcsessController,帮助我们去限制或获取一些特权的代码。
以上就是我对于java安全性编程的一些看法,最终还是得看个人,说的再多,如果不去做的话,还是没用,还是希望能够有更多的程序员一起加入到安全性编程的队伍中去,提高自己的编码水平。